📄 subject_65271.htm
字号:
<p>
序号:65271 发表者:dave168 发表日期:2003-12-16 16:00:04
<br>主题:如何通过一个COM对象创建另外一个COM对象?
<br>内容:我现在遇到了一个问题,不知哪位可以帮助解决以下<BR>问题时这样的:<BR>我用ATL建立了一个组件对象CMaterialTemplate,它有一个方法CreateMaterialObject([out,retval]IDispatch ** materialObject),<BR>还有一个组件对象为CMaterialObject,通过上面的方法来创建,下面是我的代码:<BR>CComPtr<IUnknown> pUnknown;<BR> HRESULT hr;<BR> GUID materialCLSID;<BR> hr = ::CLSIDFromProgID (L"material.materialObject",&materialCLSID);<BR> hr = CoCreateInstance(materialCLSID,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,(void**) &pUnknown);<BR> hr = pUnknown->QueryInterface (IID_IMaterialObject,(void**)materialObject);<BR> return S_OK;<BR>程序编译通过,可是在VB里调用却得不到正确的结果。<BR>不知是方法不对,还是其他原因。高手可以指点一下吗,因为这个问题已经烦闷了好几天了。这个方法实现不了,我无法继续以后的工作。<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:dave168 回复日期:2003-12-16 20:29:37
<br>内容:我还有一个问题,在测试组件是,编译器给出如下的错误信息<BR>:cannot convert parameter 1 from 'struct IMaterialObject ** ' to 'struct IDispatch ** '<BR>我该镇么做呢.我想返回一个IMaterialObjec接口,可是参数却是IDispatch接口类型,我应该镇么作呢?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:CSW900 回复日期:2003-12-18 11:33:22
<br>内容:你的组件对象支持IDispatch接口吗?<BR>若支持,试试用:<BR><BR>CComPtr<IUnknown> pUnknown;<BR> HRESULT hr;<BR> GUID materialCLSID;<BR> hr = ::CLSIDFromProgID (L"material.materialObject",&materialCLSID);<BR> hr = CoCreateInstance(materialCLSID,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,(void**) &pUnknown);<BR> hr = pUnknown->QueryInterface (IID_Dispatch,materialObject);<BR><BR>如何?<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dave168 回复日期:2003-12-19 09:26:54
<br>内容:多谢楼上,发现了一个新的问题,可能不是hr = pUnknown->QueryInterface (IID_Dispatch,materialObject);中IID_Dispatch 或 IID_MaterialObject的错误。可能是后一个参数的问题。如果我的组件要在VB中使用的话,像IDispatch**的参数,VB是不能处理超过一级的间接寻址。所以在VB里的不到正确的返回值。不知拙见正确否,还希望共同探讨,如果是这个原因的话,应该如何解决呢?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:CSW900 回复日期:2003-12-22 17:46:25
<br>内容:把你的代码发过来,我看看再说!<BR>或者不要CMaterialTemplate对象,让vb直接创建CMaterialObject,然后再使用CMaterialObject对象的功能!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dave168 回复日期:2003-12-23 15:59:55
<br>内容:to CSW900<BR>我今天和同事讨论了一下,我在类型库里面注释掉了CMaterialObject类。<BR>如果不注释掉,上面的代码是可以在vb里实现的。<BR>library COMATERIALTEMPLATELib<BR>{<BR> importlib("stdole32.tlb");<BR> importlib("stdole2.tlb");<BR><BR> [<BR> uuid(B39EF000-84F6-4050-A383-E0C8FD3A832A),<BR> helpstring("MaterialTemplate Class")<BR> ]<BR> coclass MaterialTemplate<BR> {<BR> [default] interface IMaterialTemplate;<BR> };<BR>/* [<BR> uuid(5AA60D0E-D453-47A7-A149-6061E69A531F),<BR> helpstring("MaterialObject Class")<BR> ]<BR>// coclass MaterialObject<BR> {<BR> [default] interface IMaterialObject;<BR> }; */<BR>};<BR>这样为什么不行呢?<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:CSW900 回复日期:2003-12-24 09:41:56
<br>内容:当然不行啦!因为类型库没有CMaterialObject对象呀!你当然不能用CoCreateInstance创建呀!说了这莫久,为申莫不采用我说的方法呢!<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dave168 回复日期:2003-12-24 09:57:43
<br>内容:如果我暴露了CMaterialObject类,查询IMaterialObject接口也是成功的。希望以后可以多多帮忙
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:CSW900 回复日期:2003-12-24 10:01:46
<br>内容:把你的整个类型库贴出来我瞧瞧!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dave168 回复日期:2003-12-24 10:11:15
<br>内容:to csw900<BR>你说的是对的,如果不暴露对象信息的话,vb里是不能识别的<BR>对谢你的帮助!!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -