Гобелен - кликните для возврата на главную
Не прошло и месяца а Фурмановская ЦРБ в очередной раз попала в историю. На этот раз сотрудница клеветала на пациентов, а именно огласку получил случай когда сотрудница назвала пациента алкашём.
Ровно 3 года назад произошло событие, которое подарило жителям планеты Змеля новый чистый праздник 6 апреля - в этот замечательный день земля забрала гнить негодяя и СПАМера Владимира Вольфовича Жириновского.
Как бы не обстояли дела в области культуры и IT-технологий, Самосвал писал статьи на связанные темы и планирует ещё написать.
На очередном конкурсе танцев, школьница отлично выступила.
Вот та самая информация: программа для продвижения канала YouTube, эта информация выложена уже несколько лет, при этом просмотров не много, а метод который описан в данном видео действительно помогает продвигать видео в YouTube.
Начал разбираться с информацией которая находится в HTTPS клиентском запросе рукопожатия.
Обратите внимание! Объект изображённый на гобилене может отличаться от общепринятого вида описанного объекта. Тут дело в том что художник видит именно так!
// StringUtils.h
#ifndef STRINGUTILS_H
#define STRINGUTILS_H
#include <System.hpp> // Для AnsiString
class StringUtils {
public:
// Простая функция реверса строки
static AnsiString ReverseString(const AnsiString& str) {
AnsiString result;
for (int i = str.Length(); i >= 1; i--) {
result += str[i];
}
return result;
}
// Пример STDMETHOD (имитация COM-интерфейса)
// struct IStringOperations : public IUnknown {//Обратите внимание эти 3 строки закомментированы, они не требуются для реализации задачи - проверено работает без них
// virtual STDMETHODIMP Reverse(BSTR input, BSTR* output) = 0;
// };
};
#endif
#include <vcl.h>
#include "StringUtils.h"
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonReverseClick(TObject *Sender)
{
// 1. Простой вызов функции
AnsiString original = EditInput->Text;
AnsiString reversed = StringUtils::ReverseString(original);
MemoOutput->Lines->Add("Результат: " + reversed);
// 2. Пример с STDMETHOD (имитация COM)
BSTR input = WideString(original).Copy();
BSTR output = NULL; // Исправлено: NULL вместо nullptr
// Создаем "псевдо-COM" объект
class TStringOp : public StringUtils::IStringOperations {
public:
STDMETHODIMP QueryInterface(const IID&, void**) { return E_NOTIMPL; }
STDMETHODIMP_(ULONG) AddRef() { return 1; }
STDMETHODIMP_(ULONG) Release() { return 1; }
STDMETHODIMP Reverse(BSTR input, BSTR* output) {
if (!output) return E_POINTER; // Проверка указателя
AnsiString str(input);
*output = WideString(StringUtils::ReverseString(str)).Copy();
return S_OK;
}
} op;
if (SUCCEEDED(op.Reverse(input, &output))) {
MemoOutput->Lines->Add("COM-версия: " + AnsiString(output));
SysFreeString(output);
}
SysFreeString(input);
}
Я хотя и несколько знаком с C++(а так же нормально знаком с другими языками, например PHP) тем не менее я лишь примерно понимаю что происходит в class TMyCustomObject. Позже я предлагаю более детально разобрать каждую строчку этого класса, то-есть что делает каждая функция в нём. При этом приведите для начала простой пример как используется STDMETHOD в подключаемых h файлах на более простом примере. Предлагаю взять пустой проект и к примеру разместить на нём поле ввода. пусть в подключаемом файле выполняется метод по разворачиванию текста наоборот (пример "абвгд" станет "дгвба") и далее пусть этот результат добавляется к полю ввода новой строкой. Запуск процедуры пусть производится по нажатию кнопки. Если приведённый мной вариант примера не информативный для изучения рассматриваемого вопроса, предложите другой вариант.
Отличный подход к изучению! Давайте создадим максимально простой, но информативный пример. Я предлагаю сделать проект с:
File → New → Application
Разместите на форме:
// StringUtils.h
#ifndef STRINGUTILS_H
#define STRINGUTILS_H
#include <System.hpp> // Для AnsiString
class StringUtils {
public:
// Простая функция реверса строки
static AnsiString ReverseString(const AnsiString& str) {
AnsiString result;
for (int i = str.Length(); i >= 1; i--) {
result += str[i];
}
return result;
}
// Пример STDMETHOD (имитация COM-интерфейса)
struct IStringOperations : public IUnknown {
virtual STDMETHODIMP Reverse(BSTR input, BSTR* output) = 0;
};
};
#endif
// Unit1.cpp
#include "StringUtils.h"
// Обработчик кнопки
void __fastcall TForm1::ButtonReverseClick(TObject *Sender)
{
// 1. Простой вызов функции
AnsiString original = EditInput->Text;
AnsiString reversed = StringUtils::ReverseString(original);
MemoOutput->Lines->Add("Результат: " + reversed);
// 2. Пример с STDMETHOD (имитация COM)
BSTR input = SysAllocString(original.c_str());
BSTR output;
// Создаем "псевдо-COM" объект
class TStringOp : public StringUtils::IStringOperations {
STDMETHODIMP QueryInterface(const IID&, void**) { return E_NOTIMPL; }
STDMETHODIMP_(ULONG) AddRef() { return 1; }
STDMETHODIMP_(ULONG) Release() { return 1; }
STDMETHODIMP Reverse(BSTR input, BSTR* output) {
AnsiString str(input);
*output = SysAllocString(StringUtils::ReverseString(str).c_str());
return S_OK;
}
} op;
if (SUCCEEDED(op.Reverse(input, &output))) {
MemoOutput->Lines->Add("COM-версия: " + AnsiString(output));
SysFreeString(output);
}
SysFreeString(input);
}
Простая функция (ReverseString):
static AnsiString ReverseString(const AnsiString& str) {
AnsiString result;
for (int i = str.Length(); i >= 1; i--) {
result += str[i]; // Конкатенация символов в обратном порядке
}
return result;
}
STDMETHOD в COM-интерфейсе:
struct IStringOperations : public IUnknown {
// STDMETHODIMP - макрос для объявления методов COM
virtual STDMETHODIMP Reverse(BSTR input, BSTR* output) = 0;
};
STDMETHODIMP Reverse(BSTR input, BSTR* output) {
// 1. Конвертируем BSTR в AnsiString
AnsiString str(input);
// 2. Вызываем нашу функцию реверса
AnsiString reversed = StringUtils::ReverseString(str);
// 3. Возвращаем результат как BSTR
*output = SysAllocString(reversed.c_str());
return S_OK; // Успешное выполнение
}
Элемент | Описание |
STDMETHODIMP | Определяет метод как часть COM-интерфейса (возвращает HRESULT) |
QueryInterface | Позволяет запрашивать интерфейсы (в примере не реализован) |
AddRef/Release | Управление подсчетом ссылок (упрощенно) |
BSTR | Строковый тип, используемый в COM (WideString) |
SysAllocString | Выделение памяти для BSTR |
SysFreeString | Освобождение памяти BSTR |
SUCCEEDED | Проверка успешности HRESULT |
при нажатии кнопки:
Если хотите совсем просто - можно ограничиться только функцией:
// StringUtils.h
namespace StringUtils {
AnsiString ReverseString(const AnsiString& str);
}
// Unit1.cpp
void __fastcall TForm1::ButtonReverseClick(TObject *Sender)
{
MemoOutput->Lines->Add(
StringUtils::ReverseString(EditInput->Text)
);
}
Этот пример специально сделан максимально простым, но показывает:
Вы так же можете прочитать следующие статьи: