Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.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
Windows 使用TerminateProcess时的具体风险是什么?_Windows_Winapi_Visual C++_Process - Fatal编程技术网

Windows 使用TerminateProcess时的具体风险是什么?

Windows 使用TerminateProcess时的具体风险是什么?,windows,winapi,visual-c++,process,Windows,Winapi,Visual C++,Process,我的Win32 console应用程序使用第三方库。退出WinMain后,全局对象销毁开始,AV在内部深处发生。我真的很想写作 TerminateProcess( GetCurrentProcess(), 0 ); 在WinMain的尽头附近。如果我这样做,应用程序将优雅地结束 但这样做可能会损害动态链接库(DLL)维护的全局数据的状态,这一点尚不清楚。我知道,如果我有某个全局对象,它的析构函数就不会运行,我有可能无法完成数据库连接或类似的操作。我的程序里没有这样的东西 使用Terminate

我的Win32 console应用程序使用第三方库。退出WinMain后,全局对象销毁开始,AV在内部深处发生。我真的很想写作

TerminateProcess( GetCurrentProcess(), 0 );
在WinMain的尽头附近。如果我这样做,应用程序将优雅地结束

但这样做可能会损害动态链接库(DLL)维护的全局数据的状态,这一点尚不清楚。我知道,如果我有某个全局对象,它的析构函数就不会运行,我有可能无法完成数据库连接或类似的操作。我的程序里没有这样的东西


使用TerminateProcess时的具体风险是什么?如何确定是否可以将其用于我的目的?

根据该文件和ExtiProcess的文档,主要的问题似乎是在不调用带有标志DLL\u PROCESS\u DETACH的DllMain的情况下卸载DLL


我的2个理由:文档中有一种偏执的想法,认为你会打乱在DllMain+Dllu进程中运行的一些关键操作。任何依赖于此来维护临界状态的人都已经受到任务管理器的摆布,因此我认为使用此API不会有很大的风险

这取决于你如何解释“全球数据”。如果你把它理解为(正如我通常所说的)存储在进程地址空间中的数据,那么这个建议就毫无意义了——我们知道内存将消失,那么谁会在乎会发生什么呢


因此,它可能是指DLL在操作系统范围内所做的事情,这些事情在任何进程的生命周期之外都会持续存在。一个简单的例子是可能需要清理的临时文件;多次崩溃进程会耗尽磁盘空间,因此最好不要养成习惯。

好吧,如果你没有做任何“花哨”的事情(包括但不限于:创建线程、锁、数据库连接、使用COM对象),那么就不会发生什么可怕的事情。但是作为一个例子,你不知道DLL在操作系统范围内做什么,你当然也不知道这在将来是否会改变,所以依赖它是非常脆弱的


您不想知道为什么会发生这种访问冲突吗?这很可能是某种东西在很久以前就已经腐化的迹象。请至少确认该错误是由该第三方库引起的,例如编写一个与库链接但其
main()
不执行任何操作的程序,并确认这会导致相同的崩溃。

通常,当与进程外的对象交互时,会发生不好的事情。例如,假设您有一些共享内存,这些内存由多个进程使用,您的进程将对其进行写入,而其他进程将对其进行读取和/或写入。通常使用互斥来同步读写操作。如果进程中的线程已经获取互斥体,并且在调用终端终止时正在进行更改,则互斥体将被放弃,共享内存可能处于不一致的状态。
我怀疑您错过了使用其中一个第三方库的机会。DllMain有些限制,因此该库可能具有您应该调用的初始化和取消初始化函数。

AV=访问冲突,由于内存访问不良而崩溃,这是该第三方库的性质?该库进行光学字符识别。我猜除了内存之外,它不会修改任何东西,但of cource不能确定。+1,但我想换个说法:使用TerminateProcess()与通过任务管理器终止进程一样危险。选择此选项是为了一个可能导致问题的案例的好例子。调试完这个问题后,我发现问题在于库并不总是调用我们的回调函数,该函数在卸载之前会执行适当的去初始化。在没有去初始化的情况下,静态全局对象被销毁的顺序是:首先销毁一个包含对象池的堆,然后尝试取消分配这些对象。这导致了崩溃,因为对象指针已经指向解除分配的堆内存。因为我们的代码中有一个点总是在应用程序终止期间被调用,所以我只添加了一个与回调所做的操作等效的步骤。问题已经解决了。