アレイストアgetVolume情報から検索された名前がVisual C ++で奇妙に?
-
15-09-2020 - |
質問
取り外し可能なデバイスの名前を取得するためにGetVolumeInformation呼び出しを使用します。名前を細かく取得してTCHAR配列変数SZvolNamebuffに保存することができます。これが私のコードです:
// Get Volume Information to check for NTFS or FAT
TCHAR szFileSys[256];
TCHAR szVolNameBuff[256];
DWORD dwSerial = 0;
DWORD dwMFL = 0;
DWORD dwSysFlags = 0;
bool bSuccess;
char fileType[255];
int bSuccessdebug = 0;
//LPCTSTR temp = _T("E:\\"); For debugging only
bSuccess = GetVolumeInformation(drivePath,
szVolNameBuff,
sizeof(szVolNameBuff),
&dwSerial,
&dwMFL,
&dwSysFlags,
szFileSys,
sizeof(szFileSys));
.
変数の内容を行に印刷しようとすると、
printf("szVolNameBuff holds: %s \n", &szVolNameBuff);
.
ドライブの名前である "Transcend"という名前の "t"の出力を取得します。私はVisual Studio 2008でそれをデバッグし、TCHARアレイが名前を次のように格納していることがわかりました。 [0] 't' [1] 0 [2]「r」 [3] 0 [4]「a」 [5] 0 [6] 'n' [7] 0
など。何故ですか?
のように配列に単語を保存したいです。[0] 't' [1]「r」 [2]「a」 [3] 'n' [4] 's'
後で文字列の連結に使用します。これを修正する方法はありますか?
解決
Unicode Win32 APIを使用しているように見えます。_tprintfを使用して、文字型に従って適切な関数(printfまたはwprintf)が使用されるようにしてください。
Unicodeがわからない場合 - これが概要です。これが起こっている理由は、通常のASCII文字のUnicodeがNULLバイトに続くASCII文字です。だからこそ、NULLで埋め込まれた文字列が見えています。
TCHARを使用する場合は、_t()マクロにすべての文字列をラップする必要があるため、正しい型で宣言されるようにしてください。あなたがこれに従うならば、UnicodeからANSIへの変換は、プリプロセッサ指令を変更するという問題です。
他のヒント
Win32 APIのUnicodeバージョンを使用しているのはなぜです。
と2つの修正があります。1つ目は、Projects-> Properties-> Configuration Properties-> General->文字セットのプロジェクトの文字セットを「SET」に変更することで、Visual Studioを使用している場合は、標準バージョンのAPIの標準バージョンを使用することです。UnicodeがWindows.hを使用する前に#definedでないことを確認してください。
MDMAとしての2番目の修正は、Unicodeテキスト操作関数wprintfを使用するか、標準ライブラリの%sを使用することです。これはあなたのプログラムが国際化に優しいものになるので、ファイル名を使用していた文字設定に合わせて作業するように推奨されています。ただし、すべてのダウンストリーム機能がUnicodeを使用する必要があることを意味します。プロジェクトのサイズによっては、多くの作業を意味する可能性があります。