2016-09-27 59 views
4

我使用的是visual studio 2015,我想編寫C++靜態庫,可以在Unicode項目和多字節項目中使用,我該如何做對嗎?我如何在靜態庫(.lib)中支持Unicode和多字節字符集?

例如,我有這樣的代碼:

namespace Reg 
{ 
    LONG WINAPI CreateKey(
     _In_ HKEY hKey, 
     _In_ LPCTSTR lpSubKey, 
     _In_ REGSAM samDesired, 
     _Out_ PHKEY phkResult 
     ) 
    { 
     return RegCreateKeyEx(hKey, 
      lpSubKey, 
      0, NULL, 
      REG_OPTION_NON_VOLATILE, 
      samDesired, 
      NULL, 
      phkResult, 
      NULL); 
    } 
} 
+3

只使用一個wchar_t接口,並不關心所有的TCHAR業務。當它被髮明時這是一個壞主意,現在它是一個壞主意。在任何情況下,都不使用「寬」版本的Windows API。 – rubenvb

+4

你必須有兩個函數,因爲這是C++,你可以重載,所以有兩個'CreateKey'函數,一個需要'LPCWSTR'和一個需要'LPCSTR'。 –

+0

@RaymondChen我可以只有一個聲明需要'LPCTSTR'和兩個定義,一個需要'LPCWSTR'和一個需要'LPCSTR'? – codeDom

回答

1

像雷蒙德陳在評論所說,你可以使用兩個獨立的重載函數 - 一個用於Ansi,一個用於Unicode:

​​

或者像rubenvb一樣只是忘了Ansi的功能,只關注Unicode本身:

namespace Reg 
{ 
    LONG WINAPI CreateKey(
     _In_ HKEY hKey, 
     _In_ LPCWSTR lpSubKey, 
     _In_ REGSAM samDesired, 
     _Out_ PHKEY phkResult 
     ) 
    { 
     return RegCreateKeyExW(hKey, 
      lpSubKey, 
      0, NULL, 
      REG_OPTION_NON_VOLATILE, 
      samDesired, 
      NULL, 
      phkResult, 
      NULL); 
    } 
} 
1

你可以做到這一點作爲通常用於Win32函數一樣:

CreateKeyW(..) { unicode implementation } 
CreateKeyA(..) { byte string implementation } 
#ifdef UNICODE 
#define CreateKey CreateKeyW 
#else 
#define CreateKey CreateKeyA 
#endif 
+0

我會使用C++函數重載而不是C宏。 Win32 API中的這些#define語句會導致第三方庫中的所有問題,因此最好避免在自己的代碼中導致相同的問題。 –

相關問題