首先,我对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是否安全?当我得到源代码时,其中一个函数已经使用此参数类型发布。
答案 0 :(得分:4)
我认为您的问题与使用Sharemem或将Form.Handle
传递给HWND
参数无关。
这只是一个calling convention不匹配。您导出为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函数时,请执行此操作。