我有一个服务器应用程序(不是网站,不是基于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。
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()抛出的任何内容。