【问题标题】:How do I activate VS2010's Process Debug Manager for JavaScript?如何激活 VS2010 的 JavaScript 进程调试管理器?
【发布时间】:2012-02-23 11:36:30
【问题描述】:

我有一个以 JavaScript 脚本形式提供可扩展性的服务器应用程序(不是网站,不是基于 HTML 或浏览器的)。从理论上讲,我应该能够通过称为 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 的脚本调试器,以便我可以运行进程调试管理器?

【问题讨论】:

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


    【解决方案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;
    }
    

    没有真正的错误检查,除了测试一个基本功能等什么都不做,但这不会引发任何错误。你没有提供任何关于“不起作用”的详细信息,正如我想我提到的,我不知道如何使用这些东西,但我至少可以用这段代码获得一个 IProcesDebugManager 和一个 IDebugApplication .

    【讨论】:

    • 不,它始终是 32 位的,并且所有类型都是正确的。但至少感谢您的回答。
    • 我无法想象为什么会这样,但我使用普通的旧 C++ 和 CoCreateInstance 编写了一个测试应用程序,但它与 E_INVALIDARG 一样失败。然后,经过一番谷歌搜索,我找到了使用 CoGetClassObject 和 IClassFactory::CreateInstance 的建议,所以我尝试了,它成功了!所以看看这是否适合你。 (我没有尝试对对象做任何事情,但我可以调用 IProcessDebugManager32::AddApplication 并返回 S_OK。
    【解决方案2】:

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

    【讨论】:

    • 这里没有 CLR。这是德尔福代码,我的代码是正确的。问题是 GUID 没有正确注册,所以 COM 找不到它。
    猜你喜欢
    • 2014-02-21
    • 2017-08-25
    • 2013-10-28
    • 1970-01-01
    • 2018-11-29
    • 2016-12-25
    • 2019-07-23
    • 1970-01-01
    • 2013-06-19
    相关资源
    最近更新 更多