通过询问它有一点问题,应该指出我正确的方向。我有一个.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;
}
答案 0 :(得分:1)
“Pure Virtual Function Called”通常是代码中错误的指示符。它通常发生在从ctor或dtor的上下文中调用虚函数时,或者在已经被破坏的对象上调用时。
很可能这个bug一直潜伏在你的代码中,但是没有被触发(或者没有后果,已知VC6实现的东西不值得被称为“标准C ++”)。
对于另一个错误,我不知道,但你确定你要求它终止的方式不是一种“不寻常”的方式吗?
答案 1 :(得分:1)
我怀疑你的界面定义。没有看到定义就很难猜到。请仔细阅读以下文章,这些文章可以帮助您找出问题所在