Вам почти наверняка понадобится cdecl
соглашение о вызовах для всех ваших объявлений процедур и указателей на функции:
TConstructorProcPtr = function(aOuter: nsISupports; const aIID: TGUID; var aResult: Pointer): nsresult; cdecl;
TLoadFuncPrt = function: nsresult; cdecl;
TUnloadFuncPrt = procedure; cdecl;
Я предполагаю, что вы объявили nsISupports
как интерфейс Delphi. В противном случае необходимо убедиться, что указанный выше параметр aOuter
является указателем, как в коде C ++.
Для TContractIDEntry
и всех других мест, где вы используете PChar
, я советую вам использовать PAnsiChar
вместо этого. Размер типа Char
в Delphi изменился пару лет назад, но C ++ char
всегда есть и будет одним байтом, поэтому явно используйте однобайтовый тип символов Delphi. Кроме того, ваш комментарий задается вопросом, было ли правильно объявить поле cid
как PGUID
; звездочка означает указатель.
TContractIDEntry = record
contractid: PAnsiChar;
cid: PGUID;
end;
Поле kVersion
не должно быть членом записи, которую вы объявляете. В C ++ это static член, что означает, что он не занимает места в самой структуре; он используется всеми экземплярами этого типа. Это эквивалентно полю класса в классе Delphi, но я не думаю, что записи предлагают такую возможность. Сделайте это переменной уровня блока вместо поля.