?? 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 + -