У меня есть следующий интерфейс, определенный в 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 ++?
Начнем с того, что ваш Delphi-код имеет объект, производный от IInterface, а ваш C ++ — нет.
Но я бы посоветовал вам прочитать эту статью Руди Велтуиса:
http://rvelthuis.de/articles/articles-cppobjs.html
По сути, вам нужно либо реализовать конец C ++ как объект COM, либо «сплющить» ваши объекты C ++ в вызываемые функции C.
Других решений пока нет …