如何将窗体句柄传递给DLL以在Windows API中使用



首先,我对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函数时,你总是这样做。

相关内容

最新更新