原创 C++異常處理機制__1.SEH處理的函數棧佈局

C++可以有兩種異常處理方法 1. SEH exceptions (Structured Exception Handling), 結構化異常處理 它有三個關鍵字__try, __except, __finally,並通過RaiseExc

原创 COM學習筆記6_COM的複用:包容和聚合

繼承可分實現繼承和接口繼承 接口繼承 :一個類只能繼承另一個接口。一個接口是裏面只有純虛函數,沒有數據和函數實現 實現繼承 :一個類繼承另一個類,包括基類中的各種數據和實現 COM不支持實現繼承,因爲實現繼承會造成較大耦合,違背了COM的

原创 COM學習筆記1_COM初步探索

COM組件的兩個重要需求: 1。 動態鏈接 2。 隱藏實現細節 COM初步探索 一個典型C++客戶和組件的例子// 組件模塊 interface IX { virtual void __stdcall Fx1() = 0 ; virt

原创 COM學習筆記3_IUnknown的三個接口函數

對於COM組件,正確處理IUnknown的三個接口函數非常重要。 對於QueryInterface,一個參考處理如下: HRESULT __stdcall CA::QueryInterface(const IID& iid, void**

原创 通過ATL開發COM_3實現類廠和組件的創建

類工廠的實現,組件的創建過程 1. 在*_Server.cpp 中有BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_Math, CMath) END_OBJECT_MAP() 展開後是

原创 COM學習筆記8_IDispatch (調度接口) 自動化

一般的通訊方式: 客戶 <==> COM(vbtl)接口 <==> COM組件 自動化通訊方式: 客戶(自動化控制器) <==> IDispatch::Invoke <==> 調度接口(或vbtl接口) <==> 實現IDispatch接

原创 C++異常處理機制__3.編譯器何時生成棧回退代碼

 學習異常原理,先從幾個例子看起 編譯器什麼時候生成異常支持代碼(棧回退支持)//沒有棧回退代碼 void cpp_exception_test1() { int *p = new int; CMyClass1 s1;

原创 程序內存佈局

程序虛擬地址佈局: 從高到低: 0X8000,0000 - 0XFFFF,FFFF  內核空間 0X7FFF,0000 - 0X7FFF,FFFF   64K的禁止進入區 0X0001,0000 - 0X7FFE,FFFF  用戶空間 0

原创 C++異常處理機制__2.SEH異常拋出與處理

測試函數:void SEH_test2() { int *p1 = NULL; __try { *p1 = 10; } __except(EXCEPTION_EXECUTE_HAND

原创 COM學習筆記4_創建COM組件的實現

爲了實現COM的動態鏈接,必須把組件的實現和客戶代碼分隔開。 一種處理是把組件放入DLL中。 這樣爲了支持客戶創建組建,組件需要導出一個類似CreateInstance的函數。 extern "C" IUnknown* CreateIns

原创 COM學習筆記7_跨進程COM組件

由於內存不能跨進程訪問,所以訪問exe中的COM組件需要額外處理 1.跨進程調用函數 : 可以通過LPC (本地過程調用) 實現 2.參數傳遞 : 通過"調整",若在同一機器上,需要拷貝參數,若在遠端,還需要考慮機器數據表示方面的不同。

原创 通過ATL開發COM_1概述

ATL 是爲了減輕程序員開發COM的負擔而提供的一套模板庫 ATL提供的支持: 1. CComModule封裝對組件的宿主支持,掩蓋了(DLL和EXE)之間的差別。 2. 對IUnknown的支持 3. 對類工廠的支持 4. 自動化 :

原创 通過ATL開發COM_2實現IUnknown接口

每個COM組件需要實現這三個功能 1. 實現IUnknown接口 (通過 CComObjectRootEx 實現) 2. 實現一個類工廠,支持組件的創建 (通過 CComCoClass 實現) 3. 實現自注冊   ATL是如何實現IUn

原创 Win32 SEH異常深度探索_2 異常鏈表遍歷

With this simplest of scenarios behind us, let's go back and fill in some of the blanks. While this exception callback

原创 COM學習筆記5_使用類廠創建COM組件

<br />我們在前面創建COM組件都是通過直接或間接調用CreateInstance。<br />在實際COM庫中,對應創建組建的函數是CoCrea