⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_65271.htm

📁 vc
💻 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&lt;IUnknown&gt; pUnknown;<BR>&nbsp;&nbsp;&nbsp;&nbsp;HRESULT hr;<BR>&nbsp;&nbsp;&nbsp;&nbsp;GUID materialCLSID;<BR>&nbsp;&nbsp;&nbsp;&nbsp;hr = ::CLSIDFromProgID (L&#34;material.materialObject&#34;,&amp;materialCLSID);<BR>&nbsp;&nbsp;&nbsp;&nbsp;hr = CoCreateInstance(materialCLSID,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,(void**) &amp;pUnknown);<BR>&nbsp;&nbsp;&nbsp;&nbsp;hr = pUnknown-&gt;QueryInterface (IID_IMaterialObject,(void**)materialObject);<BR>&nbsp;&nbsp;&nbsp;&nbsp;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&lt;IUnknown&gt; pUnknown;<BR>&nbsp;&nbsp;&nbsp;&nbsp;HRESULT hr;<BR>&nbsp;&nbsp;&nbsp;&nbsp;GUID materialCLSID;<BR>&nbsp;&nbsp;&nbsp;&nbsp;hr = ::CLSIDFromProgID (L&#34;material.materialObject&#34;,&amp;materialCLSID);<BR>&nbsp;&nbsp;&nbsp;&nbsp;hr = CoCreateInstance(materialCLSID,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,(void**) &amp;pUnknown);<BR>&nbsp;&nbsp;&nbsp;&nbsp;hr = pUnknown-&gt;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-&gt;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>&nbsp;&nbsp;&nbsp;&nbsp;importlib(&#34;stdole32.tlb&#34;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;importlib(&#34;stdole2.tlb&#34;);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;[<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uuid(B39EF000-84F6-4050-A383-E0C8FD3A832A),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helpstring(&#34;MaterialTemplate Class&#34;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;]<BR>&nbsp;&nbsp;&nbsp;&nbsp;coclass MaterialTemplate<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[default] interface IMaterialTemplate;<BR>&nbsp;&nbsp;&nbsp;&nbsp;};<BR>/*&nbsp;&nbsp;&nbsp;&nbsp;[<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uuid(5AA60D0E-D453-47A7-A149-6061E69A531F),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helpstring(&#34;MaterialObject Class&#34;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;]<BR>//&nbsp;&nbsp;&nbsp;&nbsp;coclass MaterialObject<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[default] interface IMaterialObject;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}; */<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 + -