Joachim の言うことに加えて、シリアル番号を正しく渡していません。単一の値へのポインターを渡す必要があります。
DWORD disk_serialINT;
GetVolumeInformationA(NULL, NULL, NULL, &disk_serialINT, NULL, NULL, NULL, NULL);
あなたのコードでは、これはあなたがここで行うことによって複雑になります:
sprintf(disk_serialANSI, "%d", disk_serialINT);
Joachimの回答がカバーする uninitialized variable を無視すると、フォーマット文字列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;
}