Как передать дескриптор формы в DLL для использования в Windows API? - PullRequest
2 голосов
/ 22 ноября 2011

Прежде всего, я не слишком доволен DLL.Я делал это раньше, но знаю очень мало и всегда имею проблемы.

Эта сборка DLL, которую я создаю, требует передачи дескриптора формы окна (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 голосов
/ 22 ноября 2011

Мне кажется, что ваша проблема здесь не связана с использованием 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 параметру HWND в DLL не является проблемой.Вы делаете это все время, когда вызываете функции Windows API.

...