Einzelnen Beitrag anzeigen

Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#1

WinAPI verfügbare Domains auflisten

  Alt 28. Mai 2020, 08:34
Auf der Suche nach Möglichkeiten verfügbare Ressourcen in einem Netzwerk ausfindig zu machen, bin ich im Internet auf folgenden Beitrag gestoßen http://www.delphigroups.info/2/72/169815.html (Ich hab das einfach mal als Unit angehängt).

Das wollte ich mir jetzt mal genauer anschauen. Dabei bin ich auf 2 Fragen gestoßen.

Frage 1: LPDWORD bzw. DWORD. Ein DWORD kann ja nur positive Werte beinhalten. LPDWORD ist jawohl nur ein Pointer auf ein DWORD. In Zeile 145 der Unit steht:
Delphi-Quellcode:
procedure GetDomainList(const sNetwork : string; sl : TStrings);
var
  rNetRes : TNetResource;
begin
  if sl = nil then exit;
  sl.BeginUpdate;
  try
    sl.Clear;
    { Start here }
    with rNetRes do begin
      dwScope := RESOURCE_GLOBALNET;
      dwType := RESOURCETYPE_ANY ;
      dwDisplayType := RESOURCEDISPLAYTYPE_NETWORK;
      dwUsage := -2147483646;
      lpLocalName := nil;
      lpRemoteName := pChar(sNetwork);
      lpComment := nil;
      lpProvider := pChar(sNetwork);
    end;
    EnumNetRes(RESOURCE_GLOBALNET,RESOURCETYPE_Disk,3,@rNetRes,sl,ekDomain);
  finally
    sl.EndUpdate;
  end;
end;
dwUsage ist laut Windapi.Windows ein DWORD.
Dem zur Folge kann man da natürlich keine negativen Werte laden. Der Autor lädt hier einen Negativen Wert, was natürlich schon vom Compiler abgelehnt wird. Ob das ein Fehler vom Autor ist, oder ob das so mal funktioniert hat, kann ich natürlich auch nicht sagen.
Mögliche verfügbare Constanten wäre hier:
Delphi-Quellcode:
  RESOURCEUSAGE_CONNECTABLE = 1;
  RESOURCEUSAGE_CONTAINER = 2;
  RESOURCEUSAGE_NOLOCALDEVICE = 4;
  RESOURCEUSAGE_SIBLING = 8;
  RESOURCEUSAGE_ATTACHED = $00000010;
  RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE or RESOURCEUSAGE_CONTAINER or RESOURCEUSAGE_ATTACHED);
  RESOURCEUSAGE_RESERVED = DWORD($80000000);
Nur welche wäre für diese Funktion die Richtige? Oder kann ich da gar noch anderen Verwenden, die hier nicht aufgelistet sind?

Bei meinen Versuchen kam bisher noch nicht viel heraus. Vielleicht ist der Code auch zu alt. Denn laut Aussage des Autors war das für NT4. Aber die API-Aufrufe gibt es ja noch, demnach sollten sie ja noch Ergebnisse liefern.

Frage 2: Aufgerufen wird im Code WNetOpenEnum .
Meine Suche im Internet bringt mich aber immer zu WNetOpenEnumA bzw. zu WNetOpenEnumW .
In der Winapi.Windows sind aber alle 3 Varianten aufgeführt.
Delphi-Quellcode:
function WNetOpenEnum(dwScope, dwType, dwUsage: DWORD;
  lpNetResource: PNetResource; var lphEnum: THandle): DWORD; stdcall;
{$EXTERNALSYM WNetOpenEnumA}
function WNetOpenEnumA(dwScope, dwType, dwUsage: DWORD;
  lpNetResource: PNetResourceA; var lphEnum: THandle): DWORD; stdcall;
{$EXTERNALSYM WNetOpenEnumW}
function WNetOpenEnumW(dwScope, dwType, dwUsage: DWORD;
  lpNetResource: PNetResourceW; var lphEnum: THandle): DWORD; stdcall;
Ich nehmen mal an, dass die WNetOpenEnum (Ohne A oder W) intern auf eine der beiden gemappt wird. Welche wäre denn das?
Angehängte Dateien
Dateityp: pas uNetwork.pas (6,3 KB, 3x aufgerufen)
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat