![]() |
DeleteVolumeMountPoint funktioniert nicht
Die Definition stimmt:
Delphi-Quellcode:
Aufrufen tu ich es so:
Function SetVolumeMountPointW(VolumeMountPoint, VolumeName: PWideChar): LongBool;
External 'kernel32.dll' Name 'SetVolumeMountPointW'; Function DeleteVolumeMountPointW(VolumeMountPoint: PWideChar): LongBool; External 'kernel32.dll' Name 'DeleteVolumeMountPointW';
Delphi-Quellcode:
Was in meinem Testfall dem entspricht:
If DeleteVolumeMountPointW(PWideChar(GetText(D.ComboBox4))) Then
Button1.Click Else ShowLastError;
Delphi-Quellcode:
Aber es kommt immer nur:
DeleteVolumeMountPoint('Y:\'#0);
Zitat:
Zitat:
Zitat:
Zitat:
System: WinXP SP2 Die beiden Funktionen, wie sie sich hinter den Buttons "Add" und "Delete" bei den "Locical Drives" in ![]()
Delphi-Quellcode:
Hab's natürlich auch schon in einogen Tests mit direkten Aufrufen, mit Sringconstanten, Stringvariablen und auch mit den AnsiVersionen versucht :cry:
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; |
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.
|
Re: DeleteVolumeMountPoint funktioniert nicht
eigentlich schon, denn GetText ist als
Code:
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:
Function GetText(Var O): [b]WideString[/b];
Zitat:
Code:
Wobei Poiunter keinen Unterschied zu PWideChar ausmachen sollte ^^
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; Und nein, es funktioniert nicht :cry: |
Re: DeleteVolumeMountPoint funktioniert nicht
Und wenn du es mal so versuchst:
Delphi-Quellcode:
nur so als Idee, keine Ahnung, ob's funktioniert...
var
Drive: String begin Drive := 'X:\'; DeleteVolumeMountPointW(Pointer(Drive)); end; |
Re: DeleteVolumeMountPoint funktioniert nicht
also wenn dann Pointer(@Drive[1]), und dann wird trotzdem irgendwas explodieren, weil der terminating 0-char fehlt....
|
Re: DeleteVolumeMountPoint funktioniert nicht
Erinnere ich mich falsch, oder pappt Delphi nicht doch ein #0-Zeichen ans Ende jedes strings? ;)
|
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.
|
Re: DeleteVolumeMountPoint funktioniert nicht
Zitat:
@Dax: Aber nur bei LongStrings :zwinker: :duck: . |
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:
False zurück mit der Meldung "...Zugriff verweigert...".
DeleteVolumeMountPointA('F:\')
|
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:
Beim obigen Code scheitert natuerlich der zweite Aufruf wenn der erste erfolgreich ist. Es soll nur als Illustration zum korrekten Aufruf dienen.
var
AName: string; WName: WideString; begin AName := 'F:\'; WName := 'F:\'; DeleteVolumeMountPointA(PChar(AName)); DeleteVolumeMountPointW(PWideChar(WName)); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr. |
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