我的代码出了什么问题我试图以下列方式在注册表中注册该类但是在我调试时它显示该类未注册且应用程序崩溃。
此代码有什么问题请帮助我。
Test::IDiscover *pICalc = NULL;
HRESULT hRes=CoCreateInstance(Test::CLSID_SqlClass, NULL,
CLSCTX_INPROC_SERVER,Test::IID_IDiscover, reinterpret_cast<void**> (&pICalc));
if(hres<0)
cout<<"register failure"<<endl;
else
cout<<"register success"<<endl; // and i am not free the memory any where...
我也尝试过:
IDiscoverPtr pt(__uuid(SqlClass));
HRESULT hRes=CoCreateInstance(Test::CLSID_SqlClass, NULL,
CLSCTX_INPROC_SERVER,Test::IID_IDiscover, reinterpret_cast<void**> (&pICalc));
if(hres<0)
cout<<"register failure"<<endl;
else
cout<<"register success"<<endl;
如果我在
调试时这样做的话IDiscoverPtr pt__uuid(SqlClass));
调试进入此功能并在内部显示COM错误。
答案 0 :(得分:1)
IDiscover
接口定义在哪里?您需要注册已实现此接口的特定DLL / EXE。为了给你一个提示,这将是你有一个名为SqlClass
的类的DLL。这很可能是一个Com DLL。在命令行上使用regsvr32
注册该DLL。
类似的东西:
regsvr32 "MyDllFullPath.dll"
要进一步了解,确切的错误是什么,请告诉我们hres
的确切价值是什么。我猜它是一个数值,转换为Class Not Registered
错误。
答案 1 :(得分:1)
您正在尝试创建名为SqlClass的COM类的实例。您实际上并没有尝试注册该COM类。 要注册COM类,您需要执行
regsvr32 SqlClass.dll,如果您的COM类是进程服务器
sqlclass.exe / regserver如果您的COM类是进程外服务器。
您使用COM智能指针的事实告诉我您的SqlClass位于DLL中,并且您使用#import来引用它。所以使用regsvr32 SqlClass.dll
另一个方面是始终使用宏SUCCEEDED或FAILED来检查COM调用的hresult返回值。
答案 2 :(得分:0)
由于您说您已使用regasm.exe注册了DLL,请使用oleview.exe检查注册是否正确完成。转到左侧树视图中的“所有对象”节点,查找是否存在SqlClass组件。
我无法在您的代码中看到CoInitialize(NULL)调用。你在调用CoCreateInstance之前调用CoInitialize(NULL)吗?
还可以指定COM错误代码吗?
答案 3 :(得分:0)
注册暴露给COM的.NET程序集时,请使用regasm.exe工具。不要忘记/codebase
命令行开关很重要。没有这个开关,regasm只会将DLL的名称放入注册表,而不是它的完整路径,当消费者(你的应用程序)试图调用CoCreateInstance()时,COM将无法找到DLL实际所在的位置。