2012-03-19 7 views
4

im разработать приложение QT, и мне нужно включить чистый код C. Когда я компилирую этот код в code :: blocks, он прошел успешно, возможно, одно предупреждение, но когда я пытаюсь скомпилировать его в создателе QT, я получаю эти 4 ошибки.Невозможно преобразовать char * в WCHAR * [qt/C++]

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 функцию, поэтому я не могу просто изменить тип из полукокса в WCHAR, потому что тогда он не будет компилировать snprintf

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

У вас есть идеи, как это исправить? первый я попытался изменить тип из полукокса в 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++ без каких-либо ошибок ... или как сделать правильное преобразование типов.

ответ

4

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

+0

Это похоже на рабочее решение, но я до сих пор одна ошибка в этой функции, здесь есть прототип INT getKeyboardLayoutFile (символ * layoutFile, DWORD BufferSize), и здесь это вызов функции, который дает ошибку >> if (RegQueryValueExA (hKey, «Файл макета», NULL, & varType, layoutFile и bufferSize)!= ERROR_SUCCESS), а ошибка - «ошибка: неверное преобразование из« char * »в« BYTE * »,« ошибка: инициализация аргумента 5 из «LONG RegQueryValueExA» (HKEY __ *, const CHAR *, DWORD *, DWORD *, BYTE *, DWORD *) '" –

+0

в порядке, это было действительно просто (BYTE) * –

2

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

0

Переключение с 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

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