【发布时间】: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中有什么内容?
标签: c++ visual-studio-2010 visual-c++-6