6

QTアプリケーションを開発しています。純粋なCコードを含める必要があります。このコードをcode::blocksでコンパイルすると、成功しました。おそらく1つの警告ですが、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コードをコンパイルする方法...または正しい型変換を行う方法。

4

3 に答える 3

4

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

于 2012-03-19T13:05:25.510 に答える
2

UNICODEまたは_UNICODE定義を使用してプロジェクトをコンパイルしています。プロジェクト設定を確認し、必要に応じて定義を削除します。定義を削除するには、プロジェクト全体のUnicodeサポートを無効にする必要がある場合があります。

于 2012-03-19T13:06:21.270 に答える
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ではWindows_snwprintfが提供されています。

詳細についてはこちらをお読みください

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

于 2012-03-19T13:11:38.137 に答える