从 VS10 应用程序中查找/终止进程(VC6 应用程序)?

Posted

技术标签:

【中文标题】从 VS10 应用程序中查找/终止进程(VC6 应用程序)?【英文标题】:Finding/terminating processes (VC6 applications) from a VS10 application? 【发布时间】:2011-09-07 13:32:47 【问题描述】:

有一点问题,所以通过询问它应该指出我正确的方向。我有一个从 VC6 移到 Visual Studio 2010 的 .dll。这个应用程序的目的是找到两个特定应用程序(它们是自定义 C++ VC6)的进程并终止它们 - 就这么简单。

在迁移到 Visual Studio 2010 后,唯一需要的更改是更改方法以在重载时返回流的引用并稍微修改 boost 智能指针(以便使用新字符串创建它应有的样子( ) 等。该代码似乎是正确的。

但是,现在我在使用这个 .dll 时遇到了两个错误。

a) 一个应终止的应用程序给出错误:“此应用程序已请求运行时以不寻常的方式终止它。”

b) 第二个应用程序没有终止,而是报错:“Pure Virtual Function Called”。

除了上面的小代码更改(我不会粘贴任何代码,因为大约有 8 个类值得),其他没有任何更改。在 VC6 中用于查找和终止/终止进程的方法在 Visual Studio 10 中肯定是相同的吧?

让 VC10 .dll 杀死 VC6 应用程序(或导致这些错误...)应该没有问题?

或者这可能是我的计算机独有的(即不是由 .dll 引起的,而是因为我的计算机上有不同的 Windows API - 因为我安装了 VS10)。

对这个有点困惑?!

停止进程的代码是:

HANDLE processHandle = ::OpenProcess( PROCESS_ALL_ACCESS, FALSE, processId_ );
   if( processHandle != NULL ) 
   
         ::EnumWindows( (WNDENUMPROC)stopProcessWindowEnumerator, processId_ );

    if( ::WaitForSingleObject( processHandle, 1000 ) != WAIT_OBJECT_0 )
    
      ::TerminateProcess( processHandle, 0 );
      ::WaitForSingleObject( processHandle, 1000 );
    
  

stopProcessWindowEnumerator 的代码:

BOOL CALLBACK RunningProcess::stopProcessWindowEnumerator( HWND hWnd, LPARAM lParam )

  DWORD processIdToStop = (DWORD)lParam;

  DWORD enumeratedWindowsProcessId;
  ::GetWindowThreadProcessId(hWnd, &enumeratedWindowsProcessId);

  if( processIdToStop == enumeratedWindowsProcessId )
  
    ::PostMessage( hWnd, remoteCloseMessage, 0, 0);
    return FALSE;
  

  return TRUE;

【问题讨论】:

stopProcessWindowEnumerator 中有什么内容? 【参考方案1】:

“Pure Virtual Function Called”通常表示代码中存在错误。它通常发生在从 ctor 或 dtor 的上下文中调用虚函数时,或者在已销毁的对象上调用时。

很可能这个错误一直潜伏在你的代码中,但没有被触发(或者没有任何后果,众所周知,VC6 实现了一些不应该被称为“标准 C++”的东西)。

对于另一个错误,我不知道,但你确定你要求它终止的方式不是“不寻常”的方式吗?

【讨论】:

请注意,被杀死的应用程序是用 VC6 编写的,但尚未迁移到 VS10。 VS10 只是简单地终止该进程。上面添加的代码显示了进程是如何终止的。【参考方案2】:

我怀疑你的接口定义。没有看到定义很难猜测。请仔细阅读以下文章,这可以帮助您找出问题所在

http://www.artima.com/cppsource http://support.microsoft.com/kb/125749

【讨论】:

谢谢。我唯一的问题是......该错误是否仅仅是由应用程序试图终止应用程序发出错误的进程引起的? VC6 应用程序中绝对没有修改提及虚函数错误的代码。

以上是关于从 VS10 应用程序中查找/终止进程(VC6 应用程序)?的主要内容,如果未能解决你的问题,请参考以下文章

VS或者VC6.0编写的C语言程序,怎样能够实现串口数据的收发?

通过从 .BAT 中查找正在使用的端口来终止进程

从另一个 Java 应用程序中查找并终止特定的 Java 进程

VS2015常用快捷键总结

VS2015常用快捷键总结

VS2015 之 常用快捷键