我有一个应用程序碰巧使用winapi的WriteFile在从GetStdHandle获取的句柄上登录到控制台。最小的测试用例:
#include <Windows.h>
int main(int argc, char** argv) {
HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
if(GetFileType(console) == FILE_TYPE_UNKNOWN)
return;
WriteFile(console, "abc", 3, 0, 0);
}
使用VS2013中的默认选项构建。当在标准Windows控制台上调用时以及从python2 / python3 / Sublime的控制台使用例如调用时,这可以正常工作。 subprocess.Popen('/path/to/my.exe')
。
现在我想在SublimeText 3中将此程序作为构建系统运行。这是构建定义:
{
"cmd": [ "/path/to/my.exe" ]
}
根据documentation,这应该等同于使用subprocess.Popen。但是当我调用这个'构建系统'时,Sublime的输出窗格会显示abc
,然后对WriteFile的调用崩溃
0xC0000005: Access violation writing location 0x00000000.
这里发生了什么?这是我的代码,Sublime或WriteFile中的问题吗?有什么可以做的吗? (我尝试使用shell_cmd
代替cmd
,但没有区别)
答案 0 :(得分:3)
您将错误的参数传递给WriteFile:
lpNumberOfBytesWritten [out,optional]
仅当lpOverlapped参数不为NULL时,此参数才为NULL。
对于WriteFile
的同步调用,您必须将有效指针传递给DWORD
,其中返回写入的字节数:
#include <Windows.h>
int main(int argc, char** argv) {
HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
if(GetFileType(console) == FILE_TYPE_UNKNOWN)
return;
DWORD dwBytesWritten{};
WriteFile(console, "abc", 3, &dwBytesWritten, 0);
}