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に渡しても安全ですか? ソースを入手した時点で、関数の 1 つがこのパラメーターの型で既に公開されていました。

4

1 に答える 1

4

ここでの問題は、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 は必要ありません。あるモジュールでメモリを割り当て、別のモジュールで解放する場合にのみ必要です。また、DLL 内のパラメーターに渡すForm.Handleことは問題ではありません。HWNDWindows API 関数を呼び出すときは、常にこれを行います。

于 2011-11-21T22:24:30.870 に答える