Имея небольшую проблему, которую я подумал, задав ее, я должен указать мне правильное направление. У меня есть .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;
}
stopProcessWindowEnumerator
? - person Roger Lipscombe   schedule 07.09.2011