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++ 소스를 변경하지 않고 델파이에서 C++ DLL을 사용할 수있는 방법이 있습니까?
레코드로 선언하고 작동하게 할 수 있습니다. 그것은 인터페이스가 아닙니다. C++ 클래스와 구조체는 본질적으로 같은 것을 기억하십시오. 그러나 DLL에서 클래스를 내 보내면 안됩니다. Delphi DLL에서 클래스를 내보내는 것과 마찬가지입니다. 사용자가 동일한 컴파일러를 사용하도록 강요합니다. –
@DavidHeffernan, 나는 COM 같은 인터페이스가 모든 언어에서 작동한다고 생각했습니다. 그건 사실이 아닌가? – atoMerz
그건 COM 인터페이스가 아니야. –