Announcement

Collapse
No announcement yet.

Gibt es einen API - Dialog für vorhandene Computer in einem Netzwerk ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Gibt es einen API - Dialog für vorhandene Computer in einem Netzwerk ?

    Hallo,

    gibt es einen API - Dialog der mir alle Computer in einem Netzwerk zeigt ?

    Bei der Komponente "TDCOMConnection" wird so ein Dialog verwendet, wenn ich auf "ComputerName" klicke.

    Vielen Dank

    Ciao Torsten

  • #2
    Hallo,

    zusammen mit Delphi werden im <b>Source</b>-Unterverzeichnis auch die ganzen Units der VCL ausgeliefert. Somit kann man dort nachschauen, welcher <b>PropertyEditor</b> für diese Eigenschaft im Objektinspektor zuständig ist. In der Delphi-Unit "MidReg.pas" findet sich dann die genaue Implementierung unter <b>procedure TComputerNameProperty.Edit;</b>. Und in dieser Methode wird auf die Win32-API-Funktion <b>SHBrowseForFolder</b> zurückgegriffen - somit ist das "Geheimnis gelüftet"

    Comment


    • #3
      Hallo,

      danke für den Tip. Habe die Implementierung gefunden und konnte den Dialog auch aufrufen.

      Danke !

      Ciao Torste

      Comment


      • #4
        Zeigt dieser Dialog auch die Computer an, die momentan nicht eingeschaltet sind

        Comment


        • #5
          Hallo,

          das kommt darauf an, wann diese Rechner abgeschaltet wurden. Je nach Netzwerk-Konfiguration übernimmt ein Rechner die Aufgabe des "Computersuchdienstes" und führt eine Liste aller aktiven Rechner. Damit keine unnötige Netzlast generiert wird, gibt es einen ausgefeilten Mechanismus, der in variablen Zeitabständen nachprüft, welche Rechner noch da sind.

          Comment


          • #6
            Ich quäle mich auch mit diesem Problem von Torsten herum. Allerdings habe ich die "midreg.pas" nicht (habe nur Delphi4-Pro). Wäre es möglich, die Funktion mal komplett anzugeben? (auch als eMail) Mein Programm zeigt mir zwar die Netzwerkumgebung mit den vorhandenen Computern an, aber mit "ShGetPathFromIDList" bekomme ich keinen Rückgabewert in meinem "Edit1.Text"-Control. Was mache ich falsch?

            Besten Dank, Mathias

            Comment


            • #7
              Hallo,

              das folgende Beispiel habe ich in meinem Archiv gefunden:
              <pre>
              uses ActiveX, ShlObj;

              type
              TBrowseOption= (boFolders, boComputers, boPrinters );
              TBrowseOptions = Set of TBrowseOption;

              function BrowseForFolder(const Prompt: String;
              Options: TBrowseOptions): String;
              const
              OpValues : Array [TBrowseOption] of UINT =
              (BIF_RETURNONLYFSDIRS,
              BIF_BROWSEFORCOMPUTER,
              BIF_BROWSEFORPRINTER);
              var
              aBI : TBrowseInfo;
              szBuffer : array [0..MAX_PATH] of Char;
              pidl : pItemIDList;
              aBO : TBrowseOption;
              begin
              Result := EmptyStr;
              with aBI do
              begin
              hwndOwner := GetActiveWindow;
              pidlRoot := nil;
              pszDisplayName := @szBuffer;
              szBuffer[0] := #0;
              lpszTitle := PChar(Prompt);
              ulFlags:= 0;
              for aBO := Low(aBO) to High(aBO) do
              if aBO in options then
              ulFlags := ulFlags or OpValues[aBO];
              lpfn := nil;
              lParam := 0;
              iImage := 0;
              end;
              pidl := ShBrowseForFolder(aBI);
              if pidl <> nil then
              begin
              if SHGetPathFromIDList(pidl, szBuffer) then
              Result := StrPas(szBuffer);
              CoTaskMemFree(pidl);
              end
              end;

              procedure TForm1.Button1Click(Sender: TObject);
              begin
              ShowMessage(BrowseForFolder('Delphi-Test', [boFolders]));
              end;
              </pre&gt

              Comment


              • #8
                Danke schön, Herr Kosch. Ich hab´s probiert, aber es funktioniert trotzdem nicht so richtig. Verzeichnisse usw. zeigt mir die Funktion ja an, aber nicht die Computer im Netzwerk, die ich mir aussuche. Irgendwas liefert die Funktion zurück, aber es muss wohl mit #0 beginnen, weil "ShowMessage" nur ein langes Nichts anzeigt. Ist noch irgendwo eine Einstellung zu treffen, oder bin ich einfach nur zu dusslig

                Comment


                • #9
                  Hallo Mathias,

                  ich habe den API Dialog zum "Computer suchen" in einer Komponente gekapselt. Die Komponente mit den Sourcen kann ich Dir gerne schicken.

                  Falls Du interesse hast, schicke mir doch einfach eine Mail an

                  [email protected]

                  Ciao Torste

                  Comment


                  • #10
                    Hallo,

                    man eben doch jedesmal das Kleingedruckte lesen - die Suche nach einem Computer ist ein Sonderfall. Das folgende Beispiel funktioniert aber:
                    <pre>
                    uses ActiveX, ShlObj;

                    function BrowseForComputer(const Prompt: String): String;
                    var
                    aBI : TBrowseInfo;
                    szBuffer : array [0..MAX_PATH] of Char;
                    pidl : pItemIDList;
                    begin
                    Result := EmptyStr;
                    with aBI do
                    begin
                    hwndOwner := GetActiveWindow;
                    pidlRoot := nil;
                    pszDisplayName := @szBuffer;
                    szBuffer[0] := #0;
                    lpszTitle := PChar(Prompt);
                    ulFlags:= BIF_BROWSEFORCOMPUTER;;
                    lpfn := nil;
                    lParam := 0;
                    iImage := 0;
                    end;
                    pidl := ShBrowseForFolder(aBI);
                    if pidl <> nil then
                    CoTaskMemFree(pidl);
                    Result := szBuffer;
                    end;

                    procedure TForm1.Button1Click(Sender: TObject);
                    begin
                    ShowMessage(BrowseForComputer('Delphi-Test'));
                    end;
                    </pre&gt

                    Comment


                    • #11
                      Ich weiß, Herr Kosch. Ich habe schon bemerkt, dass ich die Lösung im Prinzip die ganze Zeit vor Augen hatte. Aus "alten" Verzeichnis-Suche-Tagen habe ich mich auf das "GetPathFromIdList" eingeschossen und das Rückgabeergebnis von "pszDisplayName" nicht für voll genommen. Ja, ja, ich muss eben doch noch sehr viel lernen. (Asche auf mein Haupt.)
                      Torsten hat´s mir durch seine Komponente auch schon gezeigt, wo mein Fehler lag.
                      Vielen Dank trotzdem, denn ohne Sie und Torsten hätte ich wahrscheinlich ewig nach dem Fehler gesucht.

                      Viele Grüße, Mathias

                      Comment

                      Working...
                      X