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

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

最佳答案

在我看来,您的问题与使用 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/

相关文章:

c++ - 如何从文件“HANDLE”中获取一个“HANDLE”到包含目录?

delphi - 如何在delphi中保留2位小数?

delphi - TClientDataSets 的 'invalid field type' 错误我不明白

delphi - 如何在 TForm 以外的控件中捕获 WM_DEVICECHANGE?

windows - 是否可以在进程之间跟踪 PostMessage?

c++ - 试图创建 HIMAGELIST,我在这里做错了什么?

c# - 如何从 dll 中反编译/提取 (cshtml--(razor view))

c# - 找不到 32 位 DLL 的入口点。使用 64 位 DLL

c++ - 将 LPTSTR 参数传递给 DLL 会在 C++ 项目中产生访问冲突

delphi - 记录文件升级和向后兼容性