为什么在Sublime Text下写入STD_OUTPUT_HANDLE会崩溃?

时间:2016-11-21 11:40:18

标签: python winapi console subprocess sublimetext3

我有一个应用程序碰巧使用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,但没有区别)

1 个答案:

答案 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);
}