首先,我对DLL不太熟悉。我以前做过,但知道的很少,总是有问题。
我正在构建的DLL需要将windows窗体句柄(HWND)传递到DLL函数中,并且DLL将使用该句柄调用windows API函数。当我试图调用任何函数(从Win7InitTaskbar
开始)时,我一直得到访问冲突-就好像它甚至没有调用函数一样。这让我得出结论,一定是HWND
参数导致它崩溃…我认为…
library Win7;
uses
//Do I need ShareMem?
//ShareMem, //<---
Windows,
Forms,
JDWin7,
SysUtils,
Classes;
{$R *.res}
function Win7InitTaskbar(const FormHandle: HWND): Bool; stdcall;
begin
Result:= InitializeTaskbarAPI(FormHandle);
end;
function Win7InitForm(const FormHandle: HWND): Bool; stdcall;
begin
end;
function Win7SetTaskbarState(const AState: Cardinal): Bool; stdcall;
begin
Result:= SetTaskbarProgressState(AState);
end;
function Win7SetTaskbarValue(const ACurrent: UInt64; const AMax: UInt64): Bool; stdcall;
begin //is UInt64 Safe for DLL?
Result:= SetTaskbarProgressValue(ACurrent, AMax);
end;
exports
Win7InitTaskbar,
Win7InitForm,
Win7SetTaskbarState,
Win7SetTaskbarValue;
begin
end.
DLL函数的实现:
function Win7InitTaskbar(const FormHandle: HWND): Bool;
external W7DLL;
function Win7SetTaskbarState(const AState: Cardinal): Bool;
external W7DLL;
function Win7SetTaskbarValue(const ACurrent: UInt64; const AMax: UInt64): Bool;
external W7DLL;
我有这个问题,我是否使用ShareMem
或不(其中,我也不想使用)。使用HWND
参数发布函数是否安全?我也试过LongWord,还是没有成功。内部函数InitializeTaskbarAPI
实际上在DLL之外完美地工作,如果我直接在应用程序内使用它。但在这种情况下,我想把这些放在一个共享的DLL中。
另外,传递UInt64
到DLL是安全的吗?当我获得源代码时,其中一个函数已经使用此参数类型发布了。
您的问题似乎与使用Sharemem或将Form.Handle
传递给HWND
参数无关。
这只是一个调用约定不匹配。您以stdcall
的身份导出,然后以register
的身份导入。当你这样做的时候,运行时错误肯定会随之而来。
你需要这样做:
function Win7InitTaskbar(const FormHandle: HWND): Bool;
stdcall; external W7DLL;
function Win7SetTaskbarState(const AState: Cardinal): Bool;
stdcall; external W7DLL;
function Win7SetTaskbarValue(const ACurrent: UInt64; const AMax: UInt64): Bool;
stdcall; external W7DLL;
不管怎样,这里不需要Sharemem。只有当您在一个模块中分配内存,但在另一个模块中释放内存时才需要这样做。将Form.Handle
传递给DLL中的HWND
参数也不是问题。当你调用Windows API函数时,你总是这样做。