Autor Beitrag
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Mi 02.06.04 18:13 
Hallo,
damit die Diskussion nicht in den FAQ weitergeht, erstelle ich einfach mal 'nen neuen Beitrag.

Ich denke schon, dass es sinnvoll ist, gemountete "Laufwerksverzeichnisse" zusammen mit "normalen" Laufwerken in einer Liste zu haben. Man denke hier an Linux, beidem es sogesehen sowieso immer nur ein Laufwerk geben würde (/). Trotzdem zeigen viele Programme auch die anderen Partitionen an, um einen besseren Überblick über die Speicherverteilung zu bekommen. Ich habe mir z.B. eine Partition C:\Programme\Delphi angelegt, damit ich Delphi nicht bei jeder Windowsinstallation neu installieren muss. Einen eigenen Buchstaben sollte die Partition nicht erhalten, damit der Arbeitsplatz nicht so überfüllt aussieht. Beim Speichern muss ich nun jedoch jedesmal den vollen Verzeichnisnamen eingeben, was sehr nervig ist. Das Auswählen aus einer Liste ist bestimmt schneller und einfacher.

MathiasSimmack hat folgendes geschrieben:
Das heißt, die Funktion könnte durchaus einmal mehrere Namen zurückliefern, die alle durch #0 voneinander getrennt sind und mit #0#0 enden. Das ignoriert dein o.g. Beispielaufruf und liefert grundsätzlich nur den ersten Namen zurück.
Warum soll den ein Mountpunkt mehrmals in einer Liste erscheinen, wenn es sich jedesmal um den selben handelt?

maxk

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 02.06.04 21:47 
Deswegen schrieb ich ja im FAQ-Bereich:
MathiasSimmack hat folgendes geschrieben:
Ich gebe zu, ich habe mich mit dem Thema "Mounting" unter 2000/XP bisher noch nicht beschäftigt. Evtl. klärst du mich mal auf.

;)

Zugegeben, warum sollte die Funktion mehrfach den gleichen Namen zurückliefern. Allerdings habe ich mir weder die Funktion noch die Beschreibung im PSDK ausgedacht. Du solltest also berücksichtigen, dass es mehrere Ergebnisse geben kann.
Vielleicht können das auch unterschiedliche Namen sein, was wohl bedeuten würde, dass man verschiedene Objekte ins gleiche Volume mounten kann? Keine Ahnung. Ich sagte ja: Ich weiß es nicht, aber im PSDK/MSDN steht
Zitat:
The GetVolumePathNamesForVolumeName function retrieves a list of path names for the specified volume name.

Wenn das nur ein Name ist, kein Problem
Sind es mehrere Namen (warum auch immer?), auch kein Problem.

FAlter hat folgendes geschrieben:
Ansonsten würde ich aber auch dazu tendieren, die gemounteten Verzeichnisse nicht in die Liste mit einzubeziehen.

Im Prinzip sehe ich das auch so, denn als Laufwerke in dem Sinn zählen sie dann ja wohl nicht. Zumal das Beispiel von maxk ja auch eine Partition ist, die keinen Laufwerksbuchstaben hat. Und wer ein vorhandenes Laufwerk (mit eigenem Buchstaben) noch mal mountet, der hat es ja ohnehin in der Liste.

Ein anderes Problem ist aber auch, dass sich "GetVolumePathNamesForVolumeName" eben auch nur ab Windows XP nutzen lässt. 2000-User können zwar die einzelnen Volumes auflisten. Aber sie können die Funktion nicht nutzen, um den oder die Pfade zu ermitteln.
Auch ein Punkt, den man berücksichtigen sollte.


Geändert von mir: K auf Hinweis von maxk ergänzt. ;)


Zuletzt bearbeitet von MathiasSimmack am Mi 02.06.04 23:36, insgesamt 1-mal bearbeitet
maxk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Mi 02.06.04 22:09 
Ich heiße maxk :twisted: 8)

Okay zum Thema: Man kann einer Partition sowohl Laufwerksbuchstaben alsauch Verzeichnisse zuordnen. Ich kann sogar HDA1 als C: und C:\Test mounten. Dann entsteht eine "Kettenreaktion", was manchmal ganz praktisch ist...
MathiasSimmack hat folgendes geschrieben:
Ein anderes Problem ist aber auch, dass sich "GetVolumePathNamesForVolumeName" eben auch nur ab Windows XP nutzen lässt. 2000-User können zwar die einzelnen Volumes auflisten. Aber sie können die Funktion nicht nutzen, um den oder die Pfade zu ermitteln.
Auch ein Punkt, den man berücksichtigen sollte.

Naja, Windows XP User sind hier eindeutig im Vorteil :tongue:

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 02.06.04 23:34 
maxk hat folgendes geschrieben:
Ich heiße maxk :twisted: 8)

Okay. Ich dachte nur, ich kann es weglassen, weil dich deine Eltern sicher nicht Maxk genannt haben. Oder? ;)

Zitat:
Okay zum Thema: Man kann einer Partition sowohl Laufwerksbuchstaben alsauch Verzeichnisse zuordnen. Ich kann sogar HDA1 als C: und C:\Test mounten. Dann entsteht eine "Kettenreaktion", was manchmal ganz praktisch ist...

Ich kann leider gar nichts mounten. :cry: Ich hab´s mit der entsprechenden Funktion versucht, aber die liefert mir leider immer false zurück. Jetzt wäre die Frage ob ich versehentlich einen Dienst o.ä. deaktiviert habe, das dafür zuständig ist, dass man mounten kann. :?

Zitat:
Naja, Windows XP User sind hier eindeutig im Vorteil :tongue:

Da ich XP habe, stört´s mich nicht weiter. Aber man könnte bei Gelegenheit auch mal das Beispiel aus dem PSDK nach Delphi umsetzen. Das funktioniert ohne die XP-Funktion, soll aber trotzdem die Pfade anzeigen.
maxk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Do 03.06.04 13:46 
MathiasSimmack hat folgendes geschrieben:
Ich kann leider gar nichts mounten. :cry: Ich hab´s mit der entsprechenden Funktion versucht, aber die liefert mir leider immer false zurück. Jetzt wäre die Frage ob ich versehentlich einen Dienst o.ä. deaktiviert habe, das dafür zuständig ist, dass man mounten kann. :?
Bevor du mit API-Funktionen experimentierst, solltest du es erstmal auf gewöhnliche Weise machen: Erstmal brauchst du eine NTFS-Partition, in die du die Partitionen einhängen willst. Dann gehste in Computerverwaltung/Datenträgerverwaltung und klickst die einzuhängende Partition mit rechts an. Anschließend Laufwerksbuchstabe und -pfade ändern und du bekommst ein Fenster, in dem du nur noch auf Hinzufügen klicken musst. Wenn du an dieser Stelle angekommen bist, sollte es eigentlich fast von alleine gehen... :roll:

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 03.06.04 18:17 
Die gewöhnliche Weise ... wie gewöhnlich ... ;)
Folgendes basiert auf dem Beispiel im PSDK
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
//
// PSDK Sample
// ms-help://MS.PSDK.1033/fileio/base/mounting_a_volume_at_a_mount_point.htm
//
{$APPTYPE CONSOLE}
program mount;

uses
  Windows;

type
  TGetVolumeNameForVolumeMountPoint =
    function(lpszVolumeMountPoint, lpszVolumeName: PAnsiChar;
    cchBufferLength: dword): bool; stdcall;
  TSetVolumeMountPoint              =
    function(lpszVolumeMountPoint, lpszVolumeName: PAnsiChar):
    bool; stdcall;
const
  szKernelDll                       = 'kernel32.dll';
  BUFSIZE                           = MAX_PATH;
var
  GetVolumeNameForVolumeMountPoint  : TGetVolumeNameForVolumeMountPoint = nil;
  SetVolumeMountPoint               : TSetVolumeMountPoint = nil;
  dll                               : dword = 0;
  buf                               : array[0..BUFSIZE]of char;
  bFlag                             : boolean = false;
begin
  if(paramcount = 0then
  begin
    WriteLn('mounts a volume at a mount point.');
    WriteLn('for example, "mount c:\mnt\fdrive\ f:\');

    // Laut PSDK müssen die Pfade einen Backslash am Ende haben!
    // Wer so ein Programm also professionell entwickelt,
    // sollte auch eine entsprechende Prüffunktion einbauen und
    // den Backslash ggf. automatisch ergänzen.


    exit;
  end;

  // load "kernel32.dll"
  dll := LoadLibrary(szKernelDll);
  if(dll <> 0then
  try
    // import functions
    GetVolumeNameForVolumeMountPoint := GetProcAddress(dll,
      'GetVolumeNameForVolumeMountPointA');
    SetVolumeMountPoint              := GetProcAddress(dll,
      'SetVolumeMountPointA');

    if(@GetVolumeNameForVolumeMountPoint = nilor
      (@SetVolumeMountPoint = nilthen exit;

      
    bFlag := GetVolumeNameForVolumeMountPoint(pchar(paramstr(2)),buf,BUFSIZE);
    if(not bFlag) then
    begin
      WriteLn('Retrieving volume name for "' + paramstr(2) + '" failed.');
      exit;
    end;

    WriteLn('Volume name of "' + paramstr(2) + '" is "' + buf + '"');

    bFlag := SetVolumeMountPoint(pchar(paramstr(1)),buf);
    if(not bFlag) then
      WriteLn('Attempt to mount "' + paramstr(2) + '" at "' +
      paramstr(1) + '" failed.');
  finally
    FreeLibrary(dll);
  end;
end.

:)
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 03.06.04 22:08 
Und das Gegenstück (auch auf der Basis des PSDK-Beispiels):
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
//
// PSDK Sample
// ms-help://MS.PSDK.1033/fileio/base/unmounting_a_volume_at_a_mount_point.htm

//
{$APPTYPE CONSOLE}
program unmount;

uses
  Windows;

type
  TDeleteVolumeMountPoint = function(lpszVolumeMountPoint: PAnsiChar):
    bool; stdcall;
const
  szKernelDll             = 'kernel32.dll';
  szSuccessMsg            : array[boolean]of string =
    ('failed','succeeded');
  BUFSIZE                 = MAX_PATH;
var
  DeleteVolumeMountPoint  : TDeleteVolumeMountPoint = nil;
  dll                     : dword = 0;
  bFlag                   : boolean = false;
begin
  if(paramcount = 0then
  begin
    WriteLn('unmounts a volume from the volume mount point.');
    WriteLn('E.g. unmount c:\mnt\fdrive\');

    // Laut PSDK müssen die Pfade einen Backslash am Ende haben!
    // Wer so ein Programm also professionell entwickelt,
    // sollte auch eine entsprechende Prüffunktion einbauen und
    // den Backslash ggf. automatisch ergänzen.

    exit;
  end;

  // load "kernel32.dll"
  dll := LoadLibrary(szKernelDll);
  if(dll <> 0then
  try
    // import function
    DeleteVolumeMountPoint := GetProcAddress(dll,'DeleteVolumeMountPointA');
    if(@DeleteVolumeMountPoint = nilthen exit;

    bFlag := DeleteVolumeMountPoint(pchar(paramstr(1)));

    WriteLn('unmount ' + szSuccessMsg[bFlag] + ' in unmounting ' +
      'the volume at "' + paramstr(1) + '"');
  finally
    FreeLibrary(dll);
  end;
end.