我仍在努力掌握使用接口。我将它们实现的目的是与在DLL中实例化的对象进行交互。当我使用它时,一切都正常工作,所有方法都按预期工作等等。问题是在清理该接口后面的对象时。
我有一个简单的接口如下所示
IMyInterface = interface
['{d52b14f3-156b-4df8-aa16-cb353193d27c}']
procedure Foo;
end;
还需要一个相应的对象
TMyObject = class(TInterfacedObject, IMyInterface)
private
procedure Foo;
end;
在DLL内部,我有一个全局变量作为该对象的实例以及两个导出函数来创建和销毁此实例。
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;
这个对象的析构函数几乎什么都不做,只是继承。但我仍然遇到了这个问题。但在执行 _MyObject.Free
时,我得到了 Invalid Pointer Operation
的错误。
我使用 LoadLibrary
和 GetProcAddress
访问这些导出方法。
为什么会发生这种情况,我应该如何解决?
CreateMyObject
时会发生什么?为什么你需要一个全局变量呢?你只需要一个返回由新创建的对象实现的接口的函数。 - David Heffernan