【发布时间】:2016-11-21 11:40:18
【问题描述】:
我有一个应用程序,它碰巧在从 GetStdHandle 获取的句柄上使用 winapi 的 WriteFile 登录到控制台。最小测试用例:
#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 但这没有区别)
【问题讨论】:
-
仅在 XP 上崩溃?你在哪个 Windows 版本上检查这个?
-
仅在 Windows 7 上测试
-
对不起,我看起来很糟糕 - 如果
lpNumberOfBytesWritten==0仅从 win 8.1 开始,那么真的在 win7 上也一定会崩溃,这已更改并且还没有崩溃
标签: python winapi console subprocess sublimetext3