2011-12-03 30 views
0

我以前沒有用過寬字符。以下是其他人的代碼:Win32奇怪的widechar行爲

char moduleFileName[512]; 
int size = ::GetModuleFileName(NULL,moduleFileName,sizeof(moduleFileName)); 
char c_drive[256]; 
char c_dir[256]; 
_splitpath_s(moduleFileName,c_drive,sizeof(c_drive),c_dir,sizeof(c_dir),NULL,0,NULL,0); 
root = c_drive; 
root.append(c_dir); 

wchar_t moduleFileNameW[512]; 
int sizeW = ::GetModuleFileNameW(NULL,moduleFileNameW,sizeof(moduleFileNameW)); 
wchar_t w_drive[256]; 
wchar_t w_dir[256]; 
_wsplitpath_s(moduleFileNameW,w_drive,sizeof(w_drive),w_dir,sizeof(w_dir),NULL,0,NULL,0); 
wroot = w_drive; 
wroot.append(w_dir); 

SEVEN_ZIP_EXE = wroot; 
SEVEN_ZIP_EXE += L"\\7z.exe"; 

重點是將變量設置爲7z.exe文件所在的位置。當我在我的Windows 7 Prof. 64位系統上進行調試時,結果看起來像是無效字符,例如wroot。

﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾ ﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾ ﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾ ﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾ ﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾ ﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾ ﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾ ﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾ ﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾ ﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾ ﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌 쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌 쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌 Blockquote

+0

SEVEN_ZIP_EXE是一個std :: wstring? –

+0

行爲可能很奇怪,因爲代碼肯定是 – James

+0

std :: wstring SEVEN_ZIP_EXE = L「」; –

回答

0

將您的sizeof改爲_countof,這將解決您的奇怪數據問題。你不需要兩組函數。使用適合於應用程序的設置。 如果你需要SEVEN_ZIP_EXE是一個字符串,那麼你可以消除字符的東西。

0

問題中的sizeof,如果你真的想用這個的sizeof(w_dir)/的sizeof(wchar_t的)

我收集你正在嘗試做的就是包含您的可執行文件的目錄。 而不是使用笨拙splitpath,我建議如下: -

TCHAR szBuff[FILENAME_MAX]; 
TCHAR *ShortName; 
GetFullPathName(moduleFileName, FILENAME_MAX, szBuff, &ShortName); 
*(ShortName-1) = '\0'; // remove exe from path 

szBuff將包含目錄,SHORTNAME點的名字。

上述代碼使用TCHAR和#define UNICODE,但可以將函數名稱更改爲wchar名稱。

+0

據糟糕的編碼在函數調用中使用FILENAME_MAX。最好在變量_countof(szBuff)上使用Microsoft定義的宏。這樣如果FILENAME_MAX必須改變,它不需要在多個地方改變。 –

+0

FILENAME_MAX是系統定義的常量 – Milliways

+0

如果有人將szBuff的大小更改爲FILENAME_MAX以外的值,該怎麼辦?如果SDK更新更改FILENAME_MAX的值,該怎麼辦? –