2

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

4

1 回答 1

4

在我看来,您的问题与使用 Sharemem 或传递Form.HandleHWND参数无关。

这只是调用约定不匹配。您导出为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.HandleHWNDDLL 中的参数不是问题。当您调用 Windows API 函数时,您会一直这样做。

于 2011-11-21T22:24:30.870 回答