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

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

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

Ровно 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
  • Взаимодействие между классами

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

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