AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Laufwerk GUID Laufwerksbuchstabe auslesen / unmount
Thema durchsuchen
Ansicht
Themen-Optionen

Laufwerk GUID Laufwerksbuchstabe auslesen / unmount

Ein Thema von berens · begonnen am 15. Jul 2009 · letzter Beitrag vom 15. Jul 2009
Antwort Antwort
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#1

Laufwerk GUID Laufwerksbuchstabe auslesen / unmount

  Alt 15. Jul 2009, 04:28
Hi!

Mal wieder nervlich am Ende, wie man anhand der aktuellen Uhrzeit vielleicht erahnen kann.

Ich will einfach nur Anhand einer GUID meine USB-Festplatte unmounten.
Der Mountvol Befehl von Windows kann nur einen bestimmten Laufwerksbuchstaben unmounten (z.B. F: ), nicht aber die GUID (z.B. \\?\Volume{faf095ab-31d3-11de-92c2-001d09d96fe8}\ )

Bezugnehmend auf http://www.delphipraxis.net/internal...ht=volume+guid
Delphi-Quellcode:
Function GetVolumeNameForVolumeMountPoint(lpszVolumeMountPoint: PAnsiChar; lpszVolumeName: PAnsiChar; cchBufferLength: DWORD;): Bolean; stdcall; external 'kernel32.dllname 'GetVolumeNameForVolumeMountPoint';
);
soll ich damit zwar aaaaangeblich die Info bekommen, tatsächlich bekomm ich aber als Ausgabe wieder nur die GUID zurück...


Noch glücklicher wäre ich, wenn mir wer sagen kann, wie ich ein Laufwerk direkt anhand seiner GUID unmounten kann. Vielen Dank.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

Re: Laufwerk GUID Laufwerksbuchstabe auslesen / unmount

  Alt 15. Jul 2009, 08:19
der VolumeName ist die GUID, also kein Wunder, daß da sowas bei rauskommt

du brauchst also die Umkehrfunktion.
$2B or not $2B
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Laufwerk GUID Laufwerksbuchstabe auslesen / unmount

  Alt 15. Jul 2009, 12:09
Wie könnte die "Umkehrfunktion" lauten? GetVolumeMountPointForVolumeName gibt es nicht.

Wenn Windows alles mit der GUID machen will, warum kann man dann nicht mit der GUID einen Laufwerksbuchstaben zurücknehmen (weil ich ja nicht weiß, wie die lautet, ob F: oder G: etc.)?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: Laufwerk GUID Laufwerksbuchstabe auslesen / unmount

  Alt 15. Jul 2009, 12:17
ich weiß jetzt allerdings auch nicht, wie sich diese Funktion nennen könnte,

aber im Notfall könntest du dir alle VolumeMointPoints auflisten,
jeweils den VolumeName über GetVolumeNameForVolumeMountPoint erhalten
und diesen dann mit dem Gesuchten vergleichen.


[add]
nja, mal ganz im Ernst ... über MSDN-Library durchsuchenGetVolumeNameForVolumeMountPoint findet man Funktionen wie z.B. MSDN-Library durchsuchenFindFirstVolumeMountPoint, welche vermutlich genau das Gewünschte liefern würden.
$2B or not $2B
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Laufwerk GUID Laufwerksbuchstabe auslesen / unmount

  Alt 15. Jul 2009, 12:56
Also damit klappt es, ich will das Ganze noch als Kommandozeilen Parameter erweitern, das ist ja aber kein Problem.

Meine Frage: Stimmt das mit den Variablen x und a? Ich glaube nicht ganz, aber atm funktioniert es :/

Delphi-Quellcode:
function GetVolumePathNamesForVolumeName(lpszVolumeName, lpszVolumePathNames: LPCSTR;
  cchBufferLength: DWORD; var lpcchReturnLength: DWORD): BOOL; stdcall;

Delphi-Quellcode:
program unmount;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  windows,
  ShellAPI,
  ShellObjExtended in 'ShellObjExtended.pas';

var
  t: string;
  x: array[0..MAX_PATH] of char;
  a: Cardinal;


begin
  try
    if ParamCount < 1 then begin
      writeln('Unmounts a MountPoint by its VolumeName (GUID)');
      writeln('USAGE: unmount GUID');
      writeln('EXAMPLE: unmount \\?\Volume{faf095ab-31d3-11de-92c2-001d09d96fe8}\');
      writeln(' ');
      writeln('You can determine your drive''s GUID by the command MOUNTVOL');
      exit;
    end;
    a := MAX_PATH;
    GetVolumePathNamesForVolumeName(pchar(ParamStr(1)), @x, MAX_PATH, a);
    ShellExecute(0, 'open', 'mountvol', pchar(x + ' /D'), '', SW_HIDE);
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.
Delphi-Quellcode:
unit ShellObjExtended;

interface

uses
  Windows, Messages, ShlObj;

const
  IID_IColumnProvider: TGUID = (
    D1: $E8025004; D2: $1C42; D3: $11D2; D4: ($BE, $2C, $0, $A0, $C9, $A8, $3D, $A1));

  SID_IColumnProvider = '{E8025004-1C42-11D2-BE2C-00A0C9A83DA1}';

  FILE_FLAG_OPEN_REPARSE_POINT = $00200000;
                                  
const
  MAX_COLUMN_NAME_LEN = 80;
  MAX_COLUMN_DESC_LEN = 128;

type
  HANDLE = Windows.THandle;

  SHCOLUMNINFO = packed record
    scid: SHCOLUMNID;
    vt: integer;
    fmt: DWORD;
    cChars: UINT;
    csFlags: dword;
    wszTitle: array[0..MAX_COLUMN_NAME_LEN - 1] of WideChar;
    wszDescription: array[0..MAX_COLUMN_DESC_LEN - 1] of WideChar;
  end;
  LPSHCOLUMNINFO = ^SHCOLUMNINFO;

  TShColumnInfo = SHCOLUMNINFO;
  PShColumnInfo = LPSHCOLUMNINFO;

  SHCOLUMNINIT = packed record
    dwFlags: ulong;
    dwReserved: ulong;
    wszFolder: array[0..MAX_PATH - 1] of WideChar;
  end;
  LPSHCOLUMNINIT = ^SHCOLUMNINIT;

  TShColumnInit = SHCOLUMNINIT;
  PShColumnInit = LPSHCOLUMNINIT;

const
  SHCDF_UPDATEITEM = $00000001;

type
  SHCOLUMNDATA = packed record
    dwFlags: ULONG;
    dwFileAttributes: DWord;
    dwReserved: ULONG;
    pwszExt: PWideChar;
    wszFile: array[0..MAX_PATH - 1] of WideChar
  end;
  LPSHCOLUMNDATA = ^SHCOLUMNDATA;

  TShColumnData = SHCOLUMNDATA;
  PShColumnData = LPSHCOLUMNDATA;

  IColumnProvider = interface
    [SID_IColumnProvider]
    function Initialize(psci: PSHCOLUMNINIT): HResult; stdcall;
    function GetColumnInfo(dwIndex: DWORD; psci: PSHCOLUMNINFO): HResult; stdcall;
    function GetItemData(pscid: PSHCOLUMNID; pscd: PSHCOLUMNDATA; pvarData: Variant): HResult; stdcall;
  end;

// From Winbase.h
function GetVolumePathNameA(lpszFileName: LPCSTR; lpszVolumePathName: LPSTR;
  cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumePathNameA}
function GetVolumePathNameW(lpszFileName: LPCWSTR; lpszVolumePathName: LPWSTR;
  cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumePathNameW}
function GetVolumePathName(lpszFileName: LPCSTR; lpszVolumePathName: LPSTR;
  cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumePathName}

function GetVolumePathNamesForVolumeNameA(lpszVolumeName, lpszVolumePathNames: LPCSTR;
  cchBufferLength: DWORD; var lpcchReturnLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumePathNamesForVolumeNameA}
function GetVolumePathNamesForVolumeNameW(lpszVolumeName, lpszVolumePathNames: LPCWSTR;
  cchBufferLength: DWORD; var lpcchReturnLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumePathNamesForVolumeNameW}
function GetVolumePathNamesForVolumeName(lpszVolumeName, lpszVolumePathNames: LPCSTR;
  cchBufferLength: DWORD; var lpcchReturnLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumePathNamesForVolumeName}

function GetVolumeNameForVolumeMountPointA(lpszVolumeMountPoint: LPCSTR;
  lpszVolumeName: LPSTR; cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumeNameForVolumeMountPointA}
function GetVolumeNameForVolumeMountPointW(lpszVolumeMountPoint: LPCWSTR;
  lpszVolumeName: LPWSTR; cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumeNameForVolumeMountPointW}
function GetVolumeNameForVolumeMountPoint(lpszVolumeMountPoint: LPCSTR;
  lpszVolumeName: LPSTR; cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumeNameForVolumeMountPoint}

function FindFirstVolumeA(lpszVolumeName: LPSTR; cchBufferLength: DWORD): HANDLE; stdcall;
{$EXTERNALSYM FindFirstVolumeA}
function FindFirstVolumeW(lpszVolumeName: LPWSTR; cchBufferLength: DWORD): HANDLE; stdcall;
{$EXTERNALSYM FindFirstVolumeW}
function FindFirstVolume(lpszVolumeName: LPSTR; cchBufferLength: DWORD): HANDLE; stdcall;
{$EXTERNALSYM FindFirstVolume}

function FindNextVolumeA(hFindVolume: HANDLE; lpszVolumeName: LPSTR;
  cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM FindNextVolumeA}
function FindNextVolumeW(hFindVolume: HANDLE; lpszVolumeName: LPWSTR;
  cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM FindNextVolumeW}
function FindNextVolume(hFindVolume: HANDLE; lpszVolumeName: LPSTR;
  cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM FindNextVolume}

function FindVolumeClose(hFindVolume: HANDLE): BOOL; stdcall;
{$EXTERNALSYM FindVolumeClose}

function FindFirstVolumeMountPointA(lpszRootPathName: LPCSTR;
  lpszVolumeMountPoint: LPSTR; cchBufferLength: DWORD): HANDLE; stdcall;
{$EXTERNALSYM FindFirstVolumeMountPointA}
function FindFirstVolumeMountPointW(lpszRootPathName: LPCWSTR;
  lpszVolumeMountPoint: LPWSTR; cchBufferLength: DWORD): HANDLE; stdcall;
{$EXTERNALSYM FindFirstVolumeMountPointW}
function FindFirstVolumeMountPoint(lpszRootPathName: LPCSTR;
  lpszVolumeMountPoint: LPSTR; cchBufferLength: DWORD): HANDLE; stdcall;
{$EXTERNALSYM FindFirstVolumeMountPoint}

function FindNextVolumeMountPointA(hFindVolumeMountPoint: HANDLE;
  lpszVolumeMountPoint: LPSTR; cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM FindNextVolumeMountPointA}
function FindNextVolumeMountPointW(hFindVolumeMountPoint: HANDLE;
  lpszVolumeMountPoint: LPWSTR; cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM FindNextVolumeMountPointW}
function FindNextVolumeMountPoint(hFindVolumeMountPoint: HANDLE;
  lpszVolumeMountPoint: LPSTR; cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM FindNextVolumeMountPoint}

function FindVolumeMountPointClose(hFindVolumeMountPoint: HANDLE): BOOL; stdcall;
{$EXTERNALSYM FindVolumeMountPointClose}

implementation

function GetVolumePathNameA; external kernel32 name 'GetVolumePathNameA';
function GetVolumePathNameW; external kernel32 name 'GetVolumePathNameW';
function GetVolumePathName; external kernel32 name 'GetVolumePathNameA';

function GetVolumePathNamesForVolumeNameA; external kernel32 name 'GetVolumePathNamesForVolumeNameA';
function GetVolumePathNamesForVolumeNameW; external kernel32 name 'GetVolumePathNamesForVolumeNameW';
function GetVolumePathNamesForVolumeName; external kernel32 name 'GetVolumePathNamesForVolumeNameA';

function GetVolumeNameForVolumeMountPointA; external kernel32 name 'GetVolumeNameForVolumeMountPointA';
function GetVolumeNameForVolumeMountPointW; external kernel32 name 'GetVolumeNameForVolumeMountPointW';
function GetVolumeNameForVolumeMountPoint; external kernel32 name 'GetVolumeNameForVolumeMountPointA';

function FindFirstVolumeA; external kernel32 name 'FindFirstVolumeA';
function FindFirstVolumeW; external kernel32 name 'FindFirstVolumeW';
function FindFirstVolume; external kernel32 name 'FindFirstVolumeA';

function FindNextVolumeA; external kernel32 name 'FindNextVolumeA';
function FindNextVolumeW; external kernel32 name 'FindNextVolumeW';
function FindNextVolume; external kernel32 name 'FindNextVolumeA';

function FindVolumeClose; external kernel32 name 'FindVolumeClose';

function FindFirstVolumeMountPointA; external kernel32 name 'FindFirstVolumeMountPointA';
function FindFirstVolumeMountPointW; external kernel32 name 'FindFirstVolumeMountPointW';
function FindFirstVolumeMountPoint; external kernel32 name 'FindFirstVolumeMountPointA';

function FindNextVolumeMountPointA; external kernel32 name 'FindNextVolumeMountPointA';
function FindNextVolumeMountPointW; external kernel32 name 'FindNextVolumeMountPointW';
function FindNextVolumeMountPoint; external kernel32 name 'FindNextVolumeMountPointA';

function FindVolumeMountPointClose; external kernel32 name 'FindVolumeMountPointClose';

end.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

Re: Laufwerk GUID Laufwerksbuchstabe auslesen / unmount

  Alt 15. Jul 2009, 15:35
und das läuft wirklich?

Delphi-Quellcode:
t := '\\?\Volume{faf095ab-31d3-11de-92c2-001d09d96fe8}\';
GetVolumePathNamesForVolumeName(pchar(t), @x, MAX_PATH, a);
Writeln(x);
Writeln(a);
hätte mindestens erwartet, daß bei deiner Funktionsdefinition wegen des fehlenden @ gemeckert würde
(PChar <> Array of Char)

und das mit dem a wäre zwar nicht falsch, aber so ist es vermutlich verständlicher
$2B or not $2B
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Laufwerk GUID Laufwerksbuchstabe auslesen / unmount

  Alt 15. Jul 2009, 15:39
Habe es angepasst. Läuft mit beiden Varianten, natürlich benutze ich deine, da diese eher korrekt ist als meine

Woher kann ich denn erkennen, dass/ob die Funktion als Parameter eine Variable verlangt, oder ob eine Konstante (MAX_PATH) ausreicht?

Auf jeden Fall funktioniert das Programm soweit sehr gut, Danke himitsu
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:09 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