mfc與js交互

1、MFC調用JS的接口約束與調用:

【接口函數名】、【參數類型-string】、【返回值類型】;

dlg-->create htmlview-->set到controller-->調用html接口

2、JS調用MFC的接口約束與調用:

【接口方法名】、【返回值類型】、【參數類型】;

注意:返回參數類可採用模仿web訪問數據庫的形式:code:200,message:消息,data:數據內容。

web觸發-->CHtmlView-->Ctlr-->Dlg(如果需要窗口響應則傳入)

DISP_FUNCTION(類名,js調用mfc的方法名,響應函數名,返回類型,參數類型)

注:返回類型如果是字符串需要用VT_BSTR;

3、注意在使用時需要初始化組件OleInitialize(nullptr),使用OleUninitialize( )卸載,在使用的每個線程都需要初始化和卸載組件

4、網頁在使用時需要配置瀏覽器,解決addEventListener,函數註冊問題。

在html文件中加入頁籤

<meta http-equiv="x-ua-compatible" content="IE=7,9,10" >

 

以下內容轉載:

CoInitialize CoInitializeEx 是用來初始化COM運行環境的。

OleInitialize是初始化Ole的運行環境,Ole是在Com的基礎上作的擴展,是ActiveX運行的基礎,OleInitialize肯定會調用CoInitialize。

 

CoInitialize、CoInitializeEx都是windows的API,主要是告訴windows以什麼方式爲程序創建COM對象,原因是程序調用com庫函數(除CoGetMalloc和內存分配函數)之前必須初始化com庫。

    CoInitialize指明以單線程方式創建。

    CoInitializeEx可以指定COINIT_MULTITHREADED以多線程方式創建。

    創建單線程方式的COM服務器時不用考慮串行化問題,多線程COM服務器就要考慮。

    CoInitialize並不裝載com庫,這個函數只是用來初始化當前線程使用什麼樣的套間。當使用這個函數以後,線程就和一個套間建立了對應關係。

    線程的套間模式決定了該線程如何調用com對象,是否需要列集等

    套間是com中用來解決併發調用衝突的很有效的辦法

    Before calling any COM functions, a thread needs to call CoInitialize to load the COM infrastructure (and to enter an apartment). Once a thread calls CoInitialize, the thread is free to call COM APIs.

    CoInitializeEx provides the same functionality as CoInitialize and also provides a parameter to explicitly specify the thread's concurrency model. The current implementation of CoInitialize calls CoInitializeEx and specifies the concurrency model as single-thread apartment. Applications developed today should call CoInitializeEx rather than CoInitialize.

    注:新的應用程序應該調用CoInitializeEx而不是CoInitialize,否則就會有必要在之後每個調用Com的線程中調用CoInitialize來初始化出每個線程自己的套間。

 

 AfxOleInit實際上調用了OleInitialize,雖然它在內部也調用了CoInitializeEx,但它只能處理單線程,這是AfxOleInit和CoInitialize主要區別:   

  OleInitialize   calls   CoInitializeEx   internally   to   initialize   the   COM   library   on   the   current   apartment.   Because   OLE   operations   are   not   thread-safe,   OleInitialize   specifies   the   concurrency   model   as   single-thread   apartment.     

  Once   the   concurrency   model   for   an   apartment   is   set,   it   cannot   be   changed.   A   call   to   OleInitialize   on   an   apartment   that   was   previously   initialized   as   multithreaded   will   fail   and   return   RPC_E_CHANGED_MODE.

 

應用:

1. CoInitialize 僅僅初始化Com,支持多線程。也就是說如果多線程調用Com接口,必須在每個線程中都調用CoInitialize。

2. OleInitialize 初始化Com(其實也是調用CoInitializeEx),支持多線程。比CoInitialize多了一下內容:

A) Clipboard

B) Drag and drop

C) Object linking and embedding (OLE)

D) In-place activation

如果不需要這些,用CoInitialize就可以。

3. AfxOleInit是MFC對OleInitialize的封裝。貌似不支持多線程,也就是說只能在主進程調用該函數,如果線程需要使用Com必須調用上面的兩個來實現初始化。而且MSDN明確標明AfxOleInit不能在MFC的DLL中調用,否則也會造成初始化失敗。

4.OleInitialize和OleUninitialize( )成對使用;CoInitialize和CoUninitialize成對使用;CoInitializeEx和CoUninitialize成對使用;AfxOleInit()由MFC自動釋放。

 

VC++使用ADO訪問ACCESS時,出現_RecordsetPtr Open卡或者_ConnectionPtr Excute卡或者_CommandPtr Excute一直卡住等莫名其妙的情況時,而語法又沒有錯誤時,請確定初始化COM函數。

MFC程序建議使用AfxOleInit()。

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