2017-12-07 11 views
0

インターフェイスを実装するクラスを含むdllがあります。 dllには、インターフェイスを返すエクスポートされたメソッドがあります。DLL内のクラスのインターフェイスを返すアクセス違反解放ライブラリ

DLLを明示的に読み込むことはできますが、フリーライブラリを使用しようとするとアクセス違反が発生します。明示モードを使用する必要があるため、暗黙リンクを使用しようとはしませんでした。

ライブラリを読み込んですぐにフリーズすると、インターフェイスを取得せずにすべて正常に動作します。 DLL内

Dllファイル

library Tef; 

uses 
    uTTefFacade; 

{$R *.res} 

exports 
    CreateTef; 

begin 
end. 

インタフェース:DLL内

type 
    ITefFacade = interface 
    ['{77691DD1-C6E9-4F75-951F-BFA1468DC36C}'] 
    function IniciarTransacao(AParam: TTefIniciarTransacaoParamDTO): TTefIniciarTransacaoResultDTO; 
    end; 

クラス:

type 
     TTefFacade = class (TInterfacedObject, ITefFacade) 
     private  
     function IniciarTransacao(AParam: TTefIniciarTransacaoParamDTO): TTefIniciarTransacaoResultDTO; 
     public 
     constructor Create; 
     destructor Free; 
     end; 

function CreateTef: ITefFacade; export; stdcall; 

function CreateTef: ITefFacade; 
begin 
    Result := ITefFacade(TTefFacade.Create); 
end; 

エグゼ:

procedure TForm1.FormCreate(Sender: TObject); 
var 
    CreateTef: function: ITefFacade; stdcall; 
begin 
    try 
    FTef := nil; 

    FHTef := LoadLibrary('Tef.dll'); 
    if (FHTef > 0) then 
    begin 
     @CreateTef := GetProcAddress(FHTef, 'CreateTef'); 
     if (@CreateTef <> nil) then 
     FTef := CreateTef; 
    end; 

    if (FTef = nil) then 
     ShowMessage('Error.'); 
    except 
    on E: Exception do 
     ShowMessage('Erro: ' + E.Message); 
    end; 
end; 

そして、ここで呼び出すフリー図書館では、アクセス違反が発生します。

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
    FreeLibrary(FHTef); 
end; 
+2

アンロードする前にFTefの参照をnilに設定しますか? それが理由である可能性があります。 – Fritzw

+0

それは働いて、ありがとう!前にFreeAndNilを試してみましたが、うまくいきませんでした。 – Samuel

+3

私はクラスとインターフェイスの違いについてもっと学ぶべきだと思っています。インターフェイス上のFreeAndNilはnogoです – Fritzw

答えて

4

あなたはnilにDLLを解除する前FTefの参照を持っています。

インターフェイスの背後にあるオブジェクトがDLLに存在するため、これを尊重する必要があります。最初にインターフェイスを解放せずにDLLをアンロードしようとすると、アンロード後にオブジェクトにアクセスするときに問題が発生します(Delphiが範囲外になったときにDelphiが参照を自動終了するときなど)。

関連する問題