2012-03-16 3 views

답변

5

거기에는 콜백 개체를 만드는 한 가지 방법이 있습니다. 당신이 인터페이스를 선언해야 응용 프로그램에서 가, 느릅 나무는 예를 들어, 방법을 설명합니다

TMyMethodObject = class(TInterfacedObject, IMyMethodInterface) 
    public 
    procedure MyMethod(); stdcall; 
end; 

:

IMyMethodInterface = interface(IInterface) 
    procedure MyMethod(); stdcall; 
end; 

가 옆 클래스를 만들 필요가, 느릅 나무는이 인터페이스 (및 방법)를 구현 DLL을로드하면 TMyMethodObject 인스턴스를 만들고 DLL에 IMyMethodInterface을 전달해야합니다.

바르 : 물론 DLL이 방법을 해당 있고 내보낼가 SetMethodCallback 느릅 나무를 저장 인터페이스 참조 (느릅 나무는 매개 변수로 인터페이스 소요)

var mmo : IMyMethodInterface; 
    dllHandle : THandle; 
    smc : procedure (mmi : IMyMethodInterface); stdcall; 

코드 : 지금

mmo := TMyMethodObject.Create(); 

    dllHandle := LoadLibrary('mydll.dll'); 
    smc := GetProcAddress(dllHandle, 'SetMethodCallback'); 
    if assigned(smc) then 
     smc(mmo); 

, 당신이 할 수있는 dll에서 IMyMethodInterface 참조를 사용하여 메소드를 호출하십시오. 물론

당신은 정적 DLL을 링크 할 수 있습니다 직접 사용 :

library Project3; 
// uses YourMethodIntf.pas 
{$R *.res} 

var AppMethod : IMyMethodInterface; 

    procedure SetAppMethodCallback(mmi : IMyMethodInterface); stdcall; 
    begin 
     AppMethod := mmi; 
    end; 

    procedure AnotherDllMethod(); 
    begin 
     //here you can use AppMethod.MyMethod(); 
    end; 

exports 
    SetAppMethodCallback name 'SetMethodcallback'; 

begin 
end. 

mmo 객체 ( TMyMethodInterface)이되지 않습니다 고려 : 여기
procedure SetMethodInteface(mmi : IMyMethodInterface); stdcall; external 'mydll.dll'; 

는 DLL 샘플 코드 DLL에서 AppMethodnil (또는 FreeLibrary dll)로 설정할 때까지 파괴되므로주의해야합니다.

+0

나는 그것이 많이 묻는 것을 알고있다. 그러나 나에게 그런 dll의 완전한 해골을 게시 할 수 있냐? –

+0

@ JacekKwiecień, – teran

+0

위의 dll 예제 코드를 참조하십시오 월요일부터 작업 시간이 거의 다되었으므로 월요일부터 살펴 보겠습니다. –

관련 문제