posts - 13,  comments - 11,  trackbacks - 0
    昨天晚上写COM组件时突然碰到创建一个COM对象时,返回0x80040154,没有注册类型...搞得一头雾水.检查了创建函数,参数,GUID,注册表中的各项都正常....
    最后没辙了,只能新建一个COM工程试试,结果也是一样的(在同一个工程中测试).后来又新建了一个测试工程,也重新编译COM工程,结果却返回E_NOINTERFACE,晕啊.创建的对象明明支持这个接口的啊.我追踪到ATL的代码里,发现我查询的接口确实找到了,但最后还是返回E_NOINTERFACE. 经过几次调试,发现老是查询IMarshaling等几个与列集有关的接口,f却总找不到....后来在网上找到了一篇文章,找明白了一些.
 参考:http://blogs.msdn.com/oldnewthing/archive/2004/12/13/281910.aspx
   

Why do I get E_NOINTERFACE when creating an object that supports that interface?

I've seen a few questions from people who call the CoCreateInstance function, asking for an interface that they know the object supports, yet receiving error E_NOINTERFACE. What's going on?

You're seeing the same problem as the missing IMarshal, just from the other side.

If your threading model is incompatible with the threading model of the object you're creating, then COM marshalling kicks in. And if the marshalling stuff isn't there, the error that comes out is E_NOINTERFACE, because the marshalling interface is missing.

A common source of this is attempting to use COM objects provided by the shell from a multi-threaded apartment. Remember that shell COM objects are, for the most part, apartment-threaded, not free-threaded. If you want to use shell objects, you should do so from single-threaded apartments.

Published Monday, December 13, 2004 8:51 AM by oldnewthing Filed under:


------------------------------

    后来我看了下我的测试工程是/MDd,而COM工程的线程模型是Free,改成Apartment就好了.解释如上.但我愚钝,还是一知半解,五一好好钻研下这两个问题:

    1.没有注册类型

    2.E_NOINTERFACE
posted on 2008-04-29 11:35 冰风谷 阅读(4773) 评论(0)  编辑 收藏 引用 所属分类: 存疑待解编程中的贝壳

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(2)

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜