Другой серийный номер диска в результате GetVolumeInformation ()

DWORD disk_serialINT[MAX_PATH + 1];
GetVolumeInformationA(NULL, NULL, NULL, disk_serialINT, NULL, NULL, NULL, NULL);
char* disk_serialANSI;
sprintf(disk_serialANSI, "%d", disk_serialINT);
std::string HDDserial = disk_serialANSI;

Это мой кусок кода, где я получаю серийный номер жесткого диска, но проблема в том, что каждый раз, когда программа выполняет значение, отличается. Кто-нибудь может это объяснить?

РЕШИТЬ:

DWORD disk_serialINT;
GetVolumeInformationA(NULL, NULL, NULL, &disk_serialINT, NULL, NULL, NULL, NULL);
std::string HDDserial = std::to_string(disk_serialINT);

Благодарю.

2

Решение

Эти две строки дадут вам неопределенное поведение:

char* disk_serialANSI;
sprintf(disk_serialANSI, "%d", disk_serialINT);

Вы объявляете переменную-указатель, но на самом деле вы нигде не указываете ее. Неинициализированные локальные переменные имеют неопределенное значение (на практике это будет казаться случайным), и с помощью этого неинициализированного указателя вы не знаете где sprintf позвоню, напишу.


Поскольку вы программируете на C ++, есть несколько решений.

  • Старомодный, чтобы сделать disk_serialANSI массив символов, достаточно большой, чтобы содержать число (включая терминатор строки). Альтернатива — вручную выделить память для указателя, а затем снова освободить эту память, когда вы закончите с ней.

  • С помощью std::ostringstream отформатировать данные и получить std::string,

  • С помощью std::to_string преобразовать в строку напрямую.

  • использование Повысьте Лексический бросок.

7

Другие решения

Помимо того, что говорит Иоахим, вы неправильно передаете серийный номер. Ожидается, что вы передадите указатель на одно значение.

DWORD disk_serialINT;
GetVolumeInformationA(NULL, NULL, NULL, &disk_serialINT, NULL, NULL, NULL, NULL);

В вашем коде это усугубляется тем, что вы делаете здесь:

sprintf(disk_serialANSI, "%d", disk_serialINT);

Игнорирование неинициализированной переменной disk_serialANSI, который охватывает ответ Иоахима, вы передаете указатель на "%d" строка формата. Как только вы измените disk_serialINT быть единой ценностью вещи будут лучше. Однако вы передаете значение без знака в одну строку формата.

Пришло время отказаться от этих грубых функций форматирования C и использовать стандартную библиотеку C ++ для преобразования между интегральными значениями и текстом.

И последнее, на что нужно обратить внимание: вы должны проверить возвращаемое значение вызовов Win32 API. Вы не представляете, был ли вызов функции успешным. Вы не должны предполагать, что это так. Это все описано в документации: https://msdn.microsoft.com/en-us/library/windows/desktop/aa364993.aspx

Эта программа печатает серийный номер тома, содержащего текущий каталог:

#include <Windows.h>
#include <iostream>

int main()
{
DWORD disk_serialINT;
if (!GetVolumeInformationA(NULL, NULL, NULL, &disk_serialINT, NULL,
NULL, NULL, NULL))
{
std::cout << "Failed: " << GetLastError() << std::endl;
return 1;
}
std::cout << "Current directory volume serial numnber: " << std::hex
<< disk_serialINT << std::endl;

return 0;
}
3

По вопросам рекламы [email protected]