Использование интерфейса C ++ в delphi / pascal

У меня есть следующий интерфейс, определенный в DLL:

class TestInterface
{
public: int foo(int)=0;
};

И следующие функции позволяют мне создавать объекты этого типа:

extern "C" declspec(dllexport) TestInterface* __stdcall CreateInterface();

Интерфейс реализован в dll, и я могу использовать его на C ++ без каких-либо проблем (я также определил .def файл, чтобы убедиться, что все работает правильно). Однако, когда дело доходит до использования его в паскале, у меня есть проблемы.
Вот как я пытаюсь использовать Interface в паскале:

type
myinterface = interface(IInterface)
function foo(param1: Integer): Integer;
end;

TMyInterface = ^myinterface;
pCreateInterface = function: TMyInterface; stdcall;

var
CreateInterface: pCreateInterface;

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

function init()
begin
DllHandle := LoadLibrary(DLLPath);
if DllHandle <> 0 then
begin
@CreateInterface := GetProcAddress(DllHandle, 'CreateInterface');
if (@GetXYZ <> nil) then
begin
dllInitialized := true;
myXYZ := CreateInterface();
myXYZ.foo(1); // Access violation error here
end;
end;
end;

Кажется, все хорошо. При отладке, CreateInterface выполняется успешно и есть некоторая ценность в myXYZ, Но когда я пытаюсь позвонить foo Я получаю ошибку нарушения доступа.
Я заметил, что могу вызывать функции, которые не находятся внутри какого-либо класса из DLL, но не те, которые находятся внутри класса / интерфейса.
Я делаю что-то неправильно? Как я могу это сделать?
Есть ли способ, которым я могу использовать C ++ DLL в Delphi без изменения источника C ++?

0

Решение

Начнем с того, что ваш Delphi-код имеет объект, производный от IInterface, а ваш C ++ — нет.

Но я бы посоветовал вам прочитать эту статью Руди Велтуиса:

http://rvelthuis.de/articles/articles-cppobjs.html

По сути, вам нужно либо реализовать конец C ++ как объект COM, либо «сплющить» ваши объекты C ++ в вызываемые функции C.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]