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

问题描述:

有一点点的问题,所以认为它应该指向正确的方向。我有一个.dll,我已经从VC6转移到Visual Studio 2010.这个应用程序的重点是找到两个特定应用程序(它们是自定义C++ VC6)的进程并终止它们 - 这很简单。从VS10应用程序中查找/终止进程(VC6应用程序)?

在移动向Visual Studio 2010中,唯一需要的变化是改变方法重载和稍微修改升压智能指针(所以它创造了它应该如何用新的字符串时返回一个流的参考()等,该代码似乎是正确的

不过,我现在用的这个.dll时收到两个错误

一)应终止一个应用程序提供了一个错误:“该应用程序已请求运行时以不寻常的方式终止它。“

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

是什么在'stopProcessWindowEnumerator'? –

+0

添加上面的代码。 – Fids

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

这个错误很可能一直存在于你的代码中,但没有被触发(或者没有任何后果,VC6被认为实现了一些不应该被称为“标准C++”的东西)。

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

+0

请注意,被终止的应用程序是用VC6编写的,但尚未迁移到VS10。VS10只是杀死这个过程。上面添加的代码显示了一个过程如何终止。 – Fids

我怀疑你的接口定义。没有看到定义就很难猜测。请通过下面的文章,它可以帮助你找出什么是错的

+0

谢谢。我唯一的问题是...可以简单地通过应用程序尝试终止发布错误的应用程序过程来引起错误吗?在VC6应用程序中绝对没有修改过提到虚函数错误的代码。 – Fids