調試一個MSComm的串口通訊程序一直報錯"f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\occcont.cpp Line:926",網上搜了下說是控件沒有註冊,而後"regsvr32 MSComm32.ocx"註冊後就正常了。多是程序用到這個activeX控件可是以前沒有註冊致使調試出現錯誤。html
關鍵字"activex 網頁插件"搜到文章<使用VS2010開發ActiveX(MFC)控件(2)>,在該系列文章的第二篇"界面顯示"部分指出要對新建的一個對話框,將其屬性System改成False,對話框資源沒有這個屬性多是"System Menu"屬性。在文章的最後用一個html文件測試,其中classid要與建立的activex工程的uuid參數匹配,打開工程的idl文件一開始想固然覺得是該文件的第一個uuid,而後用ie打開html後沒有任何反應,後來參考了文章<vs2010開發activex(MFC)控件/ie插件(一)>發現實際上是文章的最後一個uuid,修改後將測試的html拖動到ie上而後會提示"Internet Explorer已限制此網頁運行腳本或ActiveX控件",選擇"容許阻止的內容"後會彈出"在此頁上的ActiveX控件和本頁上的其餘部分的交互可能不安全。你想容許這種交互嗎?"選擇是後就能夠看到控件的界面了。而後是參看第三篇文章<添加接口及WEB調用>,在該文章中先定義了一個具體的實現函數,做用就是在編輯框上顯示文字,而後類視圖下在xxxLib下的_Dxxx右鍵添加接口,其中xxx表明了activex工程的名字,而後在文章的最後的html中調用了這個接口函數,注意必定要換成本身的接口名稱不然沒有反應。前端
添加屬性與添加接口同樣,即類視圖下在xxxLib下的_Dxxx右鍵添加屬性,其中xxx表明了activex工程的名字。正如<VC++深刻詳解>ActiveX控件章的自定義屬性小節所述,"在添加順序ing對話框上提供了三個單選按鈕,默認選擇的是Member variable",若是選擇Get/Set methods則並不會自動生成一個與屬性名稱對應的內部成員變量,若是須要在控件內部保存屬性的值則須要自定義一個成員變量,注意在js頁面中能夠直接以屬性名來訪問屬性,而非與屬性名對應的內部成員變量。當選擇選擇Get/Set methods單選框後,默認會生成與屬性對應的Get/Set函數,並且也不須要再添加參數。jquery
查看xxxCtrl.h文件(xxx表明了MFC的activex工程名),發現該頭文件中聲明瞭消息映射(讓ActiveX控件程序能夠接收系統發送的事件通知,如窗體建立和關閉事件),調度映射(讓外部調用程序(包含ActiveX的容器)能夠方便地訪問ActiveX控件的屬性和方法),事件映射(讓ActiveX控件能夠向外部調用程序(包含ActiveX的容器)發送事件通知)。也就是說對ActiveX控件的窗口操做都將在這個類中完成,包括ActiveX控件的建立,重繪,以及在此類中建立可視MFC窗體。json
用activex插件能夠返回字符串給js,具體能夠參考文章<一步一步實現ActiveX與js雙向調用(二)>,具體作的時候用了一個屬性來保存js的函數,在添加屬性時候選擇屬性類型爲IDispatch*,而後再自定義一個CComDispatchDriver類型的內部成員變量來保存js的函數,當須要調用js的函數時候直接經過這個自定義的內部成員變量執行InvokeN函數,待傳遞給js的字符串直接賦值給VARIANT類型變量的bstrVal字段。或者按照文章中的方式,定義一個CComPtr<IDispatch>類型的變量spCallback,判斷參數的vt成員爲VT_DISPATCH,而後將參數的pdispVal保存到變量spCallback中,經過該變量執行Invoke就能夠調用到js的函數。可是在activeX控件中建立線程,想在線程中經過這兩種方式來調用js函數就沒有成功。後來先調用RegisterWindowMessage建立一個消息,而後經過ON_REGISTERED_MESSAGE宏來綁定消息的響應,當線程中須要調用js函數時執行PostMessage函數將註冊消息發送到當前窗口,而後在註冊消息的綁定函數中就能夠成功調用js函數了,這一方式參考了libjingle中的windows異步socket的實現方法。windows
js去解析json數據,這個地方網上搜了兩個小時也沒有搞定,後來關鍵字"html json 遍歷"搜到文章<jquery對Json的各類遍歷>,又結合文章<JavaScript中解析JSON數據的三種方法>,一開始根據這篇文章用new Function方法用vs編寫html文件會有一些紅色的波浪線,因此就放棄了後來結合文章<jquery對Json的各類遍歷>發現仍是須要先經過new Function方法將activex插件返回給js的字符串轉換成json對象,而後就能夠解析了。安全
在html中select表明的是一個下拉框,關鍵字"select option 添加"搜索發現好像有兩種方式JS和jQuery來添加選項,後來前端同事幫忙實現了頁面加載以後將插件返回的數據動態添加到select控件中,主要是下載jquery-3.2.1.min.js而後放到測試html的同一目錄下,而後在$(function(){…})這個函數中添加頁面加載的代碼,以前的方式是在<body onload="load()">的function load()函數中添加頁面加載代碼。異步
sprintf_s去格式化一個CString對象時只能將第一個字符格式化,後來發現是vc程序的配置問題,工程右鍵屬性-配置屬性-常規-項目默認值-字符集從"使用Unicode字符集"修改成"使用多字節字符集"而後就能夠將CString對象的全部字符格式化而非僅僅格式化第一個字符了。在html頁面中並不想顯示vc建立的activex控件,一開始糾結於把Ctrl類中的OnDraw函數中的代碼給屏蔽掉,發現仍是會顯示控件,後來在html頁面中將該控件的寬高屬性都設置爲0而後就再也不顯示控件了,即加上"width=0 height=0"。若是該方法不行的話可能就要嘗試將vc控件的資源屬性頁中的對話框資源刪除掉再試了。socket