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)