Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Showmessage in Service aufrufen

  Alt 21. Jan 2005, 14:28
Zitat von kobel:
Hallo,

ich möchte aus einem Service Meldungsfenster aufrufen
z.B. showmessage('hallo')

warum geht das nicht ?
Weil der Dienst in einer anderen WindowStation läuft und so keinen Zugriff auf den Desktop des angemeldeten Benutzers hat. Um nun mit den angemeldeten Benutzer interagieren zu können, muss der Dienst die interaktive WindowStation öffnen (WinSta0) und den standard Deskotp ("Default"). Wie das geht zeigt folgender C-Quellcode aus dem PSDK:
Code:
DWORD dwGuiThreadId = 0;
 
int
UserMessageBox( 
    RPC_BINDING_HANDLE h,
    LPSTR lpszWindowStation,
    LPSTR lpszDesktop,
    LPSTR lpszText,
    LPSTR lpszTitle,
    UINT fuStyle)

    DWORD dwThreadId;
    HWINSTA hwinstaSave;
    HDESK hdeskSave;
    HWINSTA hwinstaUser;
    HDESK hdeskUser;
    int result;
 
    // Ensure connection to service window station and desktop, and
    // save their handles.

    GetDesktopWindow();
    hwinstaSave = GetProcessWindowStation();
    dwThreadId = GetCurrentThreadId();
    hdeskSave = GetThreadDesktop(dwThreadId);
 
    // Impersonate the client and connect to the User's
    // window station and desktop.

    RpcImpersonateClient(h);
    hwinstaUser = OpenWindowStation(lpszWindowStation, FALSE, MAXIMUM_ALLOWED);
    if (hwinstaUser == NULL)
    { 
        RpcRevertToSelf();
        return 0;
    } 
    SetProcessWindowStation(hwinstaUser);
    hdeskUser = OpenDesktop(lpszDesktop, 0, FALSE, MAXIMUM_ALLOWED);
    RpcRevertToSelf();
    if (hdeskUser == NULL)
    { 
        SetProcessWindowStation(hwinstaSave);
        CloseWindowStation(hwinstaUser);
        return 0;
    } 
    SetThreadDesktop(hdeskUser);
 
    // Display message box.

    dwGuiThreadId = dwThreadId;
    result = MessageBox(NULL, lpszText, lpszTitle, fuStyle);
    dwGuiThreadId = 0;
 
    // Restore window station and desktop.

    SetThreadDesktop(hdeskSave);
    SetProcessWindowStation(hwinstaSave);
    CloseDesktop(hdeskUser);
    CloseWindowStation(hwinstaUser);
 
    return result;
}
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat