Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么写入STD_OUTPUT_会在升华文本下崩溃?_Python_Winapi_Console_Subprocess_Sublimetext3 - Fatal编程技术网

Python 为什么写入STD_OUTPUT_会在升华文本下崩溃?

Python 为什么写入STD_OUTPUT_会在升华文本下崩溃?,python,winapi,console,subprocess,sublimetext3,Python,Winapi,Console,Subprocess,Sublimetext3,我有一个应用程序,它在从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(c

我有一个应用程序,它在从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);
}
根据这一点,应该相当于使用subprocess.Popen。但是,当我调用这个“构建系统”时,Sublime的输出窗格显示
abc
,然后对WriteFile的调用会崩溃

0xC0000005: Access violation writing location 0x00000000.

这里发生了什么?这是我的代码、Sublime还是WriteFile中的问题?有什么办法吗?(我尝试使用
shell\u cmd
而不是
cmd
,但这没有什么区别)

您将错误的参数传递给:

LPNumberOfBytes写入[输出,可选]
仅当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);
}
#包括
int main(int argc,字符**argv){
手柄控制台=GetStdHandle(标准输出手柄);
if(GetFileType(控制台)=文件类型未知)
返回;
DWORD DWBYTESSWRITED{};
WriteFile(控制台,“abc”,3和DWBytesWrited,0);
}

bonks head on keyboard所以我们很幸运,这个应用程序在数十台不同的机器上运行了数千小时,在控制台上打印了数千行,没有任何问题?知道为什么会出现这种情况吗?尤其是在“崇高”环境下?@stijn:我对此思考了一些,但无法给出解释,为什么在某些条件下,这种方法似乎能可靠地工作,而在其他条件下却不能。我能想象的唯一一件事是,I/O流重定向在这方面发挥了作用,幸运的是,重定向的流不会报告写入的字节,
WriteFile
从不尝试写入
*lpnumberofbytesswrite
。不过,这只是猜测。@stijn-真正的WriteFile检查
lpnumberofbytesbyteswrite!=0
并且仅在这种情况下使用此指针(与流重定向无关)。然而,根据文档,确实需要使用有效且不为零的
LPNumberOfBytesWrited
-以了解bug的确切位置-最佳选项-调试codebug definitely并非因为LPNumberOfBytesWrited==0在Windows 7及更早版本上,控制台句柄是伪句柄而非真实句柄。我相信这意味着写操作要经过一个完全不同的代码路径,所以行为上的一些差异是可以预料的。只在XP上崩溃?您在哪个windows版本上检查此项?仅在windows 7上测试抱歉,我的外观不好-如果
lpnumberofbytesswrited==0,则在win7上也必须崩溃
#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);
}