-
2020-06-23 19:51:53
- 项目-添加类-MFC-ActiveX控件中的MFC类
- 注册表-生成类,便会生成相应的.h和.cpp文件
- 资源视图-工具箱-选择项-COM组件,在工具箱会生成相应的控件,使用方法和其他控件一样
-
更多相关内容 -
VC控制台调用COM组件
2020-07-22 15:04:15因项目需求,需要在console中调用com对象。此处包含源码和说明,如果有什么不明白的可以给我留言。 -
JAVA调用COM组件
2019-10-29 16:56:51java使用jacob包,调用VS...其中,包括如下信息: 1、jacob支持JDK1.6、1.7、1.8,支持win32、win64 2、附带有调用COM的java示例 3、运行run.bat,将测试示例一键打包,并同时输出测试结果(实例中默认的JDK环境为1.6) -
QT生成COM组件并调用COM组件测试工程.7z
2021-01-22 11:20:05QT生成COM组件并调用COM组件测试工程。 博客: https://blog.csdn.net/xiaolong1126626497/article/details/112978956 -
免注册调用COM组件方法二-Assembly Manifests
2020-03-25 15:33:16众所周知,通过Assembly Manifests,我们可以免注册调用各种进程内的COM组件...这个工具本身就是通过Assembly Manifests来免注册调用COM(TLBINF32.DLL)和OCX(COMDLG32.OCX)来实现的,具体怎么实现请参考里面的VB6源码。 -
C# 通过反射调用com组件
2017-10-08 20:32:48C# 通过反射调用com组件,封装了几个简单的方法方便使用反射调用com。 var obj=new ComObj("excel.application"); obj["Visible"]=true; obj. InvokeMethod("Application.Workbooks.Open", fileName); -
C# .net WindowsForm创建快捷方式动态调用com组件无需额外带DLL
2018-02-07 12:21:41收藏的一个动态调用com组件创建快捷方式的方法,此方法真正的无需额外调用DLL文件,不需要再程序目录里带上Interop.IWshRuntimeLibrary.dll。真正做到单文件创建快捷方式,也不是调用VB脚本,找了很久才找到的,特此... -
java调用com组件实例
2013-08-07 21:14:32java调用com组件实例,使用jacb访问com对象 -
在javascript函数中调用com组件的属性和方法
2015-01-12 10:05:02本文介绍了在javascript函数中调用com组件的属性和方法的技术。 -
IE调用com组件exe程序
2016-02-26 17:36:49压缩包包含html文件,可查看如何调用exe,代码中可查看如何添加方法,如何在注册表注册,如何设置对话框隐藏。 -
C#调用COM组件方法总结
2013-07-25 18:21:47整理的C#调用COM组件方法总结,总结的网上介绍的不少方法,可以参考着看一下 -
如何在C#中调用COM组件
2020-08-18 18:23:35主要介绍了如何在C#中调用COM组件,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下 -
WPF调用COM组件
2017-07-10 17:07:54本实例包括一个c++写的COM组件,一个WPF工程,其中WPF调用该COM组件中的接口函数,从而实现C#调用C++。 -
html调用com组件ocx,ocx回调html
2017-11-07 17:25:02编写了一个com组件,regvr32注册组件后可供html调用,编写了一个回调函数调用html中的方法,返回计算中的时时状态。有回调函数讲解文档及html调用demo。 -
Qt调用Com组件--QT调用COM组件DLL(dumpCPP工具)
2019-12-03 09:00:18近期项目使用COM组件生成的DLL库,我采用QT自带Com组件操作类调用DLL中函数接口;QT自带com组件操作类库,QAxObject或QAxWidget即可操作以COM为组件的DLL库,网上有许多例子采用这两个类操作EXCEL,在此我不做详述,...近期项目使用COM组件生成的DLL库,我采用QT自带Com组件操作类调用DLL中函数接口;QT自带com组件操作类库,QAxObject或QAxWidget即可操作以COM为组件的DLL库,网上有许多例子采用这两个类操作EXCEL,在此我不做详述,在QT中还可以使用QT类库创建COM组件供Windows中C#调用;在此我想说QT是真强大。
这里附两个例子操作excel:(该两个例子我随手贴的,如有侵权请告知删除)
https://blog.csdn.net/qq319923400/article/details/80149367
https://blog.csdn.net/x85371169/article/details/79268258
使用QT自带dumpcpp工具直接将COM组件DLL库转换成Qt可调用C++类;具体操作如下:
1)找好自己安装QT目录,并确定开发环境,我在windows中使用,采用QT5.9.7版本QT,环境与VS2015共同开发,所以使用msvc2015工具链中工具,工具路径如下:
2)查看使用方法,可直接查看QT帮助文档;
3)找到需要处理的DLL库或需要使用工具的库ID,ID及注册表中的注册ID,如果不知道ID名或ID号可直接在注册表中查找,我的ID如下:
4)使用cmd生成C++类,先切换路径到dumpcpp工具路径下,然后使用dumpcpp ID
执行未报错将会在Qt工具路径下生成C++的类:一个.h一个.cpp
这两个文件以QT类生成,可直接在项目中使用;
5)将生成文件引用本机项目即可使用该组件
注:生成的文件不带信号函数因为它直接跳过所有事件:skipping event interface _IVSPortAxEvents,但不影响操作,在COM组件中的事件函数,其实在该类中可直接使用其事件函数为信号函数,需要注意的只有其事件函数参数值:
在QAxwidget中有一信号函数,该信号函数来自QAxBase
使用该信号函数可查看到组件会响应的所有事件函数及参数类型,该信号可供参考
博客文章迁移至:https://www.10sxj.com/
如有疑问加群:676977101(新群)
-
C#调用Com组件,启动Excel程序
2021-03-16 03:13:19摘要:C#源码,控件类库,Com组件,Excel C#调用Com组件,启动Excel程序,点击按钮,即可打开你电脑上安装的Excel软件,这只是一个小小的示例文件,学会如何调用Com组件,希望初学者下载源码参考。 -
免注册调用任何com组件.rar
2019-05-25 15:37:37免注册调用任何com组件 vs2013编写,喜欢老铁来个赞,哈哈。 -
QT应用编程: windows下QT调用COM组件
2021-01-22 11:04:55理论上任何语言生成的COM组件调用流程应该都是一样的。 QT创建COM的方法看这里: (1)VS2017下使用QT生成COM组件: https://blog.csdn.net/xiaolong1126626497/article/details/112556866 (2)...一、环境介绍
操作系统: win10 64位
QT版本: 5.12.6
Visual Studio IDE 版本: 2017
示例工程下载链接: https://download.csdn.net/download/xiaolong1126626497/14919797
二、创建COM组件
为了方便测试,我这里使用QT来创建COM组件,再由QT自己调用。 理论上任何语言生成的COM组件调用流程应该都是一样的。
QT创建COM的方法看这里:
(1)VS2017下使用QT生成COM组件: https://blog.csdn.net/xiaolong1126626497/article/details/112556866
(2) QtCreate下生成COM组件: https://blog.csdn.net/xiaolong1126626497/article/details/112550412
当前创建COM组件的工程我是使用VS2017+QT插件的方式生成的。
为了方便注册可以在目录下写个脚本:
安装代码:
cd /d %~dp0 @regsvr32 ActiveQtServer_vs2017.dll @exit
卸载代码:
cd /d %~dp0 @regsvr32 /u ActiveQtServer_vs2017.dll @exit
三、QtCreate里创建工程调用COM组件
3.1 创建工程
3.2 编写测试代码
#include <QApplication> #include <QAxObject> #include <QDebug> #include <QFile> int main(int argc, char *argv[]) { QApplication a(argc, argv); QAxObject *mpAxObj; mpAxObj = new QAxObject(); //指定调用的COM组件类ID,这个ID要填正确. mpAxObj->setControl("{fe8bb3a1-998e-4318-b4ee-4263a1cc06a2}"); //导出支持调用的函数接口 QString DOC = mpAxObj->generateDocumentation(); QFile outFile("com_function.html"); outFile.open(QIODevice ::ReadWrite|QIODevice ::Text); QTextStream TS(&outFile); TS<<DOC<<endl; //调用COM组件函数接口: 获取版本号 QString result = mpAxObj->dynamicCall("VersionNumber()").toString(); qDebug()<<"VersionNumber:"<<result; //调用COM组件函数接口: 求和计算 QVariantList params ={100,200}; int sum_val = mpAxObj->dynamicCall("sum(int, int)", params).toInt(); qDebug()<<"sum:"<<sum_val; //调用COM组件函数接口: 显示界面 mpAxObj->dynamicCall("show()"); return a.exec(); }
3.3 工程pro文件
QT += core gui QT += axcontainer greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp HEADERS += FORMS += # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target
3.4 运行测试
说明: 如何调用运行失败,记得把COM组件dll依赖的所有文件拷贝到现在测试程序运行的目录下,防止找不到依赖文件运行失败。
如果想将带界面的COM控件集成到当前QT工程里,可以参考这篇文章:
https://blog.csdn.net/xiaolong1126626497/article/details/113127300
下面公众号里有全套的QT基础教程,C++、单片机、Linux基础教程。欢迎关注。
-
C++和C#编写调用COM组件
2012-08-15 11:58:38摘要:现在COM组件的使用越来越广泛,在各个程序中调用COM组件我想大家都遇到过,这篇文章就是关于COM组件的编写和调用的,主要包含了使用VC6.0编写和调用COM组件,VS2005中使用C#编写和调用COM组件,以及在VC6.0和... -
c++dialog工程调用Com组件工程
2017-12-02 17:28:33c++如何调用com组件工程,对话框工程如何调用一个ocx库。 -
c#中调用com组件
2008-07-23 16:55:18实现在c#中调用com组件 -
CSharp调用COM组件[归纳].pdf
2021-10-11 01:28:42CSharp调用COM组件[归纳].pdf -
C# 互操 调用COM组件
2016-09-30 09:21:49引言如何在C#中调用COM组件——访问Office 互操作对象在C# 中调用COM组件的实现原理剖析错误处理小结 一、引言 COM(Component Object Modele,组件对象模型)是微软以前推崇的一个开发技术,所以现在微软的...本专题概要:
- 引言
- 如何在C#中调用COM组件——访问Office 互操作对象
- 在C# 中调用COM组件的实现原理剖析
- 错误处理
- 小结
一、引言
COM(Component Object Modele,组件对象模型)是微软以前推崇的一个开发技术,所以现在微软的很多产品都用到了COM组件,如Office,IE 等。然而如果.NET 平台下的程序想访问COM组件的方式来实现某个功能怎么办呢? 正是由于开发人员有这个需求,所以微软在.NET FrameWork中为COM和托管代码之间进行互操作提供了支持,这种互操作性的技术就是COM Interop。 但是COM Interop(COm互操作)这项技术,不仅支持在托管代码中使用COM对象,并且也支持在COM中使用托管对象,本专题只针对在.NET中调用COM对象来介绍,由于COM技术现在用的不多,所以如何在COM中使用托管对象将不会在本系列中做出介绍,如果有需要的朋友可以参看MSDN的相关链接:http://msdn.microsoft.com/zh-cn/library/3y76b69k(v=vs.100).aspx。
下面就从一个具体的实例来看看在.NET 中是如何调用COM组件的。
二、如何在C#中调用COM组件——访问Office 互操作对象
因为Office产品中使用了很多COM组件,下面就演示通过调用Office中的COM对象来创建Word文档并保存创建的文档到文件目录下的例子(在新建的控制台程序里添加”Microsoft.Office.Interop.Word 14.0.0.0 “ 这个引用,14.0.0.0版本是对应于Office 2010的一个互操作程序集, 12.0.0.0版本则是对应于Office 2007的互操作程序集,如果你电脑中只安装了Office 2007的话,就只能找到 12.0.0.0的版本的,如果安装了Office 2010的话,就可以同时找到这两个版本。)。具体代码如下:
using System; // 添加额外的命名空间 using Microsoft.Office.Interop.Word; namespace COM互操作性 { class Program { static void Main(string[] args) { // 调用COM对象来创建Word文档 CreateWordDocument(); } private static void CreateWordDocument() { // 启动Word并使Word可见 Application wordApp = new Application() { Visible = true }; // 新建Word文档 wordApp.Documents.Add(); Document wordDoc = wordApp.ActiveDocument; Paragraph para = wordDoc.Paragraphs.Add(); para.Range.Text = "欢迎你,进入Learning Hard博客"; // 保存文档 object filename = @"D:\learninghard.doc"; wordDoc.SaveAs2(filename); // 关闭Word wordDoc.Close(); wordApp.Application.Quit(); } } }
运行结果为:
此时在所指定的文件目录中就可以看到你刚才创建的Word文档了。通过COM互操作的技术我们可以Office的自动化操作。
三、在C# 中调用COM组件的实现原理剖析
通过上面的例子,大家可以看出在.NET 中调用COM组件是非常方便和简单的,以至于我们根本不能明白它背后的原理的,下面就介绍在托管代码中调用COM组件的实现原理和需要的步骤。
要运行上面的程序必须添加一个互操作程序集——“Microsoft.Office.Interop.Word 14.0.0.0”,大家可以通过下面的步骤来添加这个程序集:
- 请在“解决方案资源管理器”中,右击“引用”文件夹,然后单击“添加引用”。
- 在“.NET”选项卡上,选中最新版本的 Microsoft.Office.Interop.Word。 例如,“Microsoft.Office.Interop.Excel 14.0.0.0”。 单击“确定”。
通过上面添加引用的步骤可以看出,Microsoft.Office.Interop.Word.dll 是一个.NET程序集,而不是COM组件,这时候朋友们肯定有这样的疑问——不是调用COM组件的吗?怎么在托管代码中调用.NET 程序集的?这样怎么能算是在.NET下调用COM组件的演示了? 然而事实是—— Microsoft.Office.Interop.Word.dll 确实是一个.NET程序集,并且它也叫做COM组件的互操作程序集,这个程序集中包含了COM组件中定义的类型的元数据, 托管代码通过调用互操作程序集中公开的接口或对象来间接地调用COM对象和接口的。由于托管代码中不能直接使用COM对象和接口,所以托管代码对COM对象的调用时是通过CLR的 COM Interop 层作为代理完成的,这个代理就是RCW(即Runtime Callable Wrapper,运行时可调用包装),所以对COM对象的调用,都是通过RCW来完成的,RCW做的工作主要有激活COM对象和在托管代码和非托管代码之间进行数据封送处理(从这里可以看出,RCW就是 .NET平台和COM组件之间的一个代理,微软的很多技术都使用了代理的,例如WCF技术——我们在代码中创建的对象其实只是服务的一个代理,通过代理对象来访问真真的对象的服务,即方法。讲到代理的技术,C#中的委托也是代理的一种实现,此时又想到了23中设计模式中的——代理模式,然而生活中也不乏代理的例子,租房中介,代理服务器等)。下面通过一个图来演示下 在.NET中调用COM组件的原理:
关于通过Tlblmp.exe工具来生成互操作程序集步骤,这里我就不多详细诉说了,大家可以参考MSDN中这个工具详细使用说明 :http://msdn.microsoft.com/zh-cn/library/tt0cf3sx(v=VS.80).aspx 。
然而我们也可以使用Visual Studio中内置的支持来完成为COM类型库创建互操作程序集的工作,我们只需要在VS中为.NET 项目添加对应的COM组件的引用,此时VS就会自动将COM类型库中的COM类型库转化为程序集中的元数据,并在项目的Bin目录下生成对于的互操作程序集,所以在VS中添加COM引用,其实最后程序中引用的是互操作程序集,然后通过RCW来对COM组件进行调用。 然而对于Office中的Microsoft.Office.Interop.Wordd.dll,这个程序集也是互操作程序集,但是它又是主互操作程序集,即PIA(Primary Interop Assemblies)。主互操作程序集是一个由供应商提供的唯一的程序集,为了生成主互操作程序集,可以在使用TlbImp命令是打开 /primary 选项。看到这里,朋友们肯定有这样的疑问:PIA与普通程序集到底有什么区别呢?——区别就是PIA除了包含了COM组件定义的数据类型外,还包含了一些特殊的信息,如公钥,COM类型库的提供者等信息。然而 为什么需要主互操作程序集的呢 ? 对于这个问题的答案就是——主互操作程序集可以帮助我们解决部署程序时,引用互操作程序集版本不一致的问题。(如果开发人员会为一个COM组件类型库生成多个互操作程序集,项目中引用的互操作程序集版本与部署时的互操作程序集版本不一致的问题,有了互操作程序集时,我们可以直接引用官方提供主互操作程序集。)
四、错误处理
知道了如何调用COM组件之后,大家或许会问:如果调用COM对象的方法失败时怎么去获取失败的信息呢?对于这个疑问,错误的处理的方法和我们平常托管代码中的处理方式是一样的,下面就具体看看是如何获取错误信息的,下面这段代码的功能是——打开一个现有的Word文档并插入相应的文本,当指定的Word文档不存在时,此时就会出现调用COM对象的Open方法失败的情况,具体代码如下:
using System; using Microsoft.Office.Interop.Word; using System.IO; using System.Runtime.InteropServices; namespace COM互操作中的错误处理 { class Program { static void Main(string[] args) { // 打开存在的文档插入文本 string wordPath = @"D:\test.docx"; OpenWordDocument(wordPath); Console.Read(); } // 向现有文档插入文本 private static void OpenWordDocument(string wordPath) { // 启动Word 应用程序 Application wordApp = new Application() { Visible = true }; Document wordDoc=null; try { // 如果文档不存在时,就会出现调用COM对象失败的情况 // 打开Word文档 wordDoc = wordApp.Documents.Open(wordPath); // 向Word中插入文本 Range wordRange = wordDoc.Range(0, 0); wordRange.Text = "这是插入的文本"; // 保存文档 wordDoc.Save(); } catch(Exception ex) { // 获得异常相对应的HRESULT值 // 因为COM中根据方法返回的HRESULT来判断调用是否成功的 int HResult = Marshal.GetHRForException(ex); // 设置控制台的前景色,即输出文本的颜色 Console.ForegroundColor = ConsoleColor.Red; // 下面把HRESULT值以16进制输出 Console.WriteLine("调用抛出异常,异常类型为:{0}, HRESULT= 0x{1:x}", ex.GetType().Name, HResult); Console.WriteLine("异常信息为:" + ex.Message.Replace('\r', ' ')); } finally { // 关闭文档并 if (wordDoc != null) { wordDoc.Close(); } // 退出Word程序 wordApp.Quit(); } } } }
如果我们D盘中不存在一个 test.docx文档时,此时代码就会进入catch块,输出异常信息,运行结果为:
从上面的结果我们看到了一个 HRESULT值,这个值真是COM代码中返回返回的。在COM中,COM方法通过返回 HRESULT 来报告错误;.NET 方法则通过引发异常来报告错误,为了方便地在托管代码中获得COM代码中出现的错误和异常信息,CLR提供了两者之间的转换,每一个代表错误发生的HRESULT都会被映射到.NET Framework中的一个异常类,对于具体的映射关系可以参考MSDN中 的文章: http://msdn.microsoft.com/zh-cn/library/9ztbc5s1(VS.80).aspx ,我这里就不具体用表格列出来的。 如果某个HRESULR不能被映射到等效的.NET Framework 异常类时,那么就会被映射到COMException异常类, 我们可以通过 Marshal类的GetHRForException方法来获得异常类对应的HRESULT值(该方法的使用在上面代码中已经贴出)
五、小结
关于在.NET中调用COM组件的介绍就到这里的,即使我们在.NET中调用COM对象的方法是非常的简单和方便,但是理解CLR 为我们背后完成的工作到底有哪些和理解托管代码中调用COM组件原理也是相当有必要的。因为理解了调用的原理之后,当我们出现问题的时候就可以很快找到解决方案并解决它,不会觉得无从下手,这样就可以帮助我们提供解决问题的能力。
-
FB调用COM组件
2019-01-09 12:11:37FB调用COM组件调用源码,有学习的同学可以下载,有文章说明,此为代码 -
C++和C#编写调用COM组件[归纳].pdf
2021-10-11 01:01:02C++和C#编写调用COM组件[归纳].pdf -
vc中调用Com组件的方法详解
2013-09-07 14:32:51vc中调用Com组件的方法详解。简单易懂。 -
C#_COM组件注册与调用
2015-06-04 13:38:26安装了VS(我用的vs2012 64位) gacutil.exe路径 C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools regasm.exe路径 C:\Windows\Microsoft.NET\Framework64\v4.0.30319 ... -
QT应用编程: windows下QT调用COM组件并集成到QT界面
2021-01-25 18:15:07理论上任何语言生成的COM组件调用流程应该都是一样的。 QT创建COM的方法看这里: (1) VS2017下使用QT生成COM组件: https://blog.csdn.net/xiaolong1126626497/article/details/112556866 (2...