首先,我对 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 是否安全?当我获得源代码时,其中一个函数已经使用此参数类型发布。