...someplace, where there isn't any trouble? Do you suppose there is such a place, Toto?

Dialoge aus credui.dll benutzen...

So, der ist jetzt für den Löselic, wie versprochen.

Irgendwie gewinne ich den Eindruck, als hätte sich noch nicht überall rumgesprochen, daß unter XP und seinen Nachfolgern die Möglichkeit besteht, die Authentifizierungsdialoge des Systems, ähnlich den "Common Dialogs" aus comdlg32.dll, auch für das UI der eigenen Programme zu benutzen.

Aussehen kann das dann etwa so:

Credui Beispiel

Und der Code, der dazu erforderlich ist (ein VC6-Projekt kann man hier runterladen), ist wirklich trivial:

#include <windows.h>
#include <wincred.h>
#include <tchar.h>
#include <stdio.h>

#ifndef dimof
#define dimof(a) (sizeof(a)/sizeof(a[0]))
#endif // dimof


int _tmain(int /*argc*/, LPCTSTR * /*argv*/ [])
{

    TCHAR szUser[CREDUI_MAX_USERNAME_LENGTH+1];
    ULONG ulUserMaxChars = dimof(szUser);
    TCHAR szPwd[CREDUI_MAX_PASSWORD_LENGTH+1];
    ULONG ulPwdMaxChars = dimof(szPwd);
    BOOL bSaveState = FALSE;
    DWORD dwFlags = CREDUI_FLAGS_DO_NOT_PERSIST|
                    CREDUI_FLAGS_GENERIC_CREDENTIALS|
                    CREDUI_FLAGS_ALWAYS_SHOW_UI;
    szUser[0] = szPwd[0] = _T('\0');


    if (NO_ERROR == CredUIPromptForCredentials
        (NULL, _T("this bloody Computer!"), NULL, ERROR_SUCCESS, 
         szUser, ulUserMaxChars, szPwd, 
         ulPwdMaxChars, &bSaveState, dwFlags))
        _tprintf(_T("You typed:\nuser: %s\npassword:%s\n"), 
                     szUser, szPwd);
    else
        _tprintf(_T("You idiot, you cancelled this dialog!\n"));


    return 0;
}

...und voila, man hat einen richtig amtlichen Windows-Authentifizierungsdialog. Wenn man jetzt noch total TSUnami-mäßig drauf ist, kann man den Dialog sogar noch a bissal pimpen und ihm im Header ein mehr oder minder hübsches Bitmap unterjubeln, um so das eigene CD auch noch zu verbreiten. Ich glaube allerdings, daß damit der Effekt des offiziell amtlichen Authentifizierungsdialogs doch ein wenig verloren geht. YMMV.

Das einzige, worauf man wirklich achtgeben muß, ist, daß das so nur unter XP und höher funktioniert. Wenn der Code auch unter Windows 2000 und NT4 funktionieren muß, muß man folgendes ergänzen:

  • Alternativcode mit einem eigenen Dialogtemplate, das verwendet wird, wenn die credui.dll nicht geladen werden kann
  • Delayload von credui.dll

Das Codebeispiel hier benutzt das CredUIPromptForCredentials API natürlich nur in einer äußerst generischen Form. Man kann mit diesem API aber auch einen Credentials Store des Betriebssystems benutzen und noch andere Gimmicks und Spielereien, aber ich hatte ehrlich gesagt noch nie das gesteigerte Bedürfnis, da näher nachzuforschen. Und ja, mit VC6 "out-of-the-box" geht das alles natürlich auch nicht, man braucht mindestens das Windows XP PlatSDK von 2001.

Trackback address for this post

This is a captcha-picture. It is used to prevent mass-access by robots.
Please enter the characters from the image above. (case insensitive)

1 comment

Comment from: loeselic [Visitor]
loeselicSuper, vielen Dank! Bin auch gegen Pimpen, der 'offizielle' Look ist ja gerade das krasse an der Sache...
11/08/05 @ 16:19

Comments are closed for this post.