Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi AV nach WNetGetUniversalName (https://www.delphipraxis.net/160484-av-nach-wnetgetuniversalname.html)

Alter Mann 15. Mai 2011 18:04

AV nach WNetGetUniversalName
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, ich bin mal wieder auf Eure Hilfe angewiesen.
Im Anhang der Source (Delphi 2009) zur einer kleinen Übung von mir:
Es werden alle logischen Laufwerke in einem TreeView dargestellt.
Unter anderem auch verbundene Netzwerk-Laufwerke.
Um den UNC-Pfad zu ermitteln benutze ich WNetGetUniversalName:
Delphi-Quellcode:
procedure TRemoteDrive.ReadDriveInfo;
var
  Buffer: UNIVERSAL_NAME_INFO;
  Size : DWORD;
begin
  FDeviceType := FILE_DEVICE_NETWORK;
  Size       := 1024;
  try
    if WNETGetUniversalName(PWideChar(FDriveLetter), UNIVERSAL_NAME_INFO_LEVEL, @Buffer, Size) = 0 then
    FRemotePath := Buffer.lpUniversalName;
  except
  end;
end;
doch Leider kommt es nach dem verlassen der Procedur zu einer AV und ich habe keinen Schimmer warum.
Also wer Lust und Laune hat mal den Source zu testen, ich wäre jedenfalls für Tipps dankbar.

VG Alter Mann

himitsu 15. Mai 2011 19:55

AW: AV nach WNetGetUniversalName
 
Dein Buffer ist nur 4 Byte und deine angegebenen 1024.
Das Ergebnis ist ein Pufferüberlauf und da braucht man sich nicht wundern, wenn es auch mal knallt.

Tipp: Schau mal ins MSDN und vorallem auf das Beispiel.
MSDN-Library durchsuchenWNETGetUniversalName

ringli 15. Mai 2011 20:03

AW: AV nach WNetGetUniversalName
 
Delphi-Quellcode:
function GetUNCName(const LocalPath: string): string;
var
  BufferSize: DWord;
  DummyBuffer: Byte;
  Buffer: Pointer;
  Error: DWord;
begin
  BufferSize := 1;
  WNetGetUniversalName(PChar(LocalPath), UNIVERSAL_NAME_INFO_LEVEL, @DummyBuffer, BufferSize);
  Buffer := AllocMem(BufferSize);
  try
    Error := WNetGetUniversalName(PChar(LocalPath), UNIVERSAL_NAME_INFO_LEVEL, Buffer, BufferSize);
    if Error <> NO_ERROR then
      begin
        SetLastError(Error);
        RaiseLastWin32Error;
      end;
    Result := PUniversalNameInfo(Buffer)^.lpUniversalName
  finally
    FreeMem(Buffer);
  end;
end;
Quelle: http://www.tek-tips.com/viewthread.c...34056&page=152

Keine Ahnung ob es funktioniert, da ich hier momentan kein Netzwerk zum Testen habe.

Alter Mann 16. Mai 2011 06:12

AW: AV nach WNetGetUniversalName
 
Danke, das war es!


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

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