Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как создать CLSID (System.TGUID в Delphi) из шестнадцатеричных значений, аналогично C++?

Delphi , Синтаксис , Шифрование

 

При работе с COM-объектами в Delphi часто возникает необходимость создания и использования CLSID (Class ID), которые представляют собой глобально уникальные идентификаторы (GUID). В C++ такие идентификаторы часто задаются с помощью шестнадцатеричных значений, и разработчики, переходящие с C++ на Delphi, могут столкнуться с вопросом: как правильно создать TGUID в Delphi, используя шестнадцатеричные значения?

Проблема и ошибочный подход

В C++ CLSID может быть создан следующим образом:

CLSID clsid = {0x12345678, 0x1234, 0x1234, {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}};

Попытка напрямую перенести этот синтаксис в Delphi приводит к ошибке:

var
  clsid: TGUID;
begin
  clsid := TGUID($12345678, $1234, $1234, ($12, $34, $56, $78, $90, $AB, $CD, $EF));
end;

Компилятор выдаст ошибку: [dcc32 Error]: E2029 ')' expected but ',' found.

Решение: правильные способы создания TGUID в Delphi

1. Инициализация полей структуры вручную

Структура TGUID в Delphi определена следующим образом:

TGUID = record
  D1: Cardinal;
  D2: Word;
  D3: Word;
  D4: array[0..7] of Byte;
end;

Правильный способ инициализации:

var
  clsid: TGUID;
begin
  clsid.D1 := $12345678;
  clsid.D2 := $1234;
  clsid.D3 := $1234;
  clsid.D4[0] := $12;
  clsid.D4[1] := $34;
  clsid.D4[2] := $56;
  clsid.D4[3] := $78;
  clsid.D4[4] := $90;
  clsid.D4[5] := $AB;
  clsid.D4[6] := $CD;
  clsid.D4[7] := $EF;
end;

2. Инициализация при объявлении переменной

Можно инициализировать TGUID прямо при объявлении:

var
  clsid: TGUID = (D1: $12345678; D2: $1234; D3: $1234; D4: ($12, $34, $56, $78, $90, $AB, $CD, $EF));

Для inline-объявления переменных используйте := вместо =:

var
  clsid: TGUID := (D1: $12345678; D2: $1234; D3: $1234; D4: ($12, $34, $56, $78, $90, $AB, $CD, $EF));

3. Использование конструктора TGUID (в современных версиях Delphi)

В современных версиях Delphi (начиная с XE7) можно использовать конструктор:

var
  clsid: TGUID;
begin
  clsid := TGUID.Create($12345678, $1234, $1234, [$12, $34, $56, $78, $90, $AB, $CD, $EF]);
end;

Альтернативные способы создания GUID

1. Использование строкового представления

const
  clsid: TGUID = '{12345678-1234-1234-1234-567890ABCDEF}';

Или динамически:

uses
  ..., System.SysUtils;

var
  clsid: TGUID;
begin
  clsid := StringToGUID('{12345678-1234-1234-1234-567890ABCDEF}');
end;

2. Использование интерфейса

Если у вас есть интерфейс с назначенным IID, можно использовать его напрямую:

type
  ISomeIntf = interface
    ['{12345678-1234-1234-1234-567890ABCDEF}']
    // методы интерфейса
  end;

var
  clsid: TGUID;
begin
  clsid := ISomeIntf;
end;

Это особенно полезно для функций вроде CoCreateInstance:

var
  Intf: ISomeIntf;
begin
  CoCreateInstance(..., ISomeIntf, Intf);
end;

Пример использования с CoCreateInstance

Вот полный пример создания COM-объекта с использованием TGUID:

uses
  Winapi.Windows, Winapi.ActiveX, System.SysUtils;

procedure CreateCOMObject;
var
  clsid: TGUID;
  hr: HRESULT;
  pUnk: IUnknown;
begin
  // Инициализация CLSID
  clsid.D1 := $12345678;
  clsid.D2 := $1234;
  clsid.D3 := $1234;
  clsid.D4[0] := $12;
  clsid.D4[1] := $34;
  clsid.D4[2] := $56;
  clsid.D4[3] := $78;
  clsid.D4[4] := $90;
  clsid.D4[5] := $AB;
  clsid.D4[6] := $CD;
  clsid.D4[7] := $EF;

  // Создание экземпляра COM-объекта
  hr := CoCreateInstance(clsid, nil, CLSCTX_INPROC_SERVER, IUnknown, pUnk);
  if Succeeded(hr) then
  begin
    try
      // Работа с COM-объектом
      // ...
    finally
      pUnk := nil; // Освобождение интерфейса
    end;
  end
  else
    RaiseLastOSError(hr);
end;

Заключение

В Delphi существует несколько способов создания и инициализации TGUID с использованием шестнадцатеричных значений:

  1. Прямая инициализация полей структуры
  2. Инициализация при объявлении переменной
  3. Использование конструктора TGUID (в современных версиях)
  4. Строковое представление GUID
  5. Использование интерфейсов с назначенными IID

Выбор конкретного способа зависит от контекста и версии Delphi. Для работы с COM-объектами наиболее удобными могут быть варианты с использованием строкового представления или интерфейсов, так как они обеспечивают лучшую читаемость кода.

Создано по материалам из источника по ссылке.

Контекст описывает методы создания и инициализации CLSID (TGUID) в Delphi с использованием шестнадцатеричных значений, аналогичных подходам в C++, включая ручную инициализацию полей, конструкторы и строковые представления.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Шифрование ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-04 06:55:20/0.0056319236755371/0