如何将表单句柄传递给DLL以在Windows API中使用?

时间:2011-11-21 22:13:19

标签: delphi winapi dll delphi-7 hwnd

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

1 个答案:

答案 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函数时,请执行此操作。