如何为JavaScript激活VS2010的Process Debug Manager?

时间:2012-01-31 18:21:33

标签: javascript visual-studio visual-studio-2010 debugging com

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

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

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

它返回$80070057 (E_INVALIDARG)is not documented behavior for CoCreateInstance.但是,文档描述了使用CoGetClassObject执行相同操作的另一种方法。当我尝试时,它返回REGDB_E_CLASSNOTREG,这意味着CLSID未在注册表中注册。

那么我需要做什么来在注册表中注册VS2010的脚本调试器,以便我可以运行Process Debug Manager?

2 个答案:

答案 0 :(得分:1)

如果您正在获取REGDB_E_CLASSNOTREG,您可能正在混合使用32位和64位内容:可能您尝试从64位程序调用CoCreateInstance,除非您有64位VS2010的比特版(他们有一个?)

我还发现this是一个将指针传递给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;
}

没有真正的错误检查,除了测试一个基本功能等之外什么都不做,但这并不会引发任何错误。你没有提供关于什么&#34;没有工作的任何细节&#34;意思是,正如我想的那样,我不知道如何使用这些东西,但我至少可以用这段代码获得一个IProcesDebugManager和一个IDebugApplication。

答案 1 :(得分:0)

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()吐出的任何内容。