Klar kann ich Dir dazu auch etwas mehr liefern, war nur am Wochenende nicht am Entwicklungsrechner
In InnoSetup installiere ich meine
DLL so:
Code:
[Files]
Source: WinLogonExample.dll; DestDir: {win}; Flags: restartreplace overwritereadonly uninsrestartdelete
[Registry]
; http://
msdn.microsoft.com/en-us/library/aa379402(VS.85).aspx
Root:
HKLM; Subkey: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\WinLogonExample; ValueType: expandsz; ValueName: DllName; ValueData: WinLogonExample.dll; Flags: uninsdeletekey
Root:
HKLM; Subkey: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\WinLogonExample; ValueType: string; ValueName: Logoff; ValueData: LogoffHandler
Root:
HKLM; Subkey: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\WinLogonExample; ValueType: string; ValueName: Shutdown; ValueData: ShutdownHandler
Root:
HKLM; Subkey: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\WinLogonExample; ValueType: dword; ValueName: Asynchronous; ValueData: 1
Oder anders gesagt, das sind drei bis vier Registry-Einträge, die nötig sind. Die Namen der Handler müssen identisch mit den
DLL-Exports sein, Du findest sie hier wieder:
Delphi-Quellcode:
library WinLogonExample;
uses
SysUtils,
Classes,
Messages,
Windows;
type
TFnMsgeCallback = function(bVerbose: Boolean; lpMessage: PWideChar): Cardinal; stdcall;
TWlxNotificationInfo = record
Size: Cardinal;
Flags: Cardinal;
UserName: PWideChar;
Domain: PWideChar;
WindowStation: PWideChar;
Token: Cardinal;
Desktop: Cardinal;
StatusCallback: TFnMsgeCallback;
end;
PWlxNotificationInfo = ^TWlxNotificationInfo;
{$R *.res}
procedure LogoffHandler(Info: PWlxNotificationInfo); stdcall;
begin
// actions take place here
end;
procedure ShutdownHandler(Info: PWlxNotificationInfo); stdcall;
begin
// or here
end;
procedure EntryPointProc(reason: integer);
begin
case reason of
DLL_PROCESS_ATTACH: begin
DisableThreadLibraryCalls(hInstance);
end;
DLL_THREAD_ATTACH: begin
end;
DLL_PROCESS_DETACH: begin
end;
DLL_THREAD_DETACH: begin
end;
end;
end;
exports
LogoffHandler,
ShutdownHandler;
begin
DllProc := @EntryPointProc;
DllProc(DLL_PROCESS_ATTACH);
end.
Diese beiden exportieren Funktionen werden dann halt einfach jedesmal aufgerufen, wenn sich ein Benutzer abmeldet oder der Rechner runterfährt.