2016-09-27 229 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语句会导致第三方库中的所有问题,因此最好避免在自己的代码中导致相同的问题。 –

相关问题