一个自定义类继承dispatch,将自定义类转化为dispatch放入variant中。传递到其他进程时,会调用到自定义类的addref以及queryinterface。这两个函数该如何去重载

尘归笑夕 2023-12-05 17:33:43

一个自定义类继承dispatch,将自定义类转化为dispatch放入variant中。传递到其他进程时,会调用到自定义类的addref以及queryinterface。这两个函数该如何去重载

...全文
87 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
JACOB里的总共有两个包: com jacob activeX:JACOB可以通过它调度(Dispatch)activeX 控件 com jacob com:JACOB通过它调用系统DLL (activeX是由微软公司推出的用于Internet的技术 以前曾经被称为OLE 和OCX activeX web插件可以用于各种非HTML的工作 比如 对MicrosoftExcel 或 MicrosoftWord 文件做操作 解析JS VB脚本 播放FA有一点可以确定的是在JACOB内部 com jacob activeX是建立在com jacob com之上的 而com jacob com一个很基础的com jacob com JacobObject 其比较常用的两个com jacob com Dispatch和com jacob com Variant便是继承自它 (com jacob com Dispatch;里面提供了调度MS windows系统API 比如进程的管理 com jacob com Variant; 里面数据型的转换的方法 Variant本身是JACOB的最最基本的数据 他可以被转换成任何的 如: 使用toDispatch();可以将Variant转化Dispatch对象 ) com jacob com还有其他的一些不是建立在JacobObject之上的 如com jacob com ComThread(负责COM线程管理 ) com jacob com所有的 包括上面说到的JacobObject ComThread 都是通过com jacob com LibraryLoader的loadJacobLibrary()方法: static { LibraryLoader loadJacobLibrary ; } 调用jacob dll内的方法 比如:Dispatch java就通过LibraryLoader和Dispatch h Dispatch cpp建立联系 从而建立起java到jacob dll到jni的之间的联系 LSH 调用Microsoft MediaPlayer等 )">JACOB里的总共有两个包: com jacob activeX:JACOB可以通过它调度(Dispatch)activeX 控件 com jacob com:JACOB通过它调用系统DLL (activeX是由微软公司推出的用于Internet的技术 以前曾经被称为OLE 和OCX activeX web插件可以用于各 [更多]
JACOB里的总共有两个包: com jacob activeX:JACOB可以通过它调度(Dispatch)activeX 控件 com jacob com:JACOB通过它调用系统DLL (activeX是由微软公司推出的用于Internet的技术 以前曾经被称为OLE 和OCX activeX web插件可以用于各种非HTML的工作 比如 对MicrosoftExcel 或 MicrosoftWord 文件做操作 解析JS VB脚本 播放FA有一点可以确定的是在JACOB内部 com jacob activeX是建立在com jacob com之上的 而com jacob com一个很基础的com jacob com JacobObject 其比较常用的两个com jacob com Dispatch和com jacob com Variant便是继承自它 (com jacob com Dispatch;里面提供了调度MS windows系统API 比如进程的管理 com jacob com Variant; 里面数据型的转换的方法 Variant本身是JACOB的最最基本的数据 他可以被转换成任何的 如: 使用toDispatch();可以将Variant转化Dispatch对象 ) com jacob com还有其他的一些不是建立在JacobObject之上的 如com jacob com ComThread(负责COM线程管理 ) com jacob com所有的 包括上面说到的JacobObject ComThread 都是通过com jacob com LibraryLoader的loadJacobLibrary()方法: static { LibraryLoader loadJacobLibrary ; } 调用jacob dll内的方法 比如:Dispatch java就通过LibraryLoader和Dispatch h Dispatch cpp建立联系 从而建立起java到jacob dll到jni的之间的联系 LSH 调用Microsoft MediaPlayer等 )">JACOB里的总共有两个包: com jacob activeX:JACOB可以通过它调度(Dispatch)activeX 控件 com jacob com:JACOB通过它调用系统DLL (activeX是由微软公司推出的用于Internet的技术 以前曾经被称为OLE 和OCX activeX web插件可以用于各 [更多]
ATL发展到现在,从未提供像MFC的CDHtmlDialog一样的HTML页面布局且方便开发者使用的窗口基,虽然也有DHtml Control可供使用,但并不能像MFC那样通过宏映射来方便地让开发者与页面元素之间进行任意的双向交互,尤其是需要响应页面元素事件的候,ATL/WTL爱好者必须自己编写相应的代码来完成这些工作。基于这个原因,通过理解分析MFCCDHtmlDialog的功能和实现行为,这里完全使用ATL一样的实现机制来模仿MFC实现的功能编写了一个头文件,使ATL爱好者在无需MFC庞大的支持库的情形下实现跟CDHtmlDialog一样的功能,并且扩展了其能力。下载的压缩包只有一个头文件 atldhtmldlg.h,头文件的开始部分是一段开发者使用示例的注释,以方便开发者容易地上手。这个文件提供了若干个和模板,开发者只需关注其两个模板:CDHtmlDialogImpl和CMultiPageDHtmlDialogImpl,第一个模板实现了WEB页面布局的对话框,第二个模板以第一个为基础,扩展成了在一个对话框支持多个页面。使用方式非常简单,从上述两个模板之一继承实现一个对话框,然后添加相应的映射宏,实现宏映射的方法即可构造一个完美、表现能力强、控制方便的对话框窗口,例子代码像下面这样:class CMainDlg : public CDHtmlDialogImpl{ ...... // 实现页面元素事件的处理 // 请注意响应函数原型定义:HRESULT Foo(IHTMLElement*) BEGIN_DHTML_EVENT_MAP(CMainDlg) DHTML_EVENT_ONCLICK(_T("elementid1"), OnClick) DHTML_EVENT_ONMOUSEMOVE(_T("elementid2"), OnMouseMove) DHTML_EVENT_ELEMENT(DISPID_HTMLELEMENTEVENTS_ONMOUSEOVER, _T("elementid"), OnMouseOver) // id为elementid的元素事件响应 DHTML_EVENT_CLASS(DISPID_HTMLELEMENTEVENTS_ONMOUSEOVER, _T("myclass"), OnMouseOver) // class为myclass的元素事件响应 DHTML_EVENT_TAG(DISPID_HTMLELEMENTEVENTS_ONMOUSEOVER, _T("div"), OnMouseOver) // 所有DIV元素的onmouseover事件响应 DHTML_EVENT_AXCONTROL(controlMethodDISPID, _T("objectid"), OnControlMethod) // ActiveX控件事件响应 END_DHTML_EVENT_MAP() // 实现外部DISPATCH方法,能在这里添加任意的方法供页面的脚本调用 // 调用方式如下:window.external.about(123, "abc") // 请注意响应函数的原型定义:void Foo(VARIANT*,VARIANT*,VARIANT*) // 目前仅仅定义了三个参数,一般也足够使用了。如果脚本实际调用只提供了2个参数,则第三个指针参数是NULL。以此推 BEGIN_EXTERNAL_METHOD_MAP(CMainDlg) EXTERNAL_METHOD(_T("about"), OnAbout) END_EXTERNAL_METHOD_MAP() void OnAbout(VARIANT* para1, VARIANT* para2, VARIANT* para3) { // your code is here. } HRESULT OnClick(IHTMLElement *pElement) { // your code is here. return S_OK; } HRESULT OnMouseMove(IHTMLElement *pElement) { // your code is here. return S_OK; } ......}除了上面的例子,还有CMultiPageDHtmlDialogImpl的一些映射宏,以及还有一些虚函数可供重载。对话框设计好后,调用方法也很简单,例子如下: CMainDlg dlg; dlg.m_nHtmlResID = IDR_YOUR_HTML_RESOURCE_ID; // open your resource or dlg.m_szHtmlResID = _T("C:\\yourname.html"); // open your resource or dlg.m_strCurrentUrl = _T("www.microsoft.com"); // open local html file or external URL dlg.Create(NULL); // or dlg.DoModal(NULL);好了,介绍就到这里,如果有更多疑问,请下载头文件查看源代码以及注释,本次下载的文件版本是 1.02。当前版本的一个缺憾是尚未支持DDX/DDV,原因是ATL并未提供DDX机制,下个版本将完全仿照WTL的方式实现该的DDX/DDV。另外为了通用性以及减少依赖,代码完全未使用CString或CAtlString,主要是MFC、ATL、WTL各自提供了自己的CString实现。版权特别声明:本软件源码完全属作者James(胡柏华)自创,作者拥有修改和变更代码特性的权利,任何团体或个人均可以自由下载并免费使用。如用于商业用途,请在所属商业软件的版权声明加注本声明。使用者使用本源码的过程产生的任何错误,作者并无义务提供技术支持,由此导致的任何损失,作者概不负责。2007-11-7
jacob实现语音播报 将附件jacob.dll放到system32文件夹下 <!-- https://mvnrepository.com/artifact/com.jacob/jacob 文字转语音 --> com.hynnet jacob 1.18 /** * 语音转文字并播放 * * @param text */ public void textToSpeech(String text) { ActiveXComponent ax = null; try { ax = new ActiveXComponent("Sapi.SpVoice"); // 运行输出语音内容 Dispatch spVoice = ax.getObject(); // 音量 0-100 ax.setProperty("Volume", new Variant(100)); // 语音朗读速度 -10 到 +10 ax.setProperty("Rate", new Variant(-2)); // 执行朗读 Dispatch.call(spVoice, "Speak", new Variant(text)); // // 下面是构建文件流把生成语音文件 // // ax = new ActiveXComponent("Sapi.SpFileStream"); // Dispatch spFileStream = ax.getObject(); // // ax = new ActiveXComponent("Sapi.SpAudioFormat"); // Dispatch spAudioFormat = ax.getObject(); // // // 设置音频流格式 // Dispatch.put(spAudioFormat, "Type", new Variant(22)); // // 设置文件输出流格式 // Dispatch.putRef(spFileStream, "Format", spAudioFormat); // // 调用输出 文件流打开方法,创建一个.wav文件 // Dispatch.call(spFileStream, "Open", new Variant("./text.wav"), new Variant(3), new Variant(true)); // // 设置声音对象的音频输出流为输出文件对象 // Dispatch.putRef(spVoice, "AudioOutputStream", spFileStream); // // 设置音量 0到100 // Dispatch.put(spVoice, "Volume", new Variant(100)); // // 设置朗读速度 // Dispatch.put(spVoice, "Rate", new Variant(-2)); // // 开始朗读 // Dispatch.call(spVoice, "Speak", new Variant(text)); // // // 关闭输出文件 // Dispatch.call(spFileStream, "Close"); // Dispatch.putRef(spVoice, "AudioOutputStream", null); // // spAudioFormat.safeRelease(); // spFileStream.safeRelease(); // spVoice.safeRelease(); // ax.safeRelease(); } catch (Exception e) { e.printStackTrace(); } }

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧