Пример реализации метода класса в заголовочном файле .h и его вызов в том числе с использованием COM объектов в Borland C++Builder 6

Гобелен - кликните для возврата на главную

Не прошло и месяца а Фурмановская ЦРБ в очередной раз попала в историю. На этот раз сотрудница клеветала на пациентов, а именно огласку получил случай когда сотрудница назвала пациента алкашём.

Так почему бы не начать использовать обход блокировки YouTube при том что техническая возможность используя расширение nikolaevevge для браузера Mozilla Firefox уже появилась, а объем полезной(и не очень) информации на видеохостинге YouTube, по мнению некоторых диванных экспертов, меньше не стал.

Ровно 3 года назад произошло событие, которое подарило жителям планеты Змеля новый чистый праздник 6 апреля - в этот замечательный день земля забрала гнить негодяя и СПАМера Владимира Вольфовича Жириновского.

Как бы не обстояли дела в области культуры и IT-технологий, Самосвал писал статьи на связанные темы и планирует ещё написать.

На очередном конкурсе танцев, школьница отлично выступила.

Что использовать вместо Юбуст

Вот та самая информация: программа для продвижения канала YouTube, эта информация выложена уже несколько лет, при этом просмотров не много, а метод который описан в данном видео действительно помогает продвигать видео в YouTube.

Начал разбираться с информацией которая находится в HTTPS клиентском запросе рукопожатия.

Обратите внимание! Объект изображённый на гобилене может отличаться от общепринятого вида описанного объекта. Тут дело в том что художник видит именно так!

104 549 руб.

Описание товара

Сначала приведена исправленная от ошибок версия

C++
    
// 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
      

  
C++
    
#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 файлах на более простом примере. Предлагаю взять пустой проект и к примеру разместить на нём поле ввода. пусть в подключаемом файле выполняется метод по разворачиванию текста наоборот (пример "абвгд" станет "дгвба") и далее пусть этот результат добавляется к полю ввода новой строкой. Запуск процедуры пусть производится по нажатию кнопки. Если приведённый мной вариант примера не информативный для изучения рассматриваемого вопроса, предложите другой вариант.

Отличный подход к изучению! Давайте создадим максимально простой, но информативный пример. Я предлагаю сделать проект с:

  • поле ввода (TEdit);
  • кнопка (TButton);
  • подключаемый заголовочный файл с функцией реверса строки;
  • вывод результата в TMemo.

Создаем новый проект в C++ Builder 6

File → New → Application

Разместите на форме:

  • TEdit (назовите EditInput);
  • TButton (назовите ButtonReverse, Caption = "Reverse");
  • TMemo (назовите MemoOutput).

Создаем заголовочный файл (StringUtils.h)

C++
    
// 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

C++
    
// 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):

C++
    
static AnsiString ReverseString(const AnsiString& str) {
    AnsiString result;
    for (int i = str.Length(); i >= 1; i--) {
        result += str[i]; // Конкатенация символов в обратном порядке
    }
    return result;
}

  

STDMETHOD в COM-интерфейсе:

C++
    
struct IStringOperations : public IUnknown {
    // STDMETHODIMP - макрос для объявления методов COM
    virtual STDMETHODIMP Reverse(BSTR input, BSTR* output) = 0;
};

  
3. Реализация COM-метода:
C++
    
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; // Успешное выполнение
}

  

Что делает каждая часть COM-реализации:

ЭлементОписание
STDMETHODIMPОпределяет метод как часть COM-интерфейса (возвращает HRESULT)
QueryInterfaceПозволяет запрашивать интерфейсы (в примере не реализован)
AddRef/ReleaseУправление подсчетом ссылок (упрощенно)
BSTRСтроковый тип, используемый в COM (WideString)
SysAllocStringВыделение памяти для BSTR
SysFreeStringОсвобождение памяти BSTR
SUCCEEDEDПроверка успешности HRESULT

Как это работает

  • пользователь вводит текст в EditInput;
  • при нажатии кнопки:

    • вызывается простая функция реверса;
    • демонстрируется аналогичная логика через STDMETHOD;
    • результаты выводятся в MemoOutput.

Упрощенная альтернатива(без COM)

Если хотите совсем просто - можно ограничиться только функцией:

C++
    
// StringUtils.h
namespace StringUtils {
    AnsiString ReverseString(const AnsiString& str);
}
      
// Unit1.cpp
void __fastcall TForm1::ButtonReverseClick(TObject *Sender)
{
    MemoOutput->Lines->Add(
        StringUtils::ReverseString(EditInput->Text)
    );
}

  

Этот пример специально сделан максимально простым, но показывает:

  • Работу с заголовочными файлами
  • Простые функции
  • Базовое использование STDMETHOD
  • Взаимодействие между классами

Другие товары

Вы так же можете прочитать следующие статьи: