我的C程序使用ExitProcess将errorlevel传递回批处理文件.有时在Windows 7(Microsoft Windows [Version 6.1.7600])上,错误级别未正确解释.
我认为这应该永远运行.在Windows XP上,它似乎永远运行.在两台不同的双核Windows 7机器(一台64位,一台32位)上,它会在几分钟内失败.
我无法想象我做错了什么,但是如果在Windows 7上有一些关于ExitProcess的搞笑,我想我会问.这里有什么我非法做过的吗?
cmd.exe的批处理文件test.bat:
@ECHO OFF SET I=0 :pass SET /A I=I+1 Title %I% start/wait level250 if errorlevel 251 goto fail if errorlevel 250 goto pass :fail
程序级别250.c:
#include "windows.h" static volatile int Terminate = 0; static unsigned __stdcall TestThread(void * unused) { Terminate = 1; return 0; } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmdLine,int nCmdshow) { CreateThread(NULL,TestThread,NULL,NULL); while (Terminate == 0) Sleep(1); ExitProcess(250); }
我的编译器版本和调用是:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80×86
copyright (C) Microsoft Corp 1984-1998. All rights reserved.
cl /MT level250.c
其他信息:我也尝试在JPSoft的TCC下运行,并获得与使用CMD相同的行为.我使用的是直接的.c程序,而不是.cpp.我没有在单线程版本中看到任何失败.我把源和二进制文件放在http://jcook.info/win7fail上,zip文件MD5是579F4FB15FC7C1EA454E30FDEF97C16B,CRC32是C27CB73D.
编辑建议后,我进一步改变了测试用例,仍然看到了失败.在我们的实际应用中,有数百个线程.一些线程以各种重要的返回码退出,一些线程永远运行,一些线程挂在操作系统调用或dll中,并且很难(如果不是不可能)杀死.
#include "windows.h" static unsigned __stdcall TestThread(void * unused) { return 0; } int WINAPI WinMain(HINSTANCE hInstance,NULL); return(250); }
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。