抓狂!看了几天了, 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
我受不了了,怎么总是出错阿
...全文
892 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等类
内容概要:本文介绍了一个基于Python的无人机三维路径规划项目,采用差分进化算法(DE)在复杂三维环境中自动生成安全、高效的飞行路径。项目构建了包含起点、终点和多个长方体障碍物的三维空间模型,通过将路径编码为中间航点向量,利用差分进化进行全局优化。适应度函数综合考量路径长度、碰撞惩罚、安全距离、转弯代价、爬升能耗和高度约束,确保生成的路径在安全性、平滑性和可行性之间取得平衡。优化后还引入路径简化机制,删除冗余航点并检测直连安全性,以减少航点数量并提升可执行性。程序输出包括三维路径图、障碍物可视化、适应度收敛曲线及各项性能指标,支持后续扩展至真实地图、地形模型和动力学仿真。; 适合人群:具备Python编程基础,熟悉NumPy、matplotlib等库,从事无人机、智能优化、路径规划相关研究或开发的科研人员、研究生及工程师(工作年限1-3年或有相关项目经验者); 使用场景及目标:①解决城市、山区、工业区等复杂三维环境下的无人机避障路径规划问题;②学习差分进化算法在连续空间优化中的应用;③为低空物流、应急救援、巡检监测等实际场景提供算法原型与二次开发基础; 阅读建议:建议结合提供的完整代码与可视化结果进行实践,重点关注环境建模、适应度函数设计、差分进化实现与路径后处理逻辑,可通过调整参数(如种群规模、权重系数)观察优化效果变化,深入理解多目标权衡与算法调参策略。
内容概要:本文围绕2026年高教社杯全国大学生数学建模竞赛B题“无线电干扰源的快速自动定位与清除”提供了一套完整的数学建模、算法实现与论文撰写的免费资源。该资源由“荔枝科研社”出品,依托一个涵盖智能优化算法、机器学习、深度学习、信号处理、通信技术、电力系统管理等多个前沿领域的综合性科研资源共享平台。文档以MATLAB和Python为主要工具,聚焦于复杂工程问题的建模与求解,尤其在干扰源定位、状态估计、路径规划及优化调度等方面具有突出的应用价值。资源不仅包含竞赛题目解析,还提供了大量可复现的代码实例与技术文档,旨在帮助用户深入理解算法原理并提升科研实践能力。; 适合人群:具备一定编程基础,特别是熟练掌握MATLAB或Python语言的本科生、研究生,正在备战数学建模竞赛的学生,以及从事通信、信号处理、电力系统等相关领域研究的科研人员和技术开发者。; 使用场景及目标:①为参赛学生提供B题的完整解题思路、模型构建方法与代码实现路径,加速竞赛准备进程;②为科研工作者提供高质量、可复现的算法代码与技术参考,推动智能算法在无线通信、应急响应、环境监测等实际场景中的应用研究;③促进跨学科技术融合,支持教学、科研与工程实践的协同发展。; 阅读建议:建议读者结合文中提供的网盘链接与《荔枝科研社资源整理目录》系统性地查阅资料,优先选择与自身研究方向契合的技术模块进行深入学习,并动手运行代码以验证算法效果。同时推荐关注微信公众号“荔枝科研社”以获取持续更新的技术内容与社群支持。

3,248

社区成员

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

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