AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi DeleteVolumeMountPoint funktioniert nicht
Thema durchsuchen
Ansicht
Themen-Optionen

DeleteVolumeMountPoint funktioniert nicht

Ein Thema von himitsu · begonnen am 31. Jul 2006 · letzter Beitrag vom 1. Aug 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von himitsu
himitsu

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

DeleteVolumeMountPoint funktioniert nicht

  Alt 31. Jul 2006, 14:27
Die Definition stimmt:
Delphi-Quellcode:
Function SetVolumeMountPointW(VolumeMountPoint, VolumeName: PWideChar): LongBool;
  External 'kernel32.dllName 'SetVolumeMountPointW';
Function DeleteVolumeMountPointW(VolumeMountPoint: PWideChar): LongBool;
  External 'kernel32.dllName '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:
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
$2B or not $2B
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: DeleteVolumeMountPoint funktioniert nicht

  Alt 31. Jul 2006, 14:40
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: DeleteVolumeMountPoint funktioniert nicht

  Alt 31. Jul 2006, 15:15
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?

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
$2B or not $2B
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#4

Re: DeleteVolumeMountPoint funktioniert nicht

  Alt 31. Jul 2006, 15:22
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...
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#5

Re: DeleteVolumeMountPoint funktioniert nicht

  Alt 31. Jul 2006, 19:02
also wenn dann Pointer(@Drive[1]), und dann wird trotzdem irgendwas explodieren, weil der terminating 0-char fehlt....
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: DeleteVolumeMountPoint funktioniert nicht

  Alt 31. Jul 2006, 19:05
Erinnere ich mich falsch, oder pappt Delphi nicht doch ein #0-Zeichen ans Ende jedes strings?
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#7

Re: DeleteVolumeMountPoint funktioniert nicht

  Alt 31. Jul 2006, 19:15
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: DeleteVolumeMountPoint funktioniert nicht

  Alt 31. Jul 2006, 19:22
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 .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: DeleteVolumeMountPoint funktioniert nicht

  Alt 31. Jul 2006, 19:53
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
DeleteVolumeMountPointA('F:\') False zurück mit der Meldung "...Zugriff verweigert...".
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#10

Re: DeleteVolumeMountPoint funktioniert nicht

  Alt 1. Aug 2006, 07:19
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:45 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