Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DeleteVolumeMountPoint funktioniert nicht (https://www.delphipraxis.net/74257-deletevolumemountpoint-funktioniert-nicht.html)

himitsu 31. Jul 2006 13:27


DeleteVolumeMountPoint funktioniert nicht
 
Die Definition stimmt:
Delphi-Quellcode:
Function SetVolumeMountPointW(VolumeMountPoint, VolumeName: PWideChar): LongBool;
  External 'kernel32.dll' Name 'SetVolumeMountPointW';
Function DeleteVolumeMountPointW(VolumeMountPoint: PWideChar): LongBool;
  External 'kernel32.dll' Name 'DeleteVolumeMountPointW';
Aufrufen tu ich es so:
Delphi-Quellcode:
If DeleteVolumeMountPointW(PWideChar(GetText(D.ComboBox4))) Then
  Button1.Click Else ShowLastError;
Was in meinem Testfall dem entspricht:
Delphi-Quellcode:
DeleteVolumeMountPoint('Y:\'#0);
Aber es kommt immer nur:
Zitat:

---------------------------
Fehler
---------------------------
Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch.

---------------------------
OK
---------------------------
Hab schon alles Mögliche versucht,
Zitat:

'Y:\'
'Y:'
'\\.\Y:\'
'\\.\Y:'
obwohl die Erste Angabe schon stimmen sollte.
Zitat:

[in] Pointer to a string that indicates the volume mount point to be unmounted. This may be a root directory (X:\, in which case the DOS drive letter assignment is removed) or a directory on a volume (X:\mnt\). A trailing backslash is required.
Im PSDK zwar sowas
Zitat:

To compile an application that uses this function, define the _WIN32_WINNT macro as 0x0500 or later. For more information, see Using the SDK Headers.
aber wie soll ich das in Delphi machen, wenn überhaupt nötig?


System: WinXP SP2



Die beiden Funktionen, wie sie sich hinter den Buttons "Add" und "Delete" bei den "Locical Drives" in http://www.delphipraxis.net/internal...=587272#587272 (siehe Anhang) verstecken:
Delphi-Quellcode:
Procedure TForm1.Button4Click(Sender: TObject);
  Var Di: Integer;
    D: TVolumeMountPoint_AddDialog;

  Begin
    Di := TreeView2.Selected.Index;
    D := TVolumeMountPoint_AddDialog.Create(Self);
    Try
      SetText(D.Label2, LogicalDrives[Di].VolumeName);
      If D.ShowModal = mrOK Then
        If SetVolumeMountPointW(PWideChar(GetText(D.Edit4)),
          PWideChar(LogicalDrives[Di].VolumeName + '\')) Then
          Button1.Click Else ShowLastError;
    Finally
      D.Free;
    End;
  End;

Procedure TForm1.Button5Click(Sender: TObject);
  Var Di, i: Integer;
    D: TVolumeMountPoint_DeleteDialog;
    S: WideString;

  Begin
    Di := TreeView2.Selected.Index;
    If LogicalDrives[Di].VolumePathNames = '' Then Exit;
    D := TVolumeMountPoint_DeleteDialog.Create(Self);
    Try
      SetText(D.Label2, LogicalDrives[Di].VolumeName);
      S := LogicalDrives[Di].VolumePathNames;
      While S <> '' do Begin
        i := Pos(#9, S);
        If i = 0 Then i := Length(S) + 1;
        D.ComboBox4.Items.Add(Copy(S, 1, i - 1));
        Delete(S, 1, i);
      End;
      D.ComboBox4.ItemIndex := 0;
      If D.ShowModal = mrOK Then
        If DeleteVolumeMountPointW(PWideChar(GetText(D.ComboBox4))) Then
          Button1.Click Else ShowLastError;
    Finally
      D.Free;
    End;
  End;
Hab's natürlich auch schon in einogen Tests mit direkten Aufrufen, mit Sringconstanten, Stringvariablen und auch mit den AnsiVersionen versucht :cry:

Muetze1 31. Jul 2006 13:40

Re: DeleteVolumeMountPoint funktioniert nicht
 
Da PWideChar nur ein Pointer auf ein WideChar ist, weiss ich nicht, ob bei diesem Typecast im Aufruf die interne Umwandlung in WideString ordentlich ausgelöst wird. Ich könnte mir vorstellen, das er hier nur den Pointer Typen ändert aber nicht den String selber.

himitsu 31. Jul 2006 14:15

Re: DeleteVolumeMountPoint funktioniert nicht
 
eigentlich schon, denn GetText ist als
Code:
Function GetText(Var O): [b]WideString[/b];
definiert und wie gesagt, ich hab es auch schon mit direkten Angaben also wo ich versucht hatte das 'Y:\' direkt zu übergeben, weder Wide, noch Ansi (natürlich an die Funktion DeleteVolumeMountPointA mit PAnsiChar) nicht funktioniert, immer sagt der mir was von falscher Syntax? :gruebel:

Zitat:

Zitat von Daniel G
Und wenn du es mal so versuchst:
nur so als Idee, keine Ahnung, ob's funktioniert...

nicht ganz ... eher so

Code:
var Drive: String
begin
  Drive := 'X:\';
  DeleteVolumeMountPoint[color=#ff0000]A[/color](Pointer(Drive));
end;[/delphi]
[delphi]var Drive: [color=#ff0000]WideString[/color]
begin
  Drive := 'X:\';
  DeleteVolumeMountPointW(Pointer(Drive));
end;
Wobei Poiunter keinen Unterschied zu PWideChar ausmachen sollte ^^

Und nein, es funktioniert nicht :cry:

Daniel G 31. Jul 2006 14:22

Re: DeleteVolumeMountPoint funktioniert nicht
 
Und wenn du es mal so versuchst:

Delphi-Quellcode:
var
Drive: String
begin
Drive := 'X:\';
DeleteVolumeMountPointW(Pointer(Drive));
end;
nur so als Idee, keine Ahnung, ob's funktioniert...

DGL-luke 31. Jul 2006 18:02

Re: DeleteVolumeMountPoint funktioniert nicht
 
also wenn dann Pointer(@Drive[1]), und dann wird trotzdem irgendwas explodieren, weil der terminating 0-char fehlt....

Dax 31. Jul 2006 18:05

Re: DeleteVolumeMountPoint funktioniert nicht
 
Erinnere ich mich falsch, oder pappt Delphi nicht doch ein #0-Zeichen ans Ende jedes strings? ;)

DGL-luke 31. Jul 2006 18:15

Re: DeleteVolumeMountPoint funktioniert nicht
 
also wenn es schon die Längeninformation ins erste Byte tut, warum dann noch ein #0 ans Ende? afaik kann Delphi wunderbar mit #0 in strings umgehen, was dagegen spricht, dass das als terminator fungiert.

Khabarakh 31. Jul 2006 18:22

Re: DeleteVolumeMountPoint funktioniert nicht
 
Zitat:

Zitat von DGL-luke
also wenn es schon die Längeninformation ins erste Byte tut, warum dann noch ein #0 ans Ende?

Um eben diese Kompatibilität zu erreichen ;) ?

@Dax: Aber nur bei LongStrings :zwinker: :duck: .

SirThornberry 31. Jul 2006 18:53

Re: DeleteVolumeMountPoint funktioniert nicht
 
Das einzige was mir auffällt ist das die Aufrufkonvention bei dir nicht stimmen dürfte. Oder ist das nur ein Kopierfehler? Anonsten dürften die C-Dll's wohl kaum mit der Register-Convention klar kommen.

Ansonsten gibt mir
Delphi-Quellcode:
DeleteVolumeMountPointA('F:\')
False zurück mit der Meldung "...Zugriff verweigert...".

Robert Marquardt 1. Aug 2006 06:19

Re: DeleteVolumeMountPoint funktioniert nicht
 
Sir Thornberry hat recht. Die Aufrufkonvention muss stdcall sein.
Das er "Zugriff verweigert" bekommt duerfte daran liegen das er nicht Admin ist oder das noch ein offener Filehandle bzw eine aktuelle Directory auf das Volume zeigt.
Delphi-Quellcode:
var
  AName: string;
  WName: WideString;
begin
  AName := 'F:\';
  WName := 'F:\';
  DeleteVolumeMountPointA(PChar(AName));
  DeleteVolumeMountPointW(PWideChar(WName));
end;
Beim obigen Code scheitert natuerlich der zweite Aufruf wenn der erste erfolgreich ist. Es soll nur als Illustration zum korrekten Aufruf dienen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr.
Seite 1 von 2  1 2      

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