2013-02-06 3 views
0
는 내가 DLL에 정의 된 다음 인터페이스있다

:은 C++ 사용 인터페이스

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을 사용할 수있는 방법이 있습니까?

+0

레코드로 선언하고 작동하게 할 수 있습니다. 그것은 인터페이스가 아닙니다. C++ 클래스와 구조체는 본질적으로 같은 것을 기억하십시오. 그러나 DLL에서 클래스를 내 보내면 안됩니다. Delphi DLL에서 클래스를 내보내는 것과 마찬가지입니다. 사용자가 동일한 컴파일러를 사용하도록 강요합니다. –

+0

@DavidHeffernan, 나는 COM 같은 인터페이스가 모든 언어에서 작동한다고 생각했습니다. 그건 사실이 아닌가? – atoMerz

+0

그건 COM 인터페이스가 아니야. –

답변

4

먼저 Delphi 코드에는 IInterface에서 파생 된 개체가 있으며 C++에는 없습니다. 당신이 중 하나는 COM 개체로 ++ 끝 C를 구현, 또는 C를 '평평하게'할 필요가 기본적으로

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

++ - :

하지만, 난 당신이 루디 Velthuis으로이 기사를 읽고 좋을 것 오브젝트를 C 호출 가능 함수로 변환합니다.

관련 문제