2015-09-25 130 views
1

我只是試圖根據一個字符串來獲取模塊信息,這個字符串可以很像「somefile.exe」。如何將char *傳遞給GetModuleHandle函數?

MODULEINFO GetModuleInfo(char *szModule) 
{ 
    MODULEINFO modinfo = {0}; 
    HMODULE hModule = GetModuleHandle(szModule); 
    if(hModule == 0) 
     return modinfo; 
    GetModuleInformation(GetCurrentProcess(), hModule, &modinfo, sizeof(MODULEINFO)); 
    return modinfo; 
} 

誤差參數類型「字符*」的是與類型「LPCWSTR」出現在的GetModuleHandle的參數不相容。現在

,我已經試過了許多措施,如:

  1. 將項目屬性→配置屬性→字符集並將其設置爲使用多字節字符集,而不是統一。我已經看到它幫助其他人,但它並沒有爲我做伎倆。

  2. 鑄造類似(LPCWSTR)szModule的sz模塊。這使得該程序的構建成功,但它沒有按預期工作。

  3. 使用unicode通過用靜態L"somefile.exe"替換參數。但是,這很好地工作,不用說這很不實際。

我的問題是:怎樣才能讓GetModuleHandle(szModule)編譯如果szModulechar*類型的?

我使用Visual Studio 2015,如果它有幫助的話。

+0

你需要像在第二個例子中那樣施放它。如果'szModule'是一個'const char *'而不是它的工作?它看起來不像'GetModuleInfo'需要修改'szModule',所以它應該是一個安全的'const char *'。 – Tas

+0

如何使用Unicode不太實用?這是在Win32中做事的首選方式。如果你堅持在你的代碼庫中使用char *字符串,你將需要使用WideCharToMultiByte/MultiByteToWideChar等轉換函數。 – gigaplex

+0

@gigaplex我不是故意說使用unicode是不切實際的。我的意思是說那裏有一個靜態字符串是不實際的。最讓我困擾的是爲什麼將項目字符集設置爲**使用多字節字符集**不適用於我,但爲許多其他使用Visual Studio 2012及更少版本的人員工作。我想這樣做,所以每次我需要傳遞一個LPCWSTR時,我不必寫WideCharToMultiByte。 –

回答

2

我不認爲製作GetModuleHandle(szModule)有未來是個好主意。

嘗試使用GetModuleHandleA(szModule)代替char *szModule;

+0

完美工作。仔細闡述它有什麼不同? –

+0

'GetModuleHandle'是一個變成「GetModuleHandleA」或「GetModuleHandleW'的宏。 'GetModuleHandleA'顯式使用ASCII(char)。 – MikeCAT