WINDOWS api无法解析外部符号而不是a

时间:2016-11-05 07:09:51

标签: c++ winapi compilation

有谁知道为什么会这样?

printf "File log for $(date)\nYou currently have $(ls -q | wc -l) files\n" > filelog

我正在使用Microsoft(R)Incremental Linker Version 14.00.24215.1进行编译,并在命令行中使用“/ EHsc”选项输入“cl / EHsc winbasicb.cpp”命令行。我没有做任何想象的事情。只需使用/ EHsc选项进行优化编译和链接。

我收到此错误。

#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);
 }

2 个答案:

答案 0 :(得分:3)

在Windows中,几乎所有Windows API函数都有两个版本。

如果您看到&#34;要求&#34;在this reference page部分,您会看到有一个MessageBoxW和一个MessageBoxA功能。符号MessageBox是一个宏,定义为实际函数之一,具体取决于UNICODE宏。

MessageBoxW函数希望字符串是宽字符串,这是你传递的。不幸的是,您似乎没有正确的Unicode设置,因此使用ANSI(窄字符,普通char)版本MessageBoxA代替。

有两种解决方案:确保您拥有正确的Unicode设置。或者通过明确调用MessageBoxW。或者不要使用宽字符串(即删除L前缀)。

答案 1 :(得分:0)

您正在调用TCHARMessageBox()。转换错误消息抱怨您正在将Unicode字符串传递给MessageBoxA(),而UNICODE需要使用Ansi字符串。这意味着您的项目在未定义TCHAR的情况下进行编译,因此char映射到MessageBox()MessageBoxA()映射到L。但是TCHAR前缀用于创建Unicode文字,而不是Ansi文字。

将字符串文字传递给基于TEXT()的函数时,请使用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函数(int msgboxID = MessageBoxA( NULL, "temp.txt already exists.\nDo you want to replace it?", "Confirm Save As", MB_ICONEXCLAMATION | MB_YESNO ); 只应在为Win9x / ME和NT4 + Windows系列编译相同的代码库时使用),而是直接使用Ansi或Unicode函数:

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

#!/bin/bash
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"