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?