Невозможно преобразовать char * в WCHAR * [qt / c ++] - PullRequest
4 голосов
/ 19 марта 2012

Я разрабатываю приложение QT, и мне нужно включить чистый C-код.Когда я компилирую этот код в code :: blocks, он был успешным, может быть, одно предупреждение, но когда я пытаюсь скомпилировать его в QT создателе, я получаю эти 4 ошибки.

cannot convert 'char*' to 'WCHAR*' for argument '1' to 'UINT GetSystemDirectoryW(WCHAR*, UINT)'
cannot convert 'char*' to 'const WCHAR*' for argument '1' to 'HINSTANCE__* LoadLibraryW(const WCHAR*)'
 cannot convert 'char*' to 'WCHAR*' for argument '1' to 'BOOL 
 cannot convert 'const char*' to 'const WCHAR*' for argument '2' to 'LONG RegQueryValueExW(HKEY__*, const WCHAR*, DWORD*, DWORD*, BYTE*, DWORD*)'

, и код здесь>

char systemDirectory[MAX_PATH]; 
GetSystemDirectory(systemDirectory, MAX_PATH); //first error
char kbdLayoutFilePath[MAX_PATH];
kbdLibrary = LoadLibrary(kbdLayoutFilePath); //second error
char kbdName[KL_NAMELENGTH];
GetKeyboardLayoutName(kbdName); //third error
if(RegQueryValueEx(hKey, "Layout File", NULL, &varType, layoutFile, &bufferSize) != ERROR_SUCCESS) //fourth error

Я также использую функцию snprintf, поэтому я не могу просто изменить тип с char на WCHAR, потому что тогда он не будет компилировать snprintf

snprintf(kbdKeyPath, 51 + KL_NAMELENGTH,
"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s", kbdName);

Так что у вас есть идеи, какпочинить это ?Сначала я попытался изменить тип с char на WCHAR, но затем snprintf не работал, поэтому я попытался использовать swprinf, но безуспешно, поскольку, как ни странно, он не нашел эту функцию

int swprintf(wchar_t *wcs, size_t maxlen,
             const wchar_t *format, ...);

, но только эту

int swprintf(wchar_t *wcs,
                 const wchar_t *format, ...);

так, каков мой выбор?Как скомпилировать чистый код C в среде c ++ без каких-либо ошибок ... или как сделать правильное преобразование типов.

Ответы [ 3 ]

4 голосов
/ 19 марта 2012

Вы компилируете в режиме Unicode. Вы можете настроить компиляцию на многобайтовые строки. Проблема в том, что эти функции Windows API являются макросами, которые проверяют, создаете ли вы Unicode или нет, и затем вызываете версию функции W или A (в вашем коде GetSystemDirectory фактически вызывает GetSystemDirectoryW. Таким образом, вы можете изменить компиляцию на многобайтовые строки .... или вы можете явно изменить ваши вызовы API для вызова версии A (т.е. GetSystemDirectoryA)

2 голосов
/ 19 марта 2012

Вы компилируете свой проект с определением UNICODE или _UNICODE. Проверьте настройки вашего проекта и удалите определение, если это необходимо. Чтобы удалить определение, вам может потребоваться отключить поддержку юникода для всего проекта.

0 голосов
/ 19 марта 2012

Переключитесь с char на WCHAR, а затем, чтобы решить проблему swprintf, просто сделайте это

#define   swprintf   _snwprintf

В Windows прототип swprintf -

int swprintf( wchar_t *buffer,const wchar_t *format [,argument] ... );

Но стандарт ISO C требует следующий прототип для swprintf

int swprintf (wchar_t *, size_t, const wchar_t *, ...);

По этой самой причине в Windows предоставляется _snwprintf.

Подробнее читайте здесь

http://msdn.microsoft.com/en-us/library/ybk95axf(v=vs.71).aspx

...