将类成员映射到外部dll托管函数是否正确?
假设我有一个Dll将类成员映射到外部dll托管函数是否正确?,dll,delphi-7,Dll,Delphi 7,假设我有一个Dlldll1.Dll,它导出一个具有此签名的函数: procedure Foo(Value: Integer); cdecl; 在我的应用程序中,我需要实例化2个使用此dll的独立对象。 我无法重写这样的dll,而且它不是线程安全的,所以我必须将它用作一种“对象”,插入我的鼻子并复制dll文件,这样我们现在就有了:dll1.dll和dll2.dll 现在我正在编写以下代码: type T_Foo: procedure(Value: Integer); cdecl; cl
dll1.Dll
,它导出一个具有此签名的函数:
procedure Foo(Value: Integer); cdecl;
在我的应用程序中,我需要实例化2个使用此dll的独立对象。
我无法重写这样的dll,而且它不是线程安全的,所以我必须将它用作一种“对象”,插入我的鼻子并复制dll文件,这样我们现在就有了:dll1.dll
和dll2.dll
现在我正在编写以下代码:
type
T_Foo: procedure(Value: Integer); cdecl;
class TMyClass(TObject)
private
FDllHandle: THandle;
Foo: T_Foo;
public
constructor Create(const dllName: String);
destructor Destroy; override;
procedure DoFoo(Value: Integer);
end;
[...]
constructor TMyClass.Create(const dllName: String);
begin
FDllHandle := LoadLibrary(PChar(dllName));
if (FDllHandle = 0) then
RaiseLastOSError;
@Foo := GetProcAddress(FDllHandle, '_Foo');
end;
destructor TMyClass.Destroy;
begin
if (FDllHandle <> 0) then
Freelibrary(FDllHandle);
inherited;
end;
procedure TMyClass.DoFoo(Value: Integer);
begin
Foo(Value);
end;
我觉得这些调用是正确的,完全独立的,因为这些方法都调用一个标准过程,其地址是从两个不同的DLL获得的
还是我遗漏了什么?我觉得不错。你真的有问题吗?谢谢你,雷米。不,问题似乎出在dll中,但当我编写dll时,我通常使用标准函数编写接口单元,然后如果需要,我将它们包装在类的层次结构中。我没有编写那些dll和接口单元,也从未在成员类中直接使用过这样的过程类型。因此,考虑到这个“多实例”dll的特殊性质,我需要确保这些映射按照我的预期工作。。。
MyObj1 := TMyClass.Create('dll1.dll');
MyObj2 := TMyClass.Create('dll2.dll');
MyObj1.DoFoo(10);
MyObj2.DoFoo(20);