如何激活VS2010的JavaScript进程调试管理器?



我有一个服务器应用程序(不是网站,不是基于HTML或浏览器),它以JavaScript脚本的形式提供可扩展性。从理论上讲,我应该能够通过一种名为"进程调试管理器"的东西,使用Visual Studio的调试器对它们进行调试。

我已经正确安装并激活了VS2010,但当我调用CoCreateInstance时,就像这样:

CoCreateInstance(CLSID_ProcessDebugManager, nil,
  CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IProcessDebugManager, _PDM);

它返回$80070057 (E_INVALIDARG),这不是CoCreateInstance的记录行为。然而,文档描述了使用CoGetClassObject执行相同操作的另一种方法。当我尝试时,它会返回REGDB_E_CLASSNOTREG,这意味着CLSID没有在注册表中注册。

那么,我必须做些什么才能在注册表中注册VS2010的脚本调试器,以便运行Process Debug Manager呢?

如果你得到REGDB_E_CLASSNOTREG,你可能混合了32位和64位的东西:可能你试图从64位程序调用CoCreateInstance,除非你有64位版本的VS2010(他们有吗?)

我还发现,这是一个有人传递指向void的指针的例子,而不是指向void的指向指针的指针。您没有显示_PDM是什么类型,所以我无法判断您是否正确声明了它(尽管如果是这样的话,您应该得到编译器警告。)

编辑后添加:

#pragma comment(lib, "ole32.lib")
#define UNICODE
#define STRICT
#include <windows.h>
#include <activdbg.h>
#include <iostream>
using std::wcout;
using std::hex;
using std::endl;
int main(void)
{
    HRESULT hr;
    IProcessDebugManager *ppdm = NULL;
    IDebugApplication *pda = NULL;
    IClassFactory *pcf = NULL;
    DWORD cook = 0;
    CoInitialize(NULL);
    hr = CoGetClassObject(CLSID_ProcessDebugManager, CLSCTX_INPROC_SERVER,
        NULL, IID_IClassFactory, (LPVOID *)&pcf);
    wcout << L"CoGetClassObject: " << std::hex << hr << endl;
    if (FAILED(hr)) goto done;
    hr = pcf->CreateInstance(0, IID_IProcessDebugManager32, (LPVOID *)&ppdm);
    wcout << L"CreateInstance: " << std::hex << hr << endl;
    if (FAILED(hr)) goto done;
    pcf->Release();
    hr = ppdm->CreateApplication(&pda);
    wcout << L"CreateApplication: " << std::hex << hr << endl;
    if (FAILED(hr)) goto done;
    ppdm->AddApplication(pda, &cook);
    pda->SetName(L"Moosh!");
    ppdm->RemoveApplication(cook);
    pda->Release();
    ppdm->Release();
done:
    CoUninitialize();
    return 0;
}

没有真正的错误检查,除了测试一个基本函数等之外什么都不做,但这不会引发任何错误。你没有提供任何关于"不起作用"意味着什么的细节,正如我所提到的,我不知道如何使用这些东西,但我至少可以用这些代码获得一个IProcesDebugManager和一个IDebugApplication。

E_INVALIDARG通常指示向函数传递不正确的参数!通常不太清楚出了什么问题,我认为这是CLR和COM交互方式的产物。

IProcessDebugManager似乎是CLR接口,请参阅http://msdn.microsoft.com/en-us/library/w1ktkdaz%28v=vs.94%29.aspx

参数4似乎是CLR接口,而不是REFIID,但我不能确定,因为我不知道你使用的是什么语言,因为我无法识别"nil"的使用;C#使用"null",C++/CLI使用"nullptr",VB使用"Nothing"。

IID是GUID,用字符串表示,您的编译器会将CLR类型转换为字符串并传递它吗?我的最佳猜测是COM想要一个REFIID的真实GUID,并且不能解析IProcessDebugManager.ToString()抛出的任何内容。

最新更新