Поиск/завершение процессов (приложений VC6) из приложения VS10?

Имея небольшую проблему, которую я подумал, задав ее, я должен указать мне правильное направление. У меня есть .dll, которую я переместил из VC6 в Visual Studio 2010. Цель этого приложения — найти процессы двух конкретных приложений (которые являются пользовательскими C++ VC6) и завершить их — вот так просто.

При переходе на Visual Studio 2010 единственные необходимые изменения заключались в изменении метода для возврата ссылки на поток при перегрузке и незначительном изменении интеллектуального указателя boost (чтобы он создавался так, как он должен быть с новой строкой () и т. д. Этот код кажется правильным.

Однако теперь я получаю две ошибки при использовании этой .dll.

а) Одно приложение, которое должно быть завершено, выдает ошибку: «Это приложение запросило среду выполнения, чтобы завершить его необычным образом».

б) Второе приложение не завершается, а вместо этого выдает ошибку: "Вызвана чистая виртуальная функция".

Помимо небольших изменений кода выше (я пока не буду вставлять какой-либо код, поскольку существует около 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;
}

person Fids    schedule 07.09.2011    source источник
comment
Что в stopProcessWindowEnumerator?   -  person Roger Lipscombe    schedule 07.09.2011


Ответы (2)


«Вызвана чистая виртуальная функция» обычно указывает на ошибку в коде. Обычно это происходит, когда виртуальная функция вызывается из контекста ctor или dtor или при вызове уже уничтоженного объекта.

Вполне вероятно, что эта ошибка все время таилась в вашем коде, но не срабатывала (или не имела последствий, известно, что в VC6 реализовано то, что не заслуживает называться «стандартным C++»).

Что касается другой ошибки, я понятия не имею, но уверены ли вы, что способ, которым вы просите его завершить, не является «необычным» способом?

person PlasmaHH    schedule 07.09.2011
comment
Обратите внимание, что убиваемое приложение написано на VC6, но еще не перенесено на VS10. VS10 просто убивает процесс. Код, добавленный выше, показывает, как завершается процесс. - person Fids; 07.09.2011

Я сомневаюсь в вашем определении интерфейса. Трудно догадаться, не видя определений. Пожалуйста, просмотрите следующие статьи, которые могут помочь вам понять, что не так

person sarat    schedule 07.09.2011
comment
Спасибо. Моя единственная проблема в том, что... может ли эта ошибка быть вызвана просто приложением, пытающимся завершить процесс приложения, выдающего ошибку? Абсолютно никакой код не был изменен в приложении VC6, в котором упоминается ошибка виртуальной функции. - person Fids; 07.09.2011