










1 MFC 的 C++ 部分
微软的MVC架构不用多说了,主要贴出脚本调用部分:
| //这个函数提取页面中的js代码后在msscript.ocx中执行 void BrowserView::FindAndExecuteJavaScript() { //get javascrip client code CString codes[20]; int code_item_count=0; CComPtr<IHTMLElementCollection> spColl; m_spDoc->get_all(&spColl); GetScriptCode(spColl,"JavaScript-BHO",codes,code_item_count);if(JavaScriptHelper==NULL && g_RuntimeVars.env) { //get 'JavaScriptHelper' object from dsRE to execute PHP script JavaScriptHelper=g_RuntimeVars.env->GetSharedObject(L"JavaScriptHelper"); } if(JavaScriptHelper) { int i; for(i=0;i<code_item_count;i++) { codes[i].Trim(); if(codes[i].GetLength()>0) { CString code=codes[i]; char *buf=(LPSTR)(LPCSTR)code;
dValue ret; }
} |
|
//这个函数在页面得到正确请求后发生,主要是向msscript.ocx中的js增加全局变量document和用于js调用C++函数的System对象 【特注1】通过Composite Bridges的共享对象,使当前MFC的基于CHtmlView的IDispatch对象“进入”js脚本中,方便js操纵。如果在设计中不使用Composite Bridges,则可以编写一个基于IDispatch的COM对象,通过 new ActiveXObject(...)语句创建这个COM对象,然后通过这个对象的某个函数调用的返回值使得CHtmlView对象进入msscript.ocx中的js。 【特注2】System对象用于js操纵C++的函数的。如果不使用哦Composite Bridges技术,就像【特注1】中一样写个COM进入js就是可以了。 Composite Bridges 由于支持脚本调用 Windows API,是理想的脚本扩展类库。同时,Composite Bridges 还支持 VCL 调用,可以作为界面的补充。虽然 Composite Bridges 还能支持.NET调用。不过,无论PHP还是js,都可以通过COM间接调用.NET的,所以不用多此一举。 |
2 js脚本部分
这里只列举 CreateWindow 这个API,其他的API可以举一反三:
| function CreateWindow(lpClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,hInstance,lpParam) { /* HWND WINAPI CreateWindowExA( DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); */ param=new dobject("ApiParams"); param.AppendSignedLong(0); param.AppendAsciiString(lpClassName); param.AppendAsciiString(lpWindowName); param.AppendSignedLong(dwStyle); param.AppendSignedLong(x); param.AppendSignedLong(y); param.AppendSignedLong(nWidth); param.AppendSignedLong(nHeight); param.AppendHandlePointer(hWndParent); param.AppendHandlePointer(hMenu); param.AppendHandlePointer(hInstance); param.AppendHandlePointer(lpParam);return os_api.CallOSAPI(null,"CreateWindowExA",param); } |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。