討論區快速選單
知識庫快速選單
軟體開發過程中有哪些資安漏洞? 網路投保旅行平安險 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
char*無法轉換成LPCWSTR...
更改我的閱讀文章字型大小
作者 : bluevegsa(雲)
[ 貼文 35 | 人氣 7607 | 評價 0 | 評價/貼文 0 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/4/3 下午 05:26:09
我在參考別人的程式...
程式原碼為:
char* dllname
DWARD InfoSize;
DWORD dwHandle;
InfoSize = GetFileVersionInfoSize(dllname, &dwHandle);

編譯之後出現的錯誤為:
error C2664: 'GetFileVersionInfoSizeW' : 無法將參數 1 從 'char *' 轉換成 'LPCWSTR'
     指向的型別沒有相關; 轉換必須有 reinterpret_cast、C-Style 轉換或函式樣式轉換

----------------------------------------------------------
可是別人的程式可以編譯過去...
我的卻會出現這樣的錯誤訊息...
請解惑...謝謝
作者 : shing819(Clier) VC++曠世奇才貼文超過1000則人氣指數超過30000點
[ 貼文 1740 | 人氣 40353 | 評價 8630 | 評價/貼文 4.96 | 送出評價 84 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人bluevegsa註記此篇回應為很有道理 2006/4/3 下午 08:10:28

你用法錯誤.

char* dllname = "c:\\test.exe";
DWORD InfoSize;
DWORD dwHandle = 0;
InfoSize = GetFileVersionInfoSize(dllname, &dwHandle);
作者 : chiuinan2(青衫)討論區板主 Visual C++ .NET卓越專家VC++一代宗師Visual Basic優秀好手資訊類作業求救卓越專家一般曠世奇才程式設計甘苦談優秀好手C++ Builder優秀好手上班族的哈拉園地優秀好手C++頂尖高手Assembly優秀好手貼文超過3000則人氣指數超過150000點
[ 貼文 3732 | 人氣 170106 | 評價 34520 | 評價/貼文 9.25 | 送出評價 125 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人bluevegsa註記此篇回應為最佳解答 2006/4/3 下午 08:41:58
>char* dllname
>DWARD InfoSize;
>DWORD dwHandle;
>InfoSize = GetFileVersionInfoSize(dllname, &dwHandle);
>
>編譯之後出現的錯誤為:
>error C2664: ''GetFileVersionInfoSizeW'' : 無法將參數 1 從 ''char *'' 轉換成 ''LPCWSTR''

1.你有定義UNICODE, 因此相關的字串都必須使用unicode字串, 而非ansi字串. 也就是:

wchar_t* dllname;

2.指定unicode字串常數, 請加L"..."; 例如:

wchar_t* dllname = L"test.dll";

3.ansi字串 (就是傳統的char*)與wchar_t*的unicode字串互轉, 請用MultiByteToWideChar與WideCharToMultiByte這兩個API

4.如果你不太懂unicode, 那麼就不要加UNICODE定義, 用傳統的方式來處理.
作者 : bluevegsa(雲)
[ 貼文 35 | 人氣 7607 | 評價 0 | 評價/貼文 0 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/4/4 上午 08:26:09
謝謝你們的解答...
我的確不太懂unicode...
想多學一點...請問哪兒有unicode比較詳細的說明介紹呢?
作者 : bluevegsa(雲)
[ 貼文 35 | 人氣 7607 | 評價 0 | 評價/貼文 0 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/4/4 上午 08:28:09
對了...
我後來把char* dllname
改成TCHAR* dllaname
可也編譯成功
請問這也是unicode的用法嗎?
作者 : cog(Cog) VC++卓越專家C++優秀好手貼文超過200則
[ 貼文 458 | 人氣 12 | 評價 3390 | 評價/貼文 7.4 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人bluevegsa註記此篇回應為很有道理 2006/4/4 上午 09:36:58
如果你願意的話,你可以去看看VC附的TCHAR.H檔。
裡面大致是這樣定義的,
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else //_UNICODE
typedef char TCHAR;
#endif //_UNICODE
如果你用的是unicode編譯程式,TCHAR就相當於wchar_t,如果不是TCHAR就等於char。
作者 : bluevegsa(雲)
[ 貼文 35 | 人氣 7607 | 評價 0 | 評價/貼文 0 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/4/4 上午 11:12:47
現在又遇到另一個問題
程式原碼:
DWORD InfoSize;
Uint VerSize;
DWORD dwHandle;
LPvoid VerBuf;
VS_FIXEDFILEINFO *FI;
unsigned long result = 0;
if(VerQueryValue(VerBuf, "\\", (LPvoid) &FI, &VerSize))
     result = FI->dwFileVersionMS;
編譯的錯誤是:
無法將參數3 'LPvoid' 轉換成 'LPvoid *'

可以幫幫忙嗎>"<
作者 : chiuinan2(青衫)討論區板主 Visual C++ .NET卓越專家VC++一代宗師Visual Basic優秀好手資訊類作業求救卓越專家一般曠世奇才程式設計甘苦談優秀好手C++ Builder優秀好手上班族的哈拉園地優秀好手C++頂尖高手Assembly優秀好手貼文超過3000則人氣指數超過150000點
[ 貼文 3732 | 人氣 170106 | 評價 34520 | 評價/貼文 9.25 | 送出評價 125 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/4/4 下午 02:49:09
>if(VerQueryValue(VerBuf, '\\', (LPvoid) &FI, &VerSize))
> result = FI->dwFileVersionMS;
>編譯的錯誤是:
>無法將參數3 ''LPvoid'' 轉換成 ''LPvoid *''

你打錯了, 將(LPvoid)改成(LPvoid*)便可以了.

unicode站上我有寫了幾篇文章, 你可以參考一下, 不過算是比較深入一些, 初學者可能覺得有點困難:

http://www.programmer-club.com/pc2020v5/Forum/ShowSameTitleN.asp?URL=N&board_pc2020=general&id=4449

http://www.programmer-club.com/pc2020v5/Forum/ShowSameTitleN.asp?URL=N&board_pc2020=general&id=4309

http://www.programmer-club.com/pc2020v5/Forum/ShowSameTitleN.asp?URL=N&board_pc2020=general&id=4960

如果要查unicode字碼與字形對應表, 可以到:

http://www.unicode.org/

另外, 問問題可以到這邊問, 不要e-mail給我, 有時我工作過忙, 可能會擱置很長一段時間. 在這裡提問, 至少有空的人都會回答的.
作者 : bluevegsa(雲)
[ 貼文 35 | 人氣 7607 | 評價 0 | 評價/貼文 0 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/4/6 上午 09:15:08
>if(VerQueryValue(VerBuf, L'\\', (LPvoid) &FI, &VerSize))
> result = FI->dwFileVersionMS;
>編譯的錯誤是:
>無法將參數3 ''LPvoid'' 轉換成 ''LPvoid *''

你打錯了, 將(LPvoid)改成(LPvoid*)便可以了.
------------------------------------------------------
這我發問前已試過了...不行>"<
作者 : bluevegsa(雲)
[ 貼文 35 | 人氣 7607 | 評價 0 | 評價/貼文 0 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/4/6 上午 09:40:41
1>winvers.obj : error LNK2019: 無法解析的外部符號 _VerQueryValueW@16 在函式 "unsigned long __cdecl GetDllVersion(wchar_t *)" (?GetDllVersion@@YAKPA_W@Z) 中被參考
1>winvers.obj : error LNK2019: 無法解析的外部符號 _GetFileVersionInfoW@16 在函式 "unsigned long __cdecl GetDllVersion(wchar_t *)" (?GetDllVersion@@YAKPA_W@Z) 中被參考
1>winvers.obj : error LNK2019: 無法解析的外部符號 _GetFileVersionInfoSizeW@8 在函式 "unsigned long __cdecl GetDllVersion(wchar_t *)" (?GetDllVersion@@YAKPA_W@Z) 中被參考
1>winvers.obj : error LNK2019: 無法解析的外部符號 _GetDllVersion 在函式 _CheckDllVersion 中被參考

這是他出現的錯誤訊息...
作者 : bluevegsa(雲)
[ 貼文 35 | 人氣 7607 | 評價 0 | 評價/貼文 0 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/4/6 上午 11:05:17
對不起...是我豬頭...
因為我沒連接version.lib所以出錯了
對不起...問了笨問題>"<
 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.1728516