2010-07-05 7 views
0

Le code ci-dessous est de this answer:Quel est le problème avec le code C ci-dessous?

#include <windows.h> 

int main() 
{ 
    HANDLE h = ::CreateFile(L"\\\\.\\d:", 0, 0, NULL, OPEN_EXISTING, 0, NULL); 

    STORAGE_DEVICE_NUMBER info = {}; 
    DWORD bytesReturned = 0; 

    ::DeviceIoControl(h, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &info, sizeof(info), &bytesReturned, NULL); 
} 

Quand je compile et exécute ce qui précède, se erreur comme ceci:

error C2059: syntax error : ':' 
error C2059: syntax error : '}' 
error C2143: syntax error : missing ';' before ':' 

MISE À JOUR

après l'enregistrement ci-dessus comme cpp fichier, j'ai cette erreur:

error C2664: 'CreateFileA' : cannot convert parameter 1 from 'const wchar_t [7]' to 'LPCSTR' 
+0

Sur quelle ligne obtenez-vous ces erreurs? –

+0

Avez-vous des listes d'initialiseurs vides? – dreamlax

Répondre

0

Donc, je suppose que votre question est plus à obtenir le résultat que vous voulez que la raison pour laquelle le code ne compilation :)

Maintenant que vous avez obtenu ce travail, l'appel DeviceIoControl() sera remplissage dans le STORAGE_DEVICE_NUMBER structure que vous lui passez avec les résultats que vous voulez. Donc, vous devriez trouver que info.DeviceType détient maintenant le type de périphérique, info.DeviceNumber contient le numéro de périphérique et info.PartitionNumber le numéro de partition.

Tester avec succès avant d'utiliser les valeurs retournées. Je l'essayerais peut-être sur le lecteur C: plutôt que sur le lecteur D: comme vous le faites en ce moment, jusqu'à ce que je sois sûr que ça marchait; Au moins, vous savez que vous avez à peu près toujours un lecteur C: dans Windows :) Donc, utilisez \\\\.\\c: plutôt que \\\\.\\d:.

Quoi qu'il en soit, non testé, mais:

if (::DeviceIoControl(h, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &info, sizeof(info), &bytesReturned, NULL)) 
{ 
    std::cout << "Device: " << info.DeviceNumber << 
       " Partition: " << info.PartitionNumber << std::endl; 
} else { 
    std::cerr << "Ooops. The DeviceIoControl call returned failure." << std::endl; 
} 

... De toute évidence, vous auriez besoin d'un #include <iostream> pour que cela fonctionne, comme je le dumping des valeurs à l'aide iostream, mais vous pouvez les imprimer sur cependant vous voulez, ou un message, en gardant à l'esprit que vous introduisez déjà windows.h.

Gardez à l'esprit, il y a eu une dizaine d'années depuis que je l'ai fait un travail de Windows C++, mais peut-être cela va vous aider à aller ...

9

Plain C n'a pas d'espaces de noms, vous devez donc omettre les spécificateurs d'espace de noms globaux ::. Ceux-ci ne seraient valables qu'en C++. Le L devant la chaîne indique qu'il s'agit d'une chaîne de caractères large. Si votre projet n'utilise pas de caractères larges, ignorez le L pour obtenir une chaîne de caractères normale. Si vous avez besoin de prendre en charge les deux variantes, vous pouvez également utiliser la macro _T: _T("...") s'étend à la variante correcte de chaîne de caractères en fonction des paramètres de votre projet.

+0

Qu'est-ce que '" \\\\. \\ d: "' signifie ici? – user198729

+0

C'est la chaîne '\\. \ D:' (les barres obliques inverses dans les chaînes doivent être échappées par une autre barre oblique inverse). – sth

+0

Mais que signifie "\\. \ D:"? – user198729

3

Je suis assez sûr que vous ne pouvez pas utiliser :: dans le cadre d'un nom d'identifiant dans le langage de programmation C. Cela ressemble plus à une utilisation bizarre, bastardized de C++. IIRC, :: lui-même devant un identificateur spécifié que c'était dans la portée globale ou de fichier (pour éviter de se heurter potentiellement avec, disons, des méthodes dans une classe).

+0

Savez-vous comment modifier le code de façon à ce qu'il renvoie quelque chose comme 'hd0 1'? – user198729

2

Ce n'est pas C, c'est C++. Déposez le double-deux-points (ou compilez-le en C++). En outre, la constante de chaîne utilise des caractères larges. Déposez le L devant la citation ouverte.

+0

ou modifiez votre build pour utiliser Unicode partout: paramètres du projet, général, jeu de caractères. – Rup