JavaScript 调用 C++ 生成的 DLL.pdf

所需积分/C币:48 2018-10-01 08:53:09 714KB PDF
121
收藏 收藏
举报

JavaScript 调用 C++ 生成的 DLL,DLL 使用 ATL 封装的 ActiveX 控件,仅支持 IE 浏览器。 本文档是对工程实现时的每一个步骤进行描述,大量截图,非常详细。 完整工程代码路径:https://download.csdn.net/download/bqrmt/10698728
1.1C++生成DLL 代码1.1: Test func . h 1 #ifndef TEST FUNC H 2 #define TEST FUNC H 34567890 class declspec( dllexport) TestFunc public static TestFunc* GetInstance( int Func Add(int a, int b) 1 private: TestFunco 345 TestFunco class arDo 16 public 18 Garbo 20 if nullptr m_pInstance) 22 2222 1234567 delete m-plnstance m_plnstance= nullptr static TestFunc* m pInstancc; 29 static Garbo gArbo 30 31 32# endif∥ TEST FUNC H 代码1.2: TestFunc.cpp include mutex> 3 #include WTestFunc h" 5 using namespace std 7 TestFunck TestFunc: m-plnstance nullptr 8 TestFunc: Garbo TestFunc: oGarbo: 10 mutex m_oTestFunclock. 12 TestFunc TestFunco 13 1.1C++生成DLL 15 16 TestFunc TestFuncO 18 20 TestFunc* Test Func GctInstancc () 21 if( nullptr ==m_-pInstance) 23 24 m_oTestFuncLock lock( if nullptr ==m-pInstance) m-pIns lance new TestFunc(; m_oTestFuncLock unlock 0123 3C 3 return m_pInstance 35 int TestFunc: Func Add(int a, int b) 36 return at b 38} 代码1.3: Test_ APl. h 1 #ifndef TEST APL H 2 #define TEST APl H 34567890 #ifdef -cplusplus extern C # endif∥- cplusplus declspec( dllexport ) long API_Add(long a, long b); 11 #ifdef cplusplus 12 13# endif∥ cplusplus 14 15# endif∥ TEST API 代码1.4: Test API. cpp 1 #include WTest API.h" 2 #include WIestFunc h" 4 using namespace std 12ATL封装 6 long aPl- Add(long a, long b) 8 return TestFunc GctInstancc (->Func Add(a, b) 1.2ATL封装 121创建ATL项目 使川ATL封装C++生成的DIL,在解决方案中新建一个ATL的项日 ATL API 最近 NET Framework4.5-排序依据:獸认值E 摆索已安装模板(CtE AL项目 Visual C++类型WuC a visual二+ 使用汗动板车的日 t其他语 建梅项目 紊机 ATL API DATotalFiles,M\S\Prnjerte'++xlavaS-riptcaliCpp 浏/〕 在应用程序设置中,选中 支持COM+1.0 ●支持部分注册器 ATL攻向导- ATL API 应用程序设置 述 应用程序型 克持选听 应用程序识置 ◎动态链接库Q □允许合主代理存代码) ◎可行科rrY ○脈务皿》)(! 在项目属性中,进行如下设置: 链接器->常规->注册输出:否 12ATL封装 链接器->常规->附加库目录:$( Solution dir)s/ Configuration) 链接器-→>常规->附加依赖项: DI Cpp.ib ALA层性员 RX 平台F动Wr3 p用后生 S(CutDir)S(TargetName)s(T arg etExt) 4配置层性 显示過度 启先墙量链 VC+-目示 取浩品示片 都板 HEUNOLOGD) 常 用户重定向 附加库目录 S(Solution Dir)S(Configuration) 1性页 配置(Q:所有置 [禹置器0 阿加队购项 hten(ppIih; (Additionalnependpnrip 忽路所有默认库 右击 ATL API,选择“添加->类” 口新建项W灬 Ctrl ShiftIA 引用(F… 现有项(G Shift I AltI A 粪向导7 茁管理 NuGet程句N 它类(C 查看类图 该源(R 选择“ATL简单对象”,其中项目名称是灰色的,不可设置。 加关-ALAp 已安轰 装模板(tr+E d isual c AT简单习 Visualc 块卫 visualc 手加简兰的活动楨板库对象 ATL控 Visual C+- 名称 伯( D:Tota FilestMVSProjectc++UavaScniptcallCpp\ATL_APN 刘) 12ATL封装 在ATL简单对象向导>名称中, 简称: API COM ProgID: API COM OBJ,该值非常重要,在 JavaScript的代码中需要 使用 ATL单对导· GTL API 欢迎使用ATL肖单对象向导 称 件到运r h文仁 FFI AFI CON 江CL".cpp 本土T AFT「「"C1A吧 工 AFI COl CEH 0 上妇「习—燕戰消 在ATL简单对象向导>选项中, ●线程模型:单线程 支持:三个都选中 ATL单对急向导- ATL API 选项 称 2模型 接匚 线程 ○自定义〔 选 ○两 □自动化兼客①) ○自口) 吏持 ○中性生 工nf 回连接 ◎是啁 □自由线程封送拆收器 否 0 bjeztWithSite(缘支持 ◎只能健建为聚会 单击此处可查看不支持的智能设案选先项 上「习燕一匚取内 12ATL封装 打开“类视图” 视图 VASSISTX项目(P)生成(B)调试(D) 解决方案资源管理器(P)Ct+A+L 句类初图(A Ctrl+Shift+C 代码定义商囗D) Ctrl+Shift+y 在“ATL_API”中找到“ IAPI COM”,右击->添加->添加方法: + ATL APIp 加 1票加方活 +P类向导( C-rl+ shift+x 系加属性 在“添加方法向导”中,定义与代码1.3中相对应的方法名称: 方法向导- ATL API 欢迎使用添加方法向导 名称 反回类型 方法名 工二特性 HRESULT 丸dd 圣数特性 out (0 □rea1g 数类型在 参数名耳 加i [in] LON 珞1 上步[下步习完成一取消 汪总 输入参数要勾选“in 返回参数要勾选“out”和“ retval”。与输入参数“in”不同的是,输出 参数“out”和“ retval”正常情况下是灰色,不可选,当“参数类型” 选择为指针形式时,才变成可选状态 ,22添加代码 在项目“ ATL API”中找到“ APl_COM.cpp”,在“ ' include”后,添加对 代码1.3的引用,同时,实现“ CAPI COM:Add”函数。 12ATL封装 代码1.5: API COM.cpp 1 //API-COM cpp: implementation of CAPI_COM 3 #include lstdafx h" 4 #include "API CoM. h 6 #ifdef--cplusplus 7 extern "CI 9# endit∥ cplusplus 10 dcclspcc( dllimport long API Add(long a, long b) 13 #ifdef -cplusplus 14} 15# Fendi∥ cplusplus 16 l7∥ CAPICOM 18 19 STDMETHODIMP CAPI_COM: Interface Supports ErrorInfo(REFIid riid) 20{ 21 static const IID* const arr I &IlD APl_ com 24 26 for(int 1=0; i sizeof arr )/sizeof( arr [oD: 1++) 27 if (InlinclsequalGUID(arr[i l, riid)) 29 return s_oK: 30 31 return S_fALSE 33 35 STDMETHODIMP CAPI_COM: Add(LONG argyl, LONG argv2, LONG* retval // TODO: add implementation here 39 retval API Add(argv1, argv2) 40 return S_OK 41} 其中6-15行是对代码1.3的引用部分,39行是对“ CAPI COM:Add)” 的实现 8 3 Javascript调用 123注册ATL 调出“cmd”,定位到生成的d录,s( Solution Dir)( onfiguration), 输入命令 1 regsvr32 ATL_-APIdll 若注册成功,会出现如下弹窗: Reasyr32 DI Register Server in ATL_API. dll succeeded javascript CallGpp\Re lease JavascriptcallGpp\e lease >regsur32 All_API.dll 13 JavaScript调用 13.1创建 创建html文件 <meta charset="utf-8"/> 4 title ></title <script language="javascript"> function Addo document getElement Byld("process_info"). innerText="1+2="+ cpp-object Add(1, 2) 10 var cpp object new ActiveXObject("API_COM_OBu. 1") 12 </script>> 13 </head> 15 <p id="process_info"></p>> 16 <button type="button "onclick="Add()">Add</button> 17 < /body> 18 </html>

...展开详情
试读 11P JavaScript 调用 C++ 生成的 DLL.pdf
立即下载
限时抽奖 低至0.43元/次
身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
  • 分享宗师

关注 私信
上传资源赚钱or赚积分
最新推荐
JavaScript 调用 C++ 生成的 DLL.pdf 48积分/C币 立即下载
1/11
JavaScript 调用 C++ 生成的 DLL.pdf第1页
JavaScript 调用 C++ 生成的 DLL.pdf第2页
JavaScript 调用 C++ 生成的 DLL.pdf第3页

试读结束, 可继续读1页

48积分/C币 立即下载