Einzelnen Beitrag anzeigen

CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#27

AW: Shutdown-Folder, oder: Wie starte ich ein Prog beim Win-Runterfahren?

  Alt 19. Sep 2011, 08:53
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.
  Mit Zitat antworten Zitat