有谁知道为什么会这样?
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);
}
答案 0 :(得分:3)
在Windows中,几乎所有Windows API函数都有两个版本。
如果您看到&#34;要求&#34;在this reference page部分,您会看到有一个MessageBoxW
和一个MessageBoxA
功能。符号MessageBox
是一个宏,定义为实际函数之一,具体取决于UNICODE
宏。
MessageBoxW
函数希望字符串是宽字符串,这是你传递的。不幸的是,您似乎没有正确的Unicode设置,因此使用ANSI(窄字符,普通char
)版本MessageBoxA
代替。
有两种解决方案:确保您拥有正确的Unicode设置。或者通过明确调用MessageBoxW
。或者不要使用宽字符串(即删除L
前缀)。
答案 1 :(得分:0)
您正在调用TCHAR
版MessageBox()
。转换错误消息抱怨您正在将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 "$@"