首先,我对 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
参数无关。
这只是一个 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 函数时,您总是会执行此操作。
关于delphi - 如何将表单句柄传递给 DLL 以在 Windows API 中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8219253/