BrowseForComputer via ntlanman.dll



  • Hallo zusammen,

    über LoadLibrary("ntlanman.dll") und SystemFocusDialog kann ich einen Dialog öffnen, wo ich eine Domäne bzw. einen Computer auswählen kann. Im Prinzip funktioniert das auch bei mir, aber ein paar Kleinigkeiten sind noch offen und ich suche verzweifelt nach Informationen zu SystemFocusDialog und finde absolut nix.

    Habt ihr damit Erfahrungen bzw. kennt ihr einen Link zu mehr Informationen ?

    Danke und Gruß

    WoWe



  • Hier meine Funktion aus meinem NetSend-Programm, welches du auf meiner Homepage bekommen kannst:

    typedef DWORD (__stdcall *SFD)(HWND, UINT, LPWSTR, DWORD, BOOL, LPWSTR, DWORD);
    
    const UINT FOCUSDLG_DOMAINS_ONLY = 1;
    const UINT FOCUSDLG_SERVERS_ONLY = 2;
    const UINT FOCUSDLG_SERVERS_DOMAINS = 3;
    const UINT FOCUSDLG_BROWSE_LOGON_DOMAIN = 0x00010000;
    const UINT FOCUSDLG_BROWSE_WKSTA_DOMAIN = 0x00020000;
    const UINT FOCUSDLG_BROWSE_OTHER_DOMAINS = 0x00040000;
    const UINT FOCUSDLG_BROWSE_TRUSTING_DOMAINS = 0x00080000;
    const UINT FOCUSDLG_BROWSE_WORKGROUP_DOMAINS = 0x00100000;
    const UINT FOCUSDLG_BROWSE_ALL_DOMAINS = FOCUSDLG_BROWSE_LOGON_DOMAIN |
                                             FOCUSDLG_BROWSE_WKSTA_DOMAIN |
                                             FOCUSDLG_BROWSE_OTHER_DOMAINS |
                                             FOCUSDLG_BROWSE_TRUSTING_DOMAINS |
                                             FOCUSDLG_BROWSE_WORKGROUP_DOMAINS;
    
    BOOL BrowseForComputer(HWND hWndParent, LPWSTR wszCompName, DWORD dwBufLen)
    {
       BOOL bRet = FALSE;
       HMODULE hDll = LoadLibrary("ntlanman.dll");
    
       if(hDll)
       {
          SFD SystemFocusDialog = (SFD)GetProcAddress(hDll, "I_SystemFocusDialog");
          if(SystemFocusDialog)
          {
             DWORD dwRet = SystemFocusDialog(hWndParent,
                                             FOCUSDLG_SERVERS_ONLY | FOCUSDLG_BROWSE_ALL_DOMAINS,
                                             wszCompName,
                                             dwBufLen,
                                             (INT)&bRet,
                                             NULL,
                                             0
                                            );
    
             if(dwRet != NO_ERROR)
                ErrorMsg("A function call failed");
          }
          else
             ErrorMsg("A function from a DLL could not be loaded");
    
          FreeLibrary(hDll);
       }
       else
          ErrorMsg("Missing DLL: \"NtLanMan.dll\"");
    
       return bRet;
    }
    


  • Hallo WebFritzi,

    vielen Dank für deine Hilfe. Damit hast du mir super geholfen. Wo hast du denn die Information über "SystemFocusDialog" her ?

    Bei MS msdn hab ich nichts gefunden, naja mit deiner Hilfe funktioniert es jedenfalls.

    Ich benutze den Dialog auch um per NetMessageBufferSend Popup-Windows zu verschicken, allerdings nicht als eigenes Programm, sondern ich hab die Funktion in einem anderen Programm mit aufgenommen.

    Dein NetSend hab ich auch mal ausprobiert. Was mir daran nicht so gefällt ist die Benutzung eines festen Absendernamens "fromname". Wenn du eine Message an einen NT4.0 Rechner schickst, kommt die Fehlermeldung "User not found ...", obwohl der Empfänger online ist (aber der Absender existiert nicht oder wird nicht gefunden). Bei W2K (eingeschränkt, Benutzername, kein Nick) und XP funktioniert das, aber nicht bei NT4.0. Ich würde da eine Abfrage nach dem Returnwert einsetzen und wenn der Fehlercode == 2273 ist, dann das gleiche nochmal mit "fromname = NULL", dann gehts überall.

    Gruß WoWe


Anmelden zum Antworten