2016-11-05 9 views
-2

これはなぜ起こっているのですか?私は、Microsoft(R)インクリメンタルリンカバージョン14.00.24215.1でコンパイルすると、「CL/EHscのwinbasicb.cpp」のコマンドライン入力のためのコマンドラインで「/ EHsc」オプションを使用して使用していますWINDOWS apiが外部シンボルを解決できない

#define _x64 

#include<Windows.h> 
#include<iostream> 
#include<windef.h> 
#include<Winuser.h> 
#include<tchar.h> 
using namespace std; 

int WINAPI MessageBoxW(
_In_opt_ HWND hWnd, 
_In_opt_ LPCTSTR lpText, 
_In_opt_ LPCTSTR lpCaption, 
_In_  UINT uType 
); 
int main(){ 
    cout << MessageBoxW(NULL,L"",L"",0); 
} 

。私は気持ちがいいとは思わない。最適化されたコンパイルとリンクのために/ EHscオプションを使用するだけです。

このエラーが発生しています。

/out:winbasicb.exe 
winbasicb.obj 
winbasicb.obj : error LNK2019: unresolved external symbol __imp_MessageBoxW referenced in function main 
winbasicb.exe : fatal error LNK1120: 1 unresolved externals 
+0

'L" ... "は、ユニコード文字列を表します。 –

答えて

3

Windowsには、ほぼすべてのWindows API関数の2つのバージョンがあります。

this reference pageの「要件」セクションが表示されている場合は、MessageBoxWMessageBoxAの1つが表示されます。記号MessageBoxは、UNICODEマクロに依存する実際の関数の1つとして定義されたマクロです。

関数MessageBoxWは、文字列がワイド文字の文字列であることを前提としています。残念ながら、正しいUnicode設定がないようですので、代わりにANSI(狭い文字、平文char)のバージョンMessageBoxAが使用されます。

2つの解決方法があります。正しいUnicode設定があることを確認してください。または、明示的にMessageBoxWと呼んでください。または、ワイド文字列を使用しないでください(つまり、接頭辞はLです)。

+0

マイコンパイラは、デフォルトでUTF-8を使用します。だから私はメモ帳でこれをANSIとして保存しましたが、タイプに互換性がないと書いています。私は同様にMessageBoxAとMessageBoxWを試しました。まだコンパイルできません。 –

+0

@ 1911Soldier代わりに狭い文字列を渡そうとしましたか?文字列に 'L'接頭辞を使用しないことでこれを行います。 –

+0

*「ほぼすべてのWindows API関数の2つのバージョンがあります」* - 正しくありません。文字列引数を持つAPI関数だけには2つのバージョンがあります(例:[GetProcAddress](https://msdn.microsoft.com/en-us/library/windows/desktop/ms683212.aspx))は狭い文字列バージョン、[ReadDirectoryChangesW](https://msdn.microsoft。com/en-us/library/windows/desktop/aa365465.aspx)は、ワイド文字版のみです。 – IInspectable

0

TCHARのバージョンをMessageBox()と呼びます。変換エラーメッセージは、代わりにAnsi文字列を必要とするMessageBoxA()にUnicode文字列を渡していると不平を言っています。つまり、UNICODEを定義しないでプロジェクトをコンパイルすると、TCHARcharにマップされ、MessageBox()MessageBoxA()にマップされます。しかし、接頭辞Lは、Ansiリテラルではなく、Unicodeリテラルを作成するために使用されます。以下のために同じコードベースをコンパイル時にのみ使用すべきである、そうでない場合

int msgboxID = MessageBox(
    NULL, 
    TEXT("temp.txt already exists.\nDo you want to replace it?"), 
    TEXT("Confirm Save As"), 
    MB_ICONEXCLAMATION | MB_YESNO 
); 

TCHAR関数から離れTCHAR滞在:

TCHARベースの関数に文字列リテラルを渡して、適切な文字エンコーディングを確保するためにTEXT()マクロを使用します両方のWin9x/MEとNT4 +のWindowsファミリ)、代わりに直接ANSIまたはUnicode関数を使用します。

int msgboxID = MessageBoxA(
    NULL, 
    "temp.txt already exists.\nDo you want to replace it?", 
    "Confirm Save As", 
    MB_ICONEXCLAMATION | MB_YESNO 
); 

int msgboxID = MessageBoxW(
    NULL, 
    L"temp.txt already exists.\nDo you want to replace it?", 
    L"Confirm Save As", 
    MB_ICONEXCLAMATION | MB_YESNO 
); 
+0

このようにコンパイルできます –

+0

#include #include #include #include using namespace std; int WINAPI MessageBoxW( _In_opt_ HWND hWnd, _In_opt_ LPCTSTR lpText, _In_opt_ LPCTSTR lpCaption, _In_ UINT uType ); int main(){ }

関連する問題