GetVolumeInformation - wie verwendet man es richtig?

H

harvi

Hallo,

ich versuche gerade eine DLL mit einem Passwortschutz zu sichern. Mein Passwortschutz soll dabei auf der VolumeSerial aufbauen. Aber genau das ist dann auch schon das Problem.

Bei MSDN bin ich dann über GetVolumeInformation gestolpert und habe dies direkt in meine DLL integriert.
Code:
BOOL WINAPI GetVolumeInformation(
  LPCTSTR lpRootPathName,
  LPTSTR lpVolumeNameBuffer,
  DWORD nVolumeNameSize,
  LPDWORD lpVolumeSerialNumber,
  LPDWORD lpMaximumComponentLength,
  LPDWORD lpFileSystemFlags,
  LPTSTR lpFileSystemNameBuffer,
  DWORD nFileSystemNameSize
);
Soweit so gut, doch nun beginnen meine Problem. Wie kriege ich nun die lpVolumeSerialNumber heraus?

Ich habe es mit dieser und anderen Kombinationen getestet, doch keine hat funktioniert.
Code:
DWORD dwVolumeSerialNumber;
LPCTSTR lpRootPathName = "C:\\";
GetVolumeInformation( lpRootPathName, 0, 0, &dwVolumeSerialNumber, 0, 0, 0, 0 );
Der Compiler gibt hier "error C2440: 'Initialisierung': 'const char [4]' kann nicht in 'LPCTSTR' konvertiert werden" zurück, was ja auch zugegebenermaßen logisch klingt, doch ich komme im Moment einfach nicht weiter. Bei Google findet man leider nur X-mal dieselbe Definition von GetVolumeInformation oder ständig die gleichen Codeschnippsel.

Ich hoffe wirklich, dass mir jemand helfen kann.

MFG David
 
Zuletzt bearbeitet von einem Moderator:
Hallo, das sieht nach UNICODE-Problem aus. Versuch's mal so:
C++:
LPCTSTR lpRootPathName = _T("C:\\");
Gruß
MCoder
 
Hallo,

danke für deine Antwort. Leider gibt der Compiler nun folgende Meldung zurück:
error C3861: "_T": Bezeichner wurde nicht gefunden.
Vielleicht habe ich das ganze auch nur falsch aufgezogen?

MFG David
 
Include entweder <tchar.h> oder ersetze das universellere _T-Makro durch L:

LPCTSTR lpRootPathName = L"C:\\";
 
Sorry, das "_T"-Makro benötigt ein spezielles Include. So sollte es aber gehen:
C++:
LPCTSTR lpRootPathName = L"C:\\";
Gruß
MCoder
 
Hey, ok cool.
Ich kann es nun ohne Fehler kompilieren. Aber entschuldigt die Frage ... wie komme ich dort nun an die Seriennummer? Gibt die Funktion einen Wert zurück?
Ich bin echt aufgeschmissen mit der Sache -.-

MFG David
 
Hi,
du gibst der Funkrion doch einen Zeiger auf die Seriennummer mit. Und genau dort wird die Seriennummer gespeichert. Über den Zeiger kannst du also die Nummer abrufen und einer Variablen zuweisen, die du dann weiter verarbeiten kannst.

Mfg

langer
 
Hey,
sollte die SN also in DWORD dwVolumeSerialNumber stehen? Leider ist bei mir die SN darüber nicht auslesbar :/
Entschuldigt bitte, wenn ich mich wie der letzte DAU anstelle, aber ich bin echt am Ende meines Lateins :(

MFG David
 
Zuletzt bearbeitet von einem Moderator:
Leider ist bei mir die SN darüber nicht auslesbar
Was meinst du damit, was steht denn in der Variablen drin? Hast du auch mal geprüft, ob der Rückgabewert der Funktion ungleich 0 ist? Ansonsten wäre nämlich ein Fehler aufgetreten, den du mit GetLastError() abfragen kannst.

Gruß
MCoder
 
Hi,

ich muss mich korrigieren. Es wird eine Seriennummer zurückgegeben, nur ist dies anscheinend eine völlig anderen als welche ich mit VB.net auslese.

Woran kann das liegen?

Diese Frage ist mir mittlerweile schon peinlich, aber wie behebe ich diesen Fehler:
error C2664: 'DrawString': Konvertierung des Parameters 6 von 'DWORD' in 'char *' nicht möglich. Wenn ich den Fehler nicht behebe, kann ich die Seriennummer nicht ausgeben lassen ;(
Ein vorangestelltes (char) hilft hier leider auch nicht ...

MFG David
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück