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);
Благодарю.
Эти две строки дадут вам неопределенное поведение:
char* disk_serialANSI;
sprintf(disk_serialANSI, "%d", disk_serialINT);
Вы объявляете переменную-указатель, но на самом деле вы нигде не указываете ее. Неинициализированные локальные переменные имеют неопределенное значение (на практике это будет казаться случайным), и с помощью этого неинициализированного указателя вы не знаете где sprintf
позвоню, напишу.
Поскольку вы программируете на C ++, есть несколько решений.
Старомодный, чтобы сделать disk_serialANSI
массив символов, достаточно большой, чтобы содержать число (включая терминатор строки). Альтернатива — вручную выделить память для указателя, а затем снова освободить эту память, когда вы закончите с ней.
С помощью std::ostringstream
отформатировать данные и получить std::string
,
С помощью std::to_string
преобразовать в строку напрямую.
использование Повысьте Лексический бросок.
Помимо того, что говорит Иоахим, вы неправильно передаете серийный номер. Ожидается, что вы передадите указатель на одно значение.
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;
}