📄 csdn_文档中心_银弹制造:开发最灵活的软件(一).htm
字号:
<TD align=middle width=500></TD></TR>
<TR>
<TD align=middle bgColor=#003399><FONT color=#ffffff>关键字</FONT></TD>
<TD width=500> 托管 非托管 互操作</TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR></TBODY></TABLE><!--文章说明信息结束//-->
<TABLE border=0 width=600>
<TBODY>
<TR>
<TD align=left><BR>
<P align=center class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center"><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">银弹制造:开发最灵活的软件(一)</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 14pt"><?xml:namespace prefix = o ns =
"urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P align=center class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center"><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在非托管代码中使用托管资源是如何实现的</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></SPAN></P>
<P align=right class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: right; WORD-BREAK: break-all"><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; mso-bidi-font-size: 14.0pt">BrianLiang
</SPAN><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 14.0pt">(原创)</SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; mso-bidi-font-size: 14.0pt"><o:p></o:p></SPAN></P>
<P align=right class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: right"><SPAN lang=EN-US
style="FONT-SIZE: 12pt; mso-bidi-font-size: 14.0pt"><A
href="mailto:mynewbigame@tom.com">mynewbigame@tom.com</A><o:p></o:p></SPAN></P>
<P align=right class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: right"><SPAN lang=EN-US
style="FONT-SIZE: 14pt"><o:p> </o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-SIZE: 14pt"><SPAN style="mso-spacerun: yes">
</SPAN></SPAN><FONT size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">我一直在寻找这样一个类库:他对</SPAN><SPAN
lang=EN-US style="mso-bidi-font-size: 10.5pt">Windows</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的窗口提供面向对象的封装,有灵活的消息响应机制和比较完备的界面框架解决方案,对标准控件提供简练实用的封装,支持操作系统的新特性,支持功能扩充和二次开发,有代码自动生成向导机制,生成的程序使用较少的系统资源,最后是有完全的代码支持和文档支持;对!用</SPAN><SPAN
lang=EN-US style="mso-bidi-font-size: 10.5pt">MFC</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">;我希望他能对纷繁芜杂的世界有所感应,能让我充分利用到各种开发语言的优点而不为一种环境所困扰;没错!用</SPAN><SPAN
lang=EN-US style="mso-bidi-font-size: 10.5pt">.NET</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">;我想我可以恰当的使用它们,让他们在我的项目中各尽所能,我纵横于各种开发语言和对象模型之间,而不用太过需要去顾及到他们的差异;很幸运,这样的工具也被我发现了;我使用</SPAN><SPAN
lang=EN-US style="mso-bidi-font-size: 10.5pt">MFC Application
Project with .NET Support 1.0</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">,我不费吹灰之力把</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt">CrystalReportView</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">等成熟的</SPAN><SPAN
lang=EN-US style="mso-bidi-font-size: 10.5pt">.NET</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">组件插入到我的</SPAN><SPAN
lang=EN-US style="mso-bidi-font-size: 10.5pt">MFC</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">项目中,我用</SPAN><SPAN
lang=EN-US style="mso-bidi-font-size: 10.5pt">VB.NET</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">和</SPAN><SPAN
lang=EN-US style="mso-bidi-font-size: 10.5pt">C#</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">完成一些琐碎的工作(我的朋友正在开始学习</SPAN><SPAN
lang=EN-US style="mso-bidi-font-size: 10.5pt">ADO.NET</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">,他很乐意帮助我完成数据管理部分),而关键部分仍然交给</SPAN><SPAN
lang=EN-US style="mso-bidi-font-size: 10.5pt">C++</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">来完成。我有点好奇,我不知道作者是怎么做到的!我冒昧的与作者联系,希望能够了解地更多;然后我获得了全部的源代码,同时作者希望我能够把这项技术介绍给大家,他希望能够帮助广大的开发人员自由地整合各种资源,他相信整个技术行业应该是开放性的、具有合作意识的而且是自由自在不受约束的,他认为开发工具能够提供给我们的应该更多,有些必要因素必须是天生的比如资源整合能力、无限的可扩展性、表现层和业务逻辑层的独立以及更重要的是用户对界面和功能的自主与自由的选择等等;开发工具必须能够尽量保证这一切都是可行的、自动的、快速的、简单的。他给我展示了他所完成的开发工具是如何达到以上要求的,在今后的一两个月内他们就会与广大的开发人员见面,这一切都令我震惊。这一系列的工具为我们的开发人员提供更完美的解决方案。这些产品作为构架工具和组件容器,会带来超乎想象的组件重用率和开发者生产率的提高进而带来的软件质量的提高(构架师专注于功能定义和任务调度,生活在地球上各个角落里的组件开发人员维护自己的组件和文档甚至后续的技术支持)。整个软件产业发展的必然之路就在眼前!</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="mso-bidi-font-size: 10.5pt"><o:p><FONT
size=3> </FONT></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; mso-char-indent-count: 2.0"><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">构件软件最可能的彻底解决方案是:不开发任何软件!</SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; mso-char-indent-count: 2.0"><SPAN
lang=EN-US style="FONT-SIZE: 12pt; mso-bidi-font-size: 10.5pt"><SPAN
style="mso-spacerun: yes">
</SPAN>------------</SPAN><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">弗雷德里克</SPAN><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-size: 10.5pt">·</SPAN><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">布鲁克斯</SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><SPAN
lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p><FONT
size=3> </FONT></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><FONT
size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">一、我们需要整合,我们需要互操作!</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><FONT
size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">通过允许</SPAN><SPAN
lang=EN-US style="mso-bidi-font-size: 10.5pt">MFC</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">项目属性的“</SPAN><SPAN
lang=EN-US style="mso-bidi-font-size: 10.5pt">Use Managed
Extensions</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">(使用托管扩展)”,我们就可以在项目中增加诸如</SPAN><SPAN
lang=EN-US>.NET Framework Windows </SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">窗体控件或</SPAN><SPAN
lang=EN-US>UserControl</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等等</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">托管项;</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><FONT
size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从</SPAN><SPAN
lang=EN-US> Visual C++ .NET </SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开始,</SPAN><SPAN
lang=EN-US>MFC </SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对消息处理函数的返回类型和参数类型进行更严格的类型检查。这些新增行为通过使用错误信息标记潜在不安全的消息处理函数,来通知开发人员可能会遇到的问题。大家会注意到在这里所有返回类型用</SPAN><SPAN
lang=EN-US> LRESULT </SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">保证类型安全。</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><FONT
size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">源程序中一个重要的类是</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt">WFControlSite</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">,他继承自</SPAN></FONT><SPAN
lang=EN-US
style="FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">COleControlSite
</SPAN><SPAN
style="FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">(</SPAN><FONT
size=3><SPAN lang=EN-US
style="mso-bidi-font-weight: bold">COleControlSite</SPAN><SPAN
lang=EN-US> </SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供客户端的控制接口,更多请参考看</SPAN><SPAN
lang=EN-US>MSDN</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">);第一步,使用</SPAN></FONT><SPAN
lang=EN-US
style="FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">CreateManagedControl</SPAN><SPAN
style="FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">方法</SPAN><FONT
size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建托管控件(窗体、</SPAN><SPAN
lang=EN-US>UserControl</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)把它作为客户端对象激活(客户端激活的对象由基于租约的生存期管理器管理,该管理器确保在对象的租约过期时对该对象进行垃圾回收);以下代码演示了如何获得托管资源:</SPAN></FONT></P>
<TABLE border=1 cellPadding=0 cellSpacing=0 class=MsoNormalTable
style="BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; BORDER-LEFT: medium none; BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 5.4pt; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext">
<TBODY>
<TR
style="HEIGHT: 31.5pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD
style="BACKGROUND-COLOR: transparent; BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; BORDER-TOP: windowtext 1pt solid; HEIGHT: 31.5pt; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; PADDING-RIGHT: 5.4pt; PADDING-TOP: 0cm; WIDTH: 414pt; mso-border-alt: solid windowtext .5pt"
vAlign=top width=552>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">HRESULT
hr = E_FAIL;<o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">ASSERT(m_pObject
== NULL);<o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">CWinFormsView::CWFControlWrapper
* pWndCtrlLocal = <SPAN
style="COLOR: blue">dynamic_cast</SPAN><CWinFormsView::CWFControlWrapper
*>(m_pWndCtrl);<o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">IUnknown
* pUnk =
pWndCtrlLocal->GetManagedControl();<o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="FONT-FAMILY: 新宋体; FONT-SIZE: 9pt; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><SPAN
style="mso-spacerun: yes"> </SPAN><SPAN
style="COLOR: blue">if</SPAN> (FAILED(hr =
pUnk->QueryInterface(IID_IOleObject, (<SPAN
style="COLOR: blue">void</SPAN>**)&m_pObject)))
{<o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -