atl創建avtive

1.activex無窗口問題(控件在編碼過程中要檢查m_hWnd是否存在,不然vs可能會出現繪製錯亂和崩潰

atl窗體通過CComControlBase的內部變量控制,窗體屬性,包括onsize事件對應的m_bRecomposeOnResize變量控制窗體變化事件響應。

2.可插入的控件


授權後,IE才能正常顯示(某些情況下顯示不正常)



        第一、二個頁面比較重要,主要對idl和類的繼承產生影響。第三個頁面可以通過對象屬性配置

3.c#調用過程中,”未正確註冊錯誤“可能是由於未設置可插入選項或者重複插入後,項目未清理乾淨,建議新建一個項目試試。winform需要刪除obj目錄。axHost錯誤是因爲,activex未設置插入屬性(見2的設置)

4.atl中指針錯誤不會異常崩潰,可以通過vs的反彙編查詢打印輸出提示的異常地址得到具體錯誤點


或者通過新建斷點中的,函數斷點和內存斷點定位。

5.mfc的通過ddx可以自動綁定activex爲成員變量,生成activex的方法調用文件和對象創建方法。不過vs提供的綁定只能生效一次。控件綁定後就不能修改了,可以通過新建項目重新綁定控件後獲取到新的activex對象調用文件。

6.atl中自定義數據類型  

 typedef [v1_enum, helpstring("_WeekDay Enum")] enum  _WeekDay
  {  
    Sunday=0, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday  
  }_WeekDay;  
  typedef struct MyStruct 
  {
     int i;
  }MyStruct;

不過接口的返回值,需要手動修改idl文件等到。參數的最後一位形如[out,retval]代表返回值。

 自定義數據類型不能再接口中傳遞,而應該傳遞接口類型指針,例如

struct AccountInfo
{
LPCWSTR pszId;
LPCWSTR pszPassword;
};
HRESULT GetAccountInfo(AccountInfo *pAccountInfo);

IDL:
interface IAccountInfo
{
HRESULT get_Id(BSTR *pVal);
HRESULT get_Password(BSTR *pVal);
}
HRESULT get_Account(IAccountInfo **pAccountInfo);
當用戶使用 get_Account 方法獲取這個信息的時候,不是返回自定義數據結構,
返回 IAccountInfo 接口。
你創建一個實現了 IAccountInfo 接口的實例,返回這個實例的這個接口。
用戶獲取到這個接口後,使用這個接口的方法獲取數據。
而不是像 C++ 那樣,使用結構的成員來取得數據。

這樣在JavaScript 中,
var account = XXX.Account;
var id = account.Id;
var password = account.Password;

7.atl字符串

    atl字符串使用BSTR,C++的封裝類中_b_str,通過copy方法傳出字符串到BSTR。

8.組建異常(IErrorInfo接口)

     SetErrorInfo拋出異常

9.連接點

       雙擊類窗口中的接口可以查看編輯的文件,如果雙擊顯示idl文件,就可以在該接口上添加函數接口了。連接點需要atl創建過程中,使用項目支持“連接點”和IPropertyNotifySInk。連接點主要爲創建回調函數,類似wcf的雙工通信契約。創建成功後,控件本身會增加事件接口。控件端事件的實現可以通過,類窗口中的控件類右鍵“接口實現”,選擇實現的接口和模塊自動實現後連接點代碼。如下:





10.c#調用過程中,項目obj需要手動刪除,否則會有編譯錯誤。MFC調用activex可以ddx綁定控件自動生成接口代碼,不過自動生成只能一次,接口有更新,只能重建項目重新綁定,才能自動生成調用activex的代碼了。

11.google對activex的支持需要下載安裝插件。隨着js和html5的發展,現在已經很少看到activex在互聯網中應用,處理一些安全級別比較高的場景,比如銀行安裝插件。一般的場景中,js和html5前端控件,已經完全可是代替activex的應用,而且繪製和擴展性已經瀏覽器的安全性,都會比activex更好。

12.atl訪問IDispatch自動化接口

         struct __declspec(uuid("7FA22CB1-D26F-11D0-B260-00A0240CEEA3")) IObj;      

         CLSID可以通過__uuidof(IObj)獲取         

         atl使用CComDispatchDriver創建自動化對象(mfc使用COleDispatchDriver)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章