Прежде всего, я не слишком доволен 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?Когда я получил источник, одна из функций уже была опубликована с этим типом параметра.