2012-03-19 13 views
4

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 

iもsnprintfの機能を使用するので、それは文句を言わないのsnprintfをコンパイルするので、私はちょうど、WCHARへのcharから種類を変更傾ける

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

これを修正する方法はありますか?最初私はWCHARへのcharから変更タイプを試してみましたが、その後は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

ユニコードモードでコンパイルしています。コンパイルをマルチバイト文字列に設定することができます。起こっている問題は、これらのウィンドウAPI関数は、Unicodeを構築しているかどうかをチェックし、関数のWまたはAバージョンを呼び出すマクロです(コード内ではGetSystemDirectoryは実際にはGetSystemDirectoryWを呼び出しています)。コンパイルをマルチバイト文字列に変更するか、またはAバージョン(つまりGetSystemDirectoryA)を呼び出すようにAPI呼び出しを明示的に変更することができます。

+0

これは実用的なソリューションのように思えるが、私はまだこの機能では1個のエラーを持っているため、これを読んで、ここではプロトタイプint getKeyboardLayoutFile(CHAR * layoutFile、DWORDがbufferSize)があり、ここで>>(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からに変更する必要がある場合があります。定義を削除するには、プロジェクト全体のユニコードサポートを無効にする必要があります。 Windowsでは、この

#define swprintf _snwprintf 

を行い、あなたのswprintf問題を解決するために、その後とはちょうど、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

関連する問題