抓狂!看了几天了, CoCreateInstance总是出错!!!!救命啊!

bluegirl2003 2005-05-20 07:46:43
一个很简单的程序:

#include <iostream.h>
#import "D:\WINDOWS\system32\msbn3.dll" rename_namespace("MMSBN3")
using namespace MMSBN3;

bool test()
{

if( FAILED( CoInitialize(NULL) ) )
{
cout<<"CoInitialize Failed!"<<endl;
return FALSE;
}

IModelPtr pModel;
HRESULT hr = pModel.CreateInstance(__uuidof(IModel),NULL);
if(FAILED(hr))
{
cout<<"CreateInstance failed!"<<endl;
return FALSE;
}
cout<<"OK!"<<endl;

CoUninitialize();
}


void main()
{
test();
}

但是每次输出结果都是:CreateInstance failed!
跟踪看了一下,CreateInstance 调用了CoCreateInstance,而CoCreateInstance返回的值
hr = -2147221164
我受不了了,怎么总是出错阿
...全文
679 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluegirl2003 2005-05-26
  • 打赏
  • 举报
回复
多谢多谢!
honorwinner 2005-05-25
  • 打赏
  • 举报
回复
参考一下我的代码:
CComPtr<IMMTGenerator> tGenerator;
const IID IID_IMMTGENERATOR = {0xC753602D,0x67AA,0x4B91,{0x97,0xD3,0x19,0xA7,0xE6,0x34,0x0D,0x70}};

CLSID clsid;
hr = CLSIDFromProgID( L"Generator.MMTGenerator" , &clsid );
if(FAILED(hr))
{
AfxMessageBox("Error: CLSIDFromProgID([Generator.MMTGenerator])");//
return;
}


hr = CoCreateInstance (clsid, 0, CLSCTX_INPROC_SERVER, IID_IMMTGENERATOR, (void**)&tGenerator);
if (SUCCEEDED(hr))
{
}
lxcLinuxer 2005-05-24
  • 打赏
  • 举报
回复
#include <iostream>
#include <iomanip>
#include <stdexcept>
#define _WIN32_DCOM

#import "D:\WINDOWS\system32\msbn3.dll" named_guids no_namespace

using namespace std;

int main()
{
::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
try{
IModelPtr ptr(__uuidof(Model));

}catch(_com_error e)
{
cerr<<e.ErrorMessage() <<endl;
}
::CoUninitialize();
return 0;
}
lxcLinuxer 2005-05-24
  • 打赏
  • 举报
回复
#include <iostream>
#include <iomanip>
#include <stdexcept>
#define _WIN32_DCOM

#import "D:\WINDOWS\system32\msbn3.dll" named_guids no_namespace

using namespace std;

int main()
{
::CoInitialize(NULL);
try{
IModelPtr ptr(__uuidof(Model));

}catch(_com_error e)
{
cerr<<e.ErrorMessage() <<endl;
}
::CoUninitialize();
return 0;
}
JerKii 2005-05-24
  • 打赏
  • 举报
回复
可不是?CreateInstance创建的是组件,而不是接口,所以应该是__uuidof(Model),也就是
pModel.CreateInstance(CLSID_Model,....)

如果你用的是.Net 2003那么你在HRESULT hr = pModel.CreateInstance(__uuidof(Model),NULL); 处设置断点,当运行到这个地方.Net 2003会把hr代表的意思显示出来的.这样你就知道是什么原因了.
dongfa 2005-05-23
  • 打赏
  • 举报
回复
发到我信箱,我帮你看看.
dongfa@yeah.net
Fanjj 2005-05-23
  • 打赏
  • 举报
回复
将该句"HRESULT hr = pModel.CreateInstance(__uuidof(IModel),NULL); "
改为"HRESULT hr = pModel.CreateInstance(__uuidof(Model),NULL); ",
应该没问题.
RevivalSky 2005-05-21
  • 打赏
  • 举报
回复
IModelPtr pModel; ???

COM的写法应该是MMSBN3::_IModelPtr pModel;
bluegirl2003 2005-05-21
  • 打赏
  • 举报
回复
由于我只有.dll文件,没有.h文件和什么.lib文件,所以我就用了
#import "D:\WINDOWS\system32\msbn3.dll" rename_namespace("MMSBN3")
using namespace MMSBN3;

然后可以看到它生成的msbn3.tlh和msbn3.tli文件。

怎么在它的DllGetClassObject()函处设置一个断点?我怎么没有看到这个函数?
汗。。。刚接触COM,请详细指教。

我只想快点解决怎么用这个东东,好进行其他编程任务
bluegirl2003 2005-05-21
  • 打赏
  • 举报
回复
:(还是没有解决!如果哪位高人愿意帮忙,我可以把dll文件给他调试。再弄不出来我真的想跳楼了
Cline 2005-05-20
  • 打赏
  • 举报
回复
有时返回"未注册"错误,实际上并不一定是真的未注册!

这个组件是个dll,那好,你在它的DllGetClassObject()函处设置一个断点,然后进行跟踪.

有时,类工厂中错也会报"未注册"之错,比如Object Map中未把类工厂连好!
bluegirl2003 2005-05-20
  • 打赏
  • 举报
回复
我看注册表里面还有两项是ProxyStubClsid 和 ProxyStubClsid32,
对应的属性是:
name type Data
(default) REG_SZ {00020424-0000-0000-C000-000000000046}

难道是我把 Clsid_Imodel 的值设置错了???

汗。。。请高手赐教!!
bluegirl2003 2005-05-20
  • 打赏
  • 举报
回复
我在注册表里面找到了 IModel 对应的interface,
是{28D465B6-E11A-11D0-8698-00A0C90DC825}。


程序改为:
#include <iostream.h>
#import "D:\WINDOWS\system32\msbn3.dll" rename_namespace("MMSBN3")
using namespace MMSBN3;

bool test()
{
const CLSID Clsid_Imodel = {0x28D465B7,0xE11A,0x11D0,{0x86,0x98,0x00,0xA0,0xC9,0x0D,0xC8,0x25}};//我自己定义的,不知道这里有没有错

if( FAILED( CoInitialize(NULL) ) )
{
cout<<"CoInitialize Failed!"<<endl;
return FALSE;
}

IModelPtr pModel;
HRESULT hr = CoCreateInstance(Clsid_Imodel,NULL,CLSCTX_ALL,__uuidof(IModel),reinterpret_cast<void**>(&pModel));//这里改了

if(FAILED(hr))
{
cout<<"CreateInstance failed!"<<endl;
return FALSE;
}
cout<<"OK!"<<endl;

CoUninitialize();
}


void main()
{
test();
}
运行结果还是CreateInstance failed,hr 还是等于 -2147221164

???
bluegirl2003 2005-05-20
  • 打赏
  • 举报
回复
请问 rclsid 是怎么得到的?
jsphuang 2005-05-20
  • 打赏
  • 举报
回复
楼主:建议你在你的程序里用这个函数返回你需要的接口
CoCreateInstance(rclsid, pOuter, dwClsContext, GetIID(), reinterpret_cast<void**>(&m_pInterface));
bluegirl2003 2005-05-20
  • 打赏
  • 举报
回复
CreateInstance的代码如下:

// Loads an interface for the provided CLSID.
// Returns an HRESULT. Any previous interface is released.
//
HRESULT CreateInstance(const CLSID& rclsid, IUnknown* pOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) throw()
{
HRESULT hr;

_Release();

if (dwClsContext & (CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER)) {

IUnknown* pIUnknown;

hr = CoCreateInstance(rclsid, pOuter, dwClsContext, __uuidof(IUnknown), reinterpret_cast<void**>(&pIUnknown));

if (FAILED(hr))
{return hr;}

hr = OleRun(pIUnknown);

if (SUCCEEDED(hr)) {
hr = pIUnknown->QueryInterface(GetIID(), reinterpret_cast<void**>(&m_pInterface)); }

pIUnknown->Release();
}

else {
hr = CoCreateInstance(rclsid, pOuter, dwClsContext, GetIID(), reinterpret_cast<void**>(&m_pInterface));
}

return hr;
}
bluegirl2003 2005-05-20
  • 打赏
  • 举报
回复
我把 HRESULT hr = pModel.CreateInstance(__uuidof(IModel),NULL);
改成 HRESULT hr = pModel.CreateInstance(__uuidof(Model),NULL);
还是一样的结果。

急着用这个dll文件,又刚开始看com,不是很懂。

看了几天了,真郁闷阿!交不了差阿。

另:我虽然用的是vc,但用的是Win32控制台程序。
bluegirl2003 2005-05-20
  • 打赏
  • 举报
回复
我已经给msbn3.dll注册了,命令如下:

regsvr32.exe D:\WINDOWS\system32\msbn3.dll

而且我在注册表里面也可以找到 msbn3.dll 以及 IModel等类

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧