私はまだインターフェイスの使用を理解しようとしています。私は、DLL 内でインスタンス化されたオブジェクトと対話するという唯一の目的でそれらを実装しています。私がそれを使用すると、すべてが正常に機能し、すべてのメソッドが期待どおりに機能するなどです。問題は、そのインターフェイスの背後にあるオブジェクトをクリーンアップするときです。
私はそのようなシンプルなインターフェースを持っています
IMyInterface = interface
['{d52b14f3-156b-4df8-aa16-cb353193d27c}']
procedure Foo;
end;
そしてそれのためのオブジェクト
TMyObject = class(TInterfacedObject, IMyInterface)
private
procedure Foo;
end;
DLL 内には、このオブジェクトのグローバル変数と、このインスタンスを作成および破棄するための 2 つのエクスポート関数があります。
var
_MyObject: TMyObject;
function CreateMyObject: IMyInterface; stdcall;
begin
_MyObject:= TMyObject.Create;
Result:= IMyInterface(_MyObject);
end;
function DestroyMyObject: Integer; stdcall;
begin
_MyObject.Free; // <-- Invalid Pointer Operation
end;
オブジェクトのデストラクタは事実上何もしませんが、inherited
私はまだこの問題を抱えています。でも乗りInvalid Pointer Operation
ます_MyObject.Free
。
これらのエクスポートされたメソッドにアクセスするにはLoadLibrary
、 とを使用します。GetProcAddress
これが発生する理由と修正方法を教えてください。