﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-明镜台(C++)</title><link>http://www.cppblog.com/zhleonix/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 10 Apr 2026 17:48:17 GMT</lastBuildDate><pubDate>Fri, 10 Apr 2026 17:48:17 GMT</pubDate><ttl>60</ttl><item><title>C++进行COM 自动化调用时的命名参数调用方法</title><link>http://www.cppblog.com/zhleonix/archive/2006/07/28/10628.html</link><dc:creator>菠萝蜜多</dc:creator><author>菠萝蜜多</author><pubDate>Fri, 28 Jul 2006 01:58:00 GMT</pubDate><guid>http://www.cppblog.com/zhleonix/archive/2006/07/28/10628.html</guid><wfw:comment>http://www.cppblog.com/zhleonix/comments/10628.html</wfw:comment><comments>http://www.cppblog.com/zhleonix/archive/2006/07/28/10628.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/zhleonix/comments/commentRss/10628.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhleonix/services/trackbacks/10628.html</trackback:ping><description><![CDATA[
		<font size="2">C++使用COM自动化组件时，通过获取IDispatch接口，然后通过Invoke方法对COM组件的方法进行调用。在对Office组件的编程中，我们会经常性的使用这一方法。<br />在VBA中，存在一种命名参数的调用法。如Word的Documents对象中的Open方法：<br /></font>
		<font style="BACKGROUND-COLOR: #d3d3d3">
				<font size="2">
						<strong>Documents.Open</strong>(<b class="bterm">FileName</b>, <b class="bterm">ConfirmConversions</b>, <b class="bterm">ReadOnly</b>, <b class="bterm">AddToRecentFiles</b>, <b class="bterm">PasswordDocument</b>, <b class="bterm">PasswordTemplate</b>, <b class="bterm">Revert</b>, <b class="bterm">WritePasswordDocument</b>, <b class="bterm">WritePasswordTemplate</b>, <b class="bterm">Format</b>, <b class="bterm">Encoding</b>, <b class="bterm">Visible</b>, <b class="bterm">OpenConflictDocument</b>, <b class="bterm">OpenAndRepair</b>, <b class="bterm">DocumentDirection</b>, <b class="bterm">NoEncodingDialog</b>)</font>
				<font size="3">
						<br />
						<font style="BACKGROUND-COLOR: #ffffff" size="2">其中只有FileName参数为必须的参数，其他参数都为可选的参数。在进行调用时，VBA中可通过指定可选参数名称来向Documents传输任意的可选参数，如下<br /></font>
						<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
								<font size="2">
										<span style="COLOR: #008000">'</span>
										<span style="COLOR: #008000">以只读方式打开文档 MyDoc.doc。</span>
								</font>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #0000ff">
										<font size="2">Sub</font>
								</span>
								<font size="2">
										<span style="COLOR: #000000"> OpenDoc()<br />    Documents.Open FileName:</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">C:\MyFiles\MyDoc.doc</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">, </span>
										<span style="COLOR: #0000ff">ReadOnly</span>
										<span style="COLOR: #000000">:</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #0000ff">True</span>
								</font>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #0000ff">
										<font size="2">End Sub</font>
								</span>
								<span style="COLOR: #000000">
										<br />
										<br />
								</span>
						</div>
						<font style="BACKGROUND-COLOR: #ffffff">
								<font size="2">那么，在C++中，我们应该如何进行这种调用？先看看Invoke方法的声明</font>
								<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
										<span style="COLOR: #000000">HRESULT Invoke(  <br /><br />  DISPID  dispIdMember,      <br /><br />  REFIID  riid,              <br /><br />  LCID  lcid,                <br /><br />  WORD  wFlags,              <br /><br />  DISPPARAMS FAR</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000">  pDispParams,  <br /><br />  VARIANT FAR</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000">  pVarResult,  <br /><br />  EXCEPINFO FAR</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000">  pExcepInfo,  <br /><br />  unsigned </span>
										<span style="COLOR: #0000ff">int</span>
										<span style="COLOR: #000000"> FAR</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000">  puArgErr  <br /><br />);<br /></span>
								</div>
								<br />
						</font>
				</font>
				<font style="BACKGROUND-COLOR: #ffffff">
						<font size="2">其中的pDispParams用于方法的参数传递，声明如下</font>
						<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
								<font size="2">
										<span style="COLOR: #000000">typedef </span>
										<span style="COLOR: #0000ff">struct</span>
								</font>
								<font size="2">
										<span style="COLOR: #000000"> FARSTRUCT tagDISPPARAMS{<br /><br />VARIANTARG FAR</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000"> rgvarg;</span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000"> Array of arguments.</span>
								</font>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #000000">
										<br />
										<font size="2">DISPID FAR</font>
								</span>
								<font size="2">
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000"> rgdispidNamedArgs; </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000"> Dispatch IDs of named arguments.</span>
								</font>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #000000">
										<br />
										<font size="2">unsigned </font>
								</span>
								<font size="2">
										<span style="COLOR: #0000ff">int</span>
										<span style="COLOR: #000000"> cArgs;</span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000"> Number of arguments.</span>
								</font>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #000000">
										<br />
										<font size="2">unsigned </font>
								</span>
								<font size="2">
										<span style="COLOR: #0000ff">int</span>
										<span style="COLOR: #000000"> cNamedArgs; </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000"> Number of named arguments.</span>
								</font>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #000000">
										<br />
										<font size="2">} DISPPARAMS;<br /></font>
								</span>
						</div>
						<font size="2">通过rgdispidNamedArgs可指定传入的命名参数，因此可以将上述VBA代码转化为下面的C++代码(这里使用了ATL)，实现命名参数的调用
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">       CComPtr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Word::Documents</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> qpDocuments;<br />        m_qpApplication</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">get_Documents(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">qpDocuments);<br />            <br />        CComDispatchDriver qpDocsDisp </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> qpDocuments;<br />        CComVariant varFilename(L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C:\MyFiles\MyDoc.doc</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />        CComVariant varTrue(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br />            <br />        CComVariant varDisp;<br />        DISPID dispids[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">];<br />        LPOLESTR  names[] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> {L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Open</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">FileName</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ReadOnly</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">};<br />        hr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> qpDocsDisp</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetIDsOfNames(IID_NULL, names, </span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">, LOCALE_USER_DEFAULT, dispids);<br />        DISPPARAMS dispParams;<br />        dispParams.cArgs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br />        dispParams.cNamedArgs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br />        dispParams.rgdispidNamedArgs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dispids[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br />        VARIANT varParam[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">];<br />        ::VariantInit(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">varParam[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]);<br />        ::VariantInit(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">varParam[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]);<br />        varParam[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> varFilename;<br />        varParam[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> varTrue;<br />        dispParams.rgvarg </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> varParam;<br />        hr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> qpDocsDisp</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Invoke(dispids[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">], IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dispParams, </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">varDisp, NULL, NULL);<br />        </span></div></font>
						<br />
				</font>
		</font>
<img src ="http://www.cppblog.com/zhleonix/aggbug/10628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhleonix/" target="_blank">菠萝蜜多</a> 2006-07-28 09:58 <a href="http://www.cppblog.com/zhleonix/archive/2006/07/28/10628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决在TabControl中加入带有DS_CONTROL属性的对话框子窗体后应用程序挂起的问题</title><link>http://www.cppblog.com/zhleonix/archive/2006/07/11/9687.html</link><dc:creator>菠萝蜜多</dc:creator><author>菠萝蜜多</author><pubDate>Tue, 11 Jul 2006 07:32:00 GMT</pubDate><guid>http://www.cppblog.com/zhleonix/archive/2006/07/11/9687.html</guid><wfw:comment>http://www.cppblog.com/zhleonix/comments/9687.html</wfw:comment><comments>http://www.cppblog.com/zhleonix/archive/2006/07/11/9687.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhleonix/comments/commentRss/9687.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhleonix/services/trackbacks/9687.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#000000" size="2">DS_CONTROL属性保证当使用TAB键在窗体中切换输入焦点时，如果遇到子窗体，则自动切换到子窗体的控件。<br />当在TabControl中加入了带有DS_CONTROL属性的子窗体时，如果将焦点切换到子窗体，会出现应用程序挂起的问题。<br />主要原因在于DS_CONTROL需要与WS_EX_CONTROLPARENT同时使用，而TabControl默认没有设置WS_EX_CONTROLPARENT。<br />此时需要使用SetWindowLongPtr(GWL_EXSTYLE, dwExStyle)设置TabControl的WS_EX_CONTROLPARENT属性。</font>
		</p>
<img src ="http://www.cppblog.com/zhleonix/aggbug/9687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhleonix/" target="_blank">菠萝蜜多</a> 2006-07-11 15:32 <a href="http://www.cppblog.com/zhleonix/archive/2006/07/11/9687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>