Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Computer arbeitsgruppen übergreifend suchen mit Win-Dialog (https://www.delphipraxis.net/44883-computer-arbeitsgruppen-uebergreifend-suchen-mit-win-dialog.html)

Luckie 26. Apr 2005 12:11


Computer arbeitsgruppen übergreifend suchen mit Win-Dialog
 
Kennt jemand einen Windows-Dialog, mit dem amn arbeitsgruppenübergreifen Rechner im Netzwerk suchen kann?

Zur Zeit benutze ich folgenden Windows-Dialog aus der ntlanman.dll, um Computer im Netzwerk zu suchen:
Delphi-Quellcode:
type
  TServerBrowseDialogA0 = function(hwnd: HWND; pchBuffer: pointer;
    cchBufSize: DWord): bool; stdcall;

//...;

LANMAN_DLL := GetModuleHandle('NTLANMAN.DLL');
  if LANMAN_DLL = 0 then
    LANMAN_DLL := LoadLibrary('NTLANMAN.DLL');
  if LANMAN_DLL <> 0 then
  begin
    @ServerBrowseDialogA0 := GetProcAddress(LANMAN_DLL,
      ServerBrowseDialogA0_name);
    if @ServerBrowseDialogA0 = nil then
      halt;
  end;

//...;

ServerBrowseDialogA0(hDlg, @buffer, MAX_PATH);
Leider sucht der nur in der eigenen Arbeitsgruppe. Es müsste doch eigentlich auch einen Dialog geben, um arbeitsgruppenübergreifend zu suchen.

Mit diesem geht es wohl:
Delphi-Quellcode:
const
  FOCUSDLG_DOMAINS_ONLY = 1;
  FOCUSDLG_SERVERS_ONLY = 2;
  FOCUSDLG_SERVERS_DOMAINS = 3;
  FOCUSDLG_BROWSE_LOGON_DOMAIN = $00010000;
  FOCUSDLG_BROWSE_WKSTA_DOMAIN = $00020000;
  FOCUSDLG_BROWSE_OTHER_DOMAINS = $00040000;
  FOCUSDLG_BROWSE_TRUSTING_DOMAINS = $00080000;
  FOCUSDLG_BROWSE_WORKGROUP_DOMAINS = $00100000;
  FOCUSDLG_BROWSE_ALL_DOMAINS = FOCUSDLG_BROWSE_LOGON_DOMAIN or
    FOCUSDLG_BROWSE_WKSTA_DOMAIN or FOCUSDLG_BROWSE_OTHER_DOMAINS or
    FOCUSDLG_BROWSE_TRUSTING_DOMAINS or FOCUSDLG_BROWSE_WORKGROUP_DOMAINS;


function SystemFocusDialog(hwndOwner: HWND; dwSelectionFlag: UINT;
  wszName: PWideChar; dwBufSize: DWORD; var bOKPressed: Boolean;
  wszHelpFile: PWideChar; dwContextHelpId: DWORD): DWORD; stdcall;
  external 'ntlanman.dll' Name 'I_SystemFocusDialog';

function ComputerBrowser(hWndParent: HWND; wCompName: PWideChar;
  dwBufLen: DWORD): Boolean;
var
  dwError: DWORD;
begin
  Result := False;
  dwError := SystemFocusDialog(hWndParent, FOCUSDLG_SERVERS_DOMAINS {or
    FOCUSDLG_BROWSE_ALL_DOMAINS},
    wCompName, dwBufLen, Result, nil, 0);
  if dwError <> NO_ERROR then Exit;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  wCompName: array [0..MAX_COMPUTERNAME_LENGTH + 1] of WideChar;
begin
  if ComputerBrowser(Handle, wCompName, MAX_COMPUTERNAME_LENGTH + 1) then
    ShowMessage(wCompName)
  else
    ShowMessage('no computer selected');
end;
Nur steht dann überall was von einer Domäne, was natürlcih etwas verwirrt, da man ja eigentlich einen Computer auswählen soll. :gruebel:

marabu 26. Apr 2005 18:26

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Ich benutze den Standarddialog der Shell mit SHBrowseForFolder().

Grüße vom marabu

Luckie 26. Apr 2005 20:24

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Zitat:

Zitat von marabu
Ich benutze den Standarddialog der Shell mit SHBrowseForFolder().

Um Computer im Netzwerk zu suchen? Bist du sicher, dass du verstanden hast, was ich will?

marabu 26. Apr 2005 20:40

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Warum zweifelst Du an der Auffassungsgabe vom marabu?

Luckie 27. Apr 2005 13:37

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Zitat:

Zitat von marabu
Warum zweifelst Du an der Auffassungsgabe vom marabu?

Warum sprichst du von dir selber in der Drittenpersoneinzahl? :mrgreen:

Warum ich daran zweifele? Weil ich den angesprochenen Dialog nur zum Auswählen von Ordnern kenne. Eventuell zeigst du mir mal, wie du ihn so einsetzt, dass er nur Computer im lokalen Netzwerk arbeitsgruppenübergreifend anzeigt.

marabu 27. Apr 2005 17:31

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Luckie
Warum sprichst du von dir selber in der Drittenpersoneinzahl? :mrgreen:

Tue ich das wirklich?

Zitat:

Zitat von Luckie
Eventuell zeigst du mir mal, wie du ihn so einsetzt, dass er nur Computer im lokalen Netzwerk arbeitsgruppenübergreifend anzeigt.

SHBrowseForFolder() listet Folder und Virtuelle Folder aus dem Shell-Namespace. Computer und Drucker sind virtuelle Folder. Achte auf BIF_BROWSEFORCOMPUTER im angehängten Code. Beim Aufruf der Funktion kannst du bestimmen, was der RootFolder sein soll. Näheres im PSDK.

Delphi-Quellcode:
FindComputer('Such dir einen Vogel aus:', CSIDL_NETWORK, sMachine);
Grüße vom marabu.

MathiasSimmack 27. Apr 2005 17:36

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Luckie hat auf seiner Homepage selbst eine SHBrowseForFolder-Lösung. Ich glaube, die hat er auch ganz allein entworfen, :stupid:. Der Dialog ist nützlich, wenn du dir die Netzwerkumgebung anzeigen lassen willst. Aber Suchen (so wie ich das verstehe: Rechnername eintippen -> Enter -> Computer wird gesucht) kannst du damit nicht.

Luckie 27. Apr 2005 20:15

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Nein nein, das passt schon. Danke marabu, das war es was ich brauchte. Habe nur nicht gewusst, dass der BrowsForFolder Dialog das auch kann. ;)

Achm, was mir da noch einfällt: Klappt das jetzt auch arbeitsgruppenübergreifend?

marabu 28. Apr 2005 06:28

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Zitat:

Zitat von Luckie
Klappt das jetzt auch arbeitsgruppenübergreifend?

Das Fenster stellt einen Browser zur Verfügung. Wenn du CSIDL_NETWORK für den root folder nimmst, dann kannst du in jede Arbeitsgruppe rein navigieren.

Dialog-basiertes Suchen im Sinne von MathiasSimmack geht einfacher:

Delphi-Quellcode:
function SHFindComputer(pidlRoot: PItemIDList; pidlSaveFile: PItemIDList): boolean;
  stdcall; external 'Shell32.dll' index 91;
Grüße vom marabu

Luckie 28. Apr 2005 10:02

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
"Computer auswählen" trifft es wohl besser, was ich will.

MathiasSimmack 28. Apr 2005 10:09

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Kann es sein, dass "SHFindComputer" unter 2000 und XP nicht mehr funktioniert? :gruebel: Wundern würde es mich nicht, weil die XP-Suchfunktion ja so ein Explorer-Addin ist. Ist bei 2000 IMHO auch so. Kann auch sein, dass mir langsam mein Delphi-Wissen abhanden kommt (sch*** CSharp :mrgreen:), aber bei mir erscheint bei "SHFindComputer" gerade nichts.

Luckie 28. Apr 2005 10:11

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Guck mal in der DLL nach den Namen und lad sie über den Namen anstatt über den Index.

Mephistopheles 28. Apr 2005 10:15

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
In der Shell32.dll von Windows 2000 gibt es besagte Funktion jedenfalls nicht, das ist richtig. Die korrekte Lösung ist aber sowieso der modernisierte Browse-Dialog. Der, den du (Luckie) vorher benutzt hast, stammt noch von NT4 und früher.

Hier einmal alle die mit SHFi* beginnen:
Code:
SHFileOperation
SHFileOperationA
SHFileOperationW
Alle mit SH*:
Code:
SHEmptyRecycleBinA
SHEmptyRecycleBinW
SheRemoveQuotesA
SheRemoveQuotesW
SheSetCurDrive
SheShortenPathA
SheShortenPathW
SHExtractIconsW
SHFileOperation
SHFileOperationA
SHFileOperationW
SHFormatDrive
SHFreeNameMappings
SHGetDataFromIDListA
SHGetDataFromIDListW
SHGetDesktopFolder
SHGetDiskFreeSpaceA
SHGetDiskFreeSpaceExA
SHGetDiskFreeSpaceExW
SHGetFileInfo
SHGetFileInfoA
SHGetFileInfoW
SHGetFolderLocation
SHGetFolderPathA
SHGetFolderPathW
SHGetIconOverlayIndexA
SHGetIconOverlayIndexW
SHGetInstanceExplorer
SHGetMalloc
SHGetNewLinkInfo
SHGetNewLinkInfoA
SHGetNewLinkInfoW
SHGetPathFromIDList
SHGetPathFromIDListA
SHGetPathFromIDListW
SHGetSettings
SHGetSpecialFolderLocation
SHGetSpecialFolderPathA
SHGetSpecialFolderPathW
SHHelpShortcuts_RunDLL
SHHelpShortcuts_RunDLLA
SHHelpShortcuts_RunDLLW
SHInvokePrinterCommandA
SHInvokePrinterCommandW
SHIsFileAvailableOffline
SHLoadInProc
SHLoadNonloadedIconOverlayIdentifiers
SHPathPrepareForWriteA
SHPathPrepareForWriteW
SHQueryRecycleBinA
SHQueryRecycleBinW
SHUpdateRecycleBinIcon

MathiasSimmack 28. Apr 2005 10:18

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
An dem Namen würde ich das jetzt sowieso nicht festmachen wollen. Wir hatten schon mal einen Beitrag über so genannte "inoffizielle Dialoge", wie etwas den Ausführen-Dialog. Aber das kannst du nicht wissen, da warst du noch nicht angemeldet. :stupid: Jedenfalls waren die meisten dieser Dialoge auch bloß per Index erreich- und nutzbar.

Wie gesagt, da unserem Luckie ja das Browsen reicht, spielt´s keine große Rolle. Mich hat´s nur interessiert, aber scheinbar ist das mal so ein Fall, wo der Index nicht mehr stimmt, bzw. wo es den Dialog überhaupt nicht mehr gibt.

Mephistopheles 28. Apr 2005 10:23

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Zitat:

Zitat von MathiasSimmack
An dem Namen würde ich das jetzt sowieso nicht festmachen wollen. Wir hatten schon mal einen Beitrag über so genannte "inoffizielle Dialoge", wie etwas den Ausführen-Dialog. Aber das kannst du nicht wissen, da warst du noch nicht angemeldet. :stupid: Jedenfalls waren die meisten dieser Dialoge auch bloß per Index erreich- und nutzbar.

Siehe:
Mod-Osterhasi Luckie schrieb:
Guck mal in der DLL nach den Namen und lad sie über den Namen anstatt über den Index.

MathiasSimmack 28. Apr 2005 10:32

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Und das bedeutet, bezogen auf mein Zitat, jetzt was? :gruebel:

marabu 28. Apr 2005 11:14

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Zitat:

Zitat von MathiasSimmack
Kann es sein, dass "SHFindComputer" unter 2000 und XP nicht mehr funktioniert? :gruebel: Wundern würde es mich nicht, weil die XP-Suchfunktion ja so ein Explorer-Addin ist.

SHFindComputer ist eine undokumentierte Funktion der SHELL32.DLL seit Windows 95. Bei mir funktioniert sie unter XP SP2 und W2K SP4.

Grüße vom marabu

Luckie 28. Apr 2005 11:16

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Zitat:

Zitat von marabu
SHFindComputer ist eine undokumentierte Funktion der SHELL32.DLL seit Windows 95. Bei mir funktioniert sie unter XP SP2 und W2K SP4.

Dann poste doch mal bitte etwas Code.

marabu 28. Apr 2005 11:27

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Wollt ihr mich in Atem halten?

Ich muss ab und zu auch Geld verdienen!

Delphi-Quellcode:
program FC;

{$APPTYPE CONSOLE}

uses
  ActiveX,
  ShlObj;

function SHFindComputer(pidlRoot: PItemIDList; pidlSavedSearch: PItemIDList): boolean;
  stdcall; external 'Shell32.dll' index 91;

begin
  OleInitialize(nil);
  SHFindComputer(nil, nil);
end.
Grüße vom marabu

Luckie 28. Apr 2005 11:44

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Geht bei mir: Windows 2000 SP4.

MathiasSimmack 28. Apr 2005 11:45

Re: Computer arbeitsgruppen übergreifend suchen mit Win-Dial
 
Zitat:

Zitat von marabu
Wollt ihr mich in Atem halten?

Erstens das, ... :lol:, und zweitens:

Zitat:

Delphi-Quellcode:
OleInitialize(nil);

Daran hätte ich auch selbst denken können. :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz