使用IDL文件生成组件注册代码,CoGetClassObject返回E_NOINTERFACE

hh_xj 2011-01-11 09:53:44
大家帮我看看,这个问题,

之前,我没有使用idl文件,
而是自己定义了一个虚类作为接口,
并且自己实现了DLL的DllGetClassObject类和Register****,
这样组件在一般情况下(no marsharl case)使用正常。

用idl定义接口的理由,很多,
所以我就把原来的这个接口定义改成 用idl来定义,
但是我把4个文件导入工程,
然后编译时,vs2008提示,error LNK2005: _DllGetClassObject@12 已经在 dlldata.obj 中定义

于是我把这几个自定义的Dll exports注释掉,
编译通过,
regsvr32注册组件,观察几个注册表项,InprocServer32正常

但是,客户代码CoGetClassObject(CLSID_my_object, IID_IFactoryClss)时,返回HRESULT E_NOINTERFACE




我有哪个地方做的不对吗?
...全文
223 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hh_xj 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yutaooo 的回复:]
进程内组件,没有代理/存根这个说法的吧。这东西应该是只在进程外组件中才有的概念。

我这么理解的。
[/Quote]
代理、存根,有一部分功能是跨套间通信,这对于进程内组件,也是需要的吧。
yutaooo 2011-01-12
  • 打赏
  • 举报
回复

这个dll的,包含动态链接库DllMain()的那个文件,你发上来瞧瞧。
yutaooo 2011-01-12
  • 打赏
  • 举报
回复

进程内组件,没有代理/存根这个说法的吧。这东西应该是只在进程外组件中才有的概念。

我这么理解的。
hh_xj 2011-01-12
  • 打赏
  • 举报
回复
是不是我理解错了?

proxy/stub dll 在进程内(inproc)组件中,并不代表组件本身。
它和进程外(local_server)组件的proxy/stub dll类似,只是在需要对接口调用进行marshal时,才开始发挥作用。它不提供组件ClassFactory查询。
这样:IClassFactory接口查询并不是由这个proxy stub来提供,而是通过真正的组件的DllGetClassObject或者CoRegisterClassObject)来得到,这个整正的组件是我们实现的另外的Dll或者exe?


望高手指正,
hh_xj 2011-01-12
  • 打赏
  • 举报
回复
我的推断是对的。



csdn再次不给力!!!!!!!!!!!!!!!
hh_xj 2011-01-12
  • 打赏
  • 举报
回复
兄弟啊!
这么晚回复我的问题。


我不知道我理解的对不对,今天试验下。
[Quote=引用 4 楼 yutaooo 的回复:]
这个dll的,包含动态链接库DllMain()的那个文件,你发上来瞧瞧。
[/Quote]
这个文件就定义了两个对象,一个idl里指定的coclass object类,一个类厂,但是几个导出函数,我都注释掉了,这几个函数是我在用非idl的方式来定义接口时,实现的。IDL定义时,我就把他们注释掉了

现在的问题应该是:idl文件产生的DllGetClassObject的行为我不太懂,我在1楼的描述里,明确加载这个Dll,调用它的DllGetClassObject,结果找不到类厂,不知道2楼的推断,对不对
hh_xj 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yutaooo 的回复:]
白天没上网。

dll中的有效代码你要贴出来,没代码怎么讨论呀,猜吗?
[/Quote]
这个问题我已经搞明白了,实验了一下,不管是进程内还是进程外组件,代理残根dll应该是分开注册的。
yutaooo 2011-01-12
  • 打赏
  • 举报
回复

白天没上网。

dll中的有效代码你要贴出来,没代码怎么讨论呀,猜吗?
hh_xj 2011-01-11
  • 打赏
  • 举报
回复

typedef HRESULT (__stdcall* f) (const CLSID &, const IID &, void **);
HMODULE dll = LoadLibrary(L"E:\\任务\\atl\\pure_com_proj\\debug\\pure_com_proj.dll");
f f_dgco = (f)GetProcAddress(dll, "DllGetClassObject");
HRESULT ret = f_dgco(CLSID_object, IID_IClassFactory, (void **)&cf);

用这段代码明确调用了下dll中的DllGetClassObject, ret值也是E_NOINTERFACE.

我的IDL是这样的:

[
object,
uuid(da964420-ccbc-478a-bd49-678c769b9339),
] interface IHello : IUnknown
{
HRESULT say_goodbye_to_com([out] int *cc);
};

[
object,
uuid(24e86315-973d-4859-b6bd-b2781b0b3801),
] interface IGoodbye : IUnknown
{
HRESULT say_hello_to_com([out] int *cc);
};

[
uuid(23234343-3101-1013-3311-001133110011)
] coclass object {
interface IHello;
interface IGoodbye;
};



3,245

社区成员

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

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