关于com的一个牛逼的问题

兔子先生-zhang 2012-04-16 09:33:06
这个问题有点长,再加上本人表达能力有限,所以文字有点长:

我写了一个读取数据的com组件,然后在MFC中调用该组件读取数据,当然我事先手动注册过该组件了,程序都写好之后,编译也没有错误,好了,执行的时候,提示“运行错误”,经测试,是提示没有注册,可是我明明已经注册过了,后来,我听师姐说要在app类的InitInstance()函数中加入AfxOleInit();这样一行代码,结果真的好了(但是我在我之前的那个电脑上运行的时候不加AfxOleInit();代码运行也是正确的),我运行,也有正确的运行结果,但是没有运行多久程序就崩溃了,我调试的时候,提示有行代码越界访问了,但是我查看了很久,发现根本没有越界访问,而且,这个程序在我之前的电脑上运行的时候(注意,之前的电脑没有加AfxOleInit()代码,运行正确,也没有在任何一行代码里提示越界访问),是没有错误的,为什么我换了个电脑,就加了一行AfxOleInit()代码就出现越界访问了呢?
我想了很久,我觉得问题就出在AfxOleInit()这行代码上,两个电脑上除了这行代码之外,其他的都一样,是不是加上这行代码之前的电脑上也加上会出现越界访问,然后我就找到之前的电脑,加上AfxOleInit();这句代码,运行的时候果然也出现越界访问错误,把我高兴的差点跳起来。

现在知道问题出现在哪儿了(我推断就是AfxOleInit();这行代码的问题,不知道各位大神的看法是???),然后是怎么去改了,去掉它吧,明明注册过的组件的组件却提示没有注册过,不去吧,它运行一会就崩溃了,没有办法交代!

怎么办?
...全文
189 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子先生-zhang 2012-05-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
引用 10 楼 的回复:
引用 4 楼 的回复:
AfxOleInit是用来初始化的
使用com一定要调用这个函数
你说自己测试的时候不用应该是你编写com的时候环境已经初始化好了
你这里肯定是代码有问题
自己一点一点查吧


[/Quote]

我对com了解仅限于很基本的应用,基本功不扎实,见谅,呵呵。额,向你们学习了。
向立天 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
引用 4 楼 的回复:
AfxOleInit是用来初始化的
使用com一定要调用这个函数
你说自己测试的时候不用应该是你编写com的时候环境已经初始化好了
你这里肯定是代码有问题
自己一点一点查吧


你好,谢谢你的回答。

但是对与你说的使用com一定要加AfxOLeInit这个函数我不大认同,1、我亲自验证过,有些时候MFC中时不需要加的,但是同样的代码copy到另一个机子……
[/Quote]我没说一定要使用AfxOLeInit
AfxOLeInit是对CoInitialize( NULL )的封装
兔子先生-zhang 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
你有判断AfxOleInit的返回值吗?别轻易怀疑MFC提供的API,AfxOleInit除了初始化线程套间,还要注册消息过滤器。MFC只支持单线程套间,或许在执行AfxOleInit之前就有某加载的DLL也执行了初始化,所以即使你不执行AfxOleInit也不会出错。这种情况在不同机器上的行为可能不同,比如这个机器正常,那个机器出错,不能认定这是AfxOleInit的错,习惯上你要判断一下返回值……
[/Quote]

嗯,谢谢你的回答和提醒。


我判断过AfxOleInit它的返回值,返回值是非0的,我认为初始化成功了,我对套间的概念不清楚,可能我需要补补套间有关的知识。
redui 2012-04-19
  • 打赏
  • 举报
回复
你有判断AfxOleInit的返回值吗?别轻易怀疑MFC提供的API,AfxOleInit除了初始化线程套间,还要注册消息过滤器。MFC只支持单线程套间,或许在执行AfxOleInit之前就有某加载的DLL也执行了初始化,所以即使你不执行AfxOleInit也不会出错。这种情况在不同机器上的行为可能不同,比如这个机器正常,那个机器出错,不能认定这是AfxOleInit的错,习惯上你要判断一下返回值,以此判别当前运行状态是否存在套间类型冲突。

还有,“我的代码没有问题”这句话是很让人反胃的,慎用。
兔子先生-zhang 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
AfxOleInit是用来初始化的
使用com一定要调用这个函数
你说自己测试的时候不用应该是你编写com的时候环境已经初始化好了
你这里肯定是代码有问题
自己一点一点查吧
[/Quote]

你好,谢谢你的回答。

但是对与你说的使用com一定要加AfxOLeInit这个函数我不大认同,1、我亲自验证过,有些时候MFC中时不需要加的,但是同样的代码copy到另一个机子上的时候就可能要出现要加的情况。
2、用::CoInitialize( NULL )似乎可以替换AfxOleInit来初始化com,也是亲自验证过的。

我的代码没有问题,我将AfxOleInit换成::CoInitialize( NULL )之后问题都解决了。我现在是想知道为什么会这样???
兔子先生-zhang 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
首先确定哪一行代码崩溃的,没头没脑的谁能帮你
[/Quote]

谢谢你的帮忙。

因为代码比较多,看代码是件很烦人的事,我粘贴上来的话估计很多人会崩溃掉,所以我就没有粘贴,而且其实我几乎可以确定不是我代码本身的问题。而且后来也验证了我的猜测是正确的,问题就是出现在AfxOleInit这行代码上。
兔子先生-zhang 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
套间的问题?
CoInitialize或CoInitializeEx
[/Quote]

你好,谢谢你的回答。

你的答案是正确的,可以用::CoInitialize( NULL )来替换AfxOleInit,这样就不会出现我上面说的错误了,谢谢!
Kaile 2012-04-17
  • 打赏
  • 举报
回复
哪 台电脑上出问题,就在哪台电脑上调试,没人告诉你每台电脑上环境都可能不一样?
wshcdr 2012-04-17
  • 打赏
  • 举报
回复
觉得还是抓越界异常,然后来仔细分析
ouyh12345 2012-04-16
  • 打赏
  • 举报
回复
套间的问题?
CoInitialize或CoInitializeEx
兔子先生-zhang 2012-04-16
  • 打赏
  • 举报
回复
好吧,我自己顶一下!
fishion 2012-04-16
  • 打赏
  • 举报
回复
你可以远程调试你的组件的,如果连启动都失败,那就是没有进行套间的初始化工作,越界的,就得具体调试看看是哪一段代码出问题
向立天 2012-04-16
  • 打赏
  • 举报
回复
AfxOleInit是用来初始化的
使用com一定要调用这个函数
你说自己测试的时候不用应该是你编写com的时候环境已经初始化好了
你这里肯定是代码有问题
自己一点一点查吧
redui 2012-04-16
  • 打赏
  • 举报
回复
首先确定哪一行代码崩溃的,没头没脑的谁能帮你

3,245

社区成员

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

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