2012-03-19 2 views
4

으로 변환 할 수 없으며 순수한 C 코드를 포함해야합니다. 내가 코드에서이 코드를 컴파일 할 때 : : 블록, 아마도 하나의 경고가 성공적 이었지만 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 기능을 사용하므로 다음이 늘 현재 snprintf를 컴파일하기 때문에 난 그냥, WCHAR로 문자에서 유형을 변경하지 못할

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

문제를 해결하는 방법에 대한 아이디어가 있습니까? 우선은 WCHAR로 문자에서 변경 유형을 시도했지만 다음 현재 snprintf didnt 한 작업, 그래서 내가 swprinf를 사용하려고했으나 성공하지, 이상하게 이후이 기능을 찾을 수 didnt는

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

하지만 그냥이

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

내 옵션은 무엇입니까? C++ 환경에서 순수한 C 코드를 에러없이 컴파일하는 법 ... 올바른 형 변환을하는 법.

답변

4

유니 코드 모드로 컴파일 중입니다. 멀티 바이트 문자열로 컴파일을 설정할 수 있습니다. 일어나는 문제는 해당 Windows API 함수는 유니 코드를 만들지 여부를 확인하는 매크로이며 함수의 W 또는 A 버전을 호출합니다. 코드에서 GetSystemDirectory은 실제로 GetSystemDirectoryW을 호출합니다. 컴파일을 멀티 바이트 문자열로 변경하거나 ... A 버전 (예 : GetSystemDirectoryA)을 호출하도록 명시 적으로 API 호출을 변경할 수 있습니다.

+0

이 작업 솔루션처럼 보인다하지만 난 아직이 기능에 하나의 오류가이 읽기, 여기에 프로토 타입 INT getKeyboardLayoutFile (문자 * layoutFile, DWORD BUFFERSIZE는)이며, 여기에 >> If (RegQueryValueExA (hKey, "레이아웃 파일", NULL, & varType, layoutFile, & bufferSize) 오류를주는 함수 호출입니다!= ERROR_SUCCESS)이고 오류는 "오류 : 'char *'에서 'BYTE *'로의 잘못된 변환"오류 : 'LONG RegQueryValueExA (HKEY __ *, const CHAR *, DWORD *, DWORD *, BYTE *, DWORD *) ' " –

+0

좋아요, 정말 간단했습니다 (BYTE) * –

2

프로젝트를 UNICODE 또는 _UNICODE 정의로 컴파일 중입니다. 프로젝트 설정을 확인하십시오. 정의를 제거하려면 전체 프로젝트에 대한 유니 코드 지원을 비활성화해야 할 수도 있습니다.

0

char에서로 바꿀 수 있습니다.다음이 swprintf 문제가 바로 Windows에서이

#define swprintf _snwprintf 

을 해결하기 위해, 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

관련 문제