2016-09-27 2 views
4

Я использую visual studio 2015, и я хочу написать статическую библиотеку C++, которую я могу использовать в проектах Unicode и в проектах с несколькими байтами, как я это делаю правильно?Как я могу поддерживать как Unicode, так и Multi-Byte Character Set в Static library (.lib)?

Например, у меня есть этот код:

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

Как Raymond Chen предложил в комментариях, вы можете использовать два отдельных перегруженные функции - один для Анси, один для Unicode:

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

    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); 
    } 
} 

Или, как rubenvb СУГ ложил, просто забыть о функции Анси вообще, сосредоточиться только на 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. Эти #define-инструкции в API Win32 вызывают всевозможные проблемы в сторонних библиотеках, поэтому лучше избегать возникновения тех же проблем в вашем собственном коде. –

Смежные вопросы