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