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()。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值