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

时间:2011-09-07 13:32:48

标签: c++ visual-studio-2010 vc6

通过询问它有一点问题,应该指出我正确的方向。我有一个.dll,我已经从VC6迁移到Visual Studio 2010.这个应用程序的目的是找到两个特定应用程序(自定义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;
}

2 个答案:

答案 0 :(得分:1)

“Pure Virtual Function Called”通常是代码中错误的指示符。它通常发生在从ctor或dtor的上下文中调用虚函数时,或者在已经被破坏的对象上调用时。

很可能这个bug一直潜伏在你的代码中,但是没有被触发(或者没有后果,已知VC6实现的东西不值得被称为“标准C ++”)。

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

答案 1 :(得分:1)

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

相关问题