如何使用第三方COM组件
C#调用COM组件的几个步骤

C#调⽤COM组件的⼏个步骤< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd>这⾥我们将介绍C#调⽤COM组件的⼏个步骤,先将Com类型信息转换为.NET元数据,然后查看元数据,最后测试程序。
⾸先将Com类型信息转换为.NET元数据1. tlbimp sample.dll /out: sample_clw.dll⼯具:Tlbimp.exe(类型库导⼊程序)参考:.Net framework SDK ⽂档1. ms-help://FrameworkSDK.CHS/cptools/html/cpgrftypelibraryimportertlbimpexe.htm查看元数据⼯具:ILDasm参考:ms-help://FrameworkSDK.CHS/cptutorials/html/il_dasm_tutorial.htm测试程序:⽣成⼀个console programme在project->add reference⾥,选择com,browser你的com,selectok,现在在你的bin⽬录下应该有⼀个sample_clw.dll了下⾯我们来⽤sample_clw的⽅法1. using System;2. using sample_clw;3. namespace CompConsole4. {5. /// <summary>6. /// Class1 的摘要说明。
7. /// </summary>8. class Class19. {10. /// <summary>11. /// 应⽤程序的主⼊⼝点。
12. /// Date:2003/6/2013. /// </summary>14. [STAThread]15. static void Main(string[] args)16. {17. //18. // TODO: 在此处添加代码以启动应⽤程序19. Console.Write ("=======Demo for Call com functions in c#=============\n");20. sampleClass sam = new sampleClass();21. //now we call functions22. //23. sam.SayHello();24. }25. }。
百一测评——使用第三方组件

职业技能题库&在线云笔试平台试卷名称:使用第三方组件试卷描述:IT笔试题目、招聘笔试、微信考试、在线考试试卷链接:/store/open/paperInfo/41743试卷限时:50分一.不定项选择题每题分值:2.5分是否题目乱序:是是否选项乱序:是是否可回溯:是难度:中1.[不定项]下面哪条语句可以用于限制上传文件的大小为2M,并且超出大小时报错?A. upload.SetMaxSize 2*1024*1024,TrueB. upload.SetMaxSize 2*1024*1024,FalseC. upload.SetMaxSize 2*1024*1024D. upload.SetMaxSize=2*1024*1024答案:A2.[不定项]对于文件上传组件,下面哪条语句可以输出上传文件的大小。
A. Response.Writeupload.Files("fleUpload").SizeB. Response.Writeupload.Form("fleUpload ").SizeC. Response.WriteRequest.Files("fleUpload ").SizeD. Response.WriteRequest.Form("fleUpload ").Size职业技能题库&在线云笔试平台答案:A3.[不定项]对于文件上传组件,下面哪条语句可以输出上传表单元素的值。
A. Response.Writeupload.Form("txtIntro").ValueB. Response.Writeupload.Form("txtIntro")C. Response.WriteRequest.Form("txtIntro").ValueD. Response.WriteRequest.Form("txtIntro")答案:AB4.[不定项]在11-6.asp中,下面哪些语句可以用来输出上传文件的大小?A. Response.Writeupload.Files("fleUpload").SizeB. Response.Writefle.SizeC. Response.Writeupload.Files(1).SizeD. Response.Writefle答案:ABC5.[不定项]Upload对象的哪个属性用于设置是否允许覆盖文件?A. IgnoreNoPostB.OverWriteC. SetMaxSizeD.OverWriteFiles答案:D6.[不定项]对于发送邮件组件,如果信箱是jjshang99@,密码是123456,发信服务器是,发信时需要验证。
如何在C#中调用COM组件

如何在C#中调⽤COM组件⼀、引⾔下⾯就从⼀个具体的实例来看看在.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);// 关闭WordwordDoc.Close();wordApp.Application.Quit();}}}运⾏结果为:此时在所指定的⽂件⽬录中就可以看到你刚才创建的Word⽂档了。
什么是COM组件(转)

什么是COM组件(转)所谓COM,英⽂为Componet Object Model,中⽂为组件对象模型(其实这种解释只有在考试卷上才具有⼀点实际意义)。
【1】为什么需要COM?COM是为了解决OLE问题⽽产⽣的。
COM与OLE的关系类似于微积分与物理的问题。
实际上⽜顿当年就是为了解决物理中的机械及动⼒学问题⽽发明微积分,后来微积分才作为⼀种有效的⼯具被⽤于其它学科之中。
《倚天屠龙记》中张⽆忌当初为了驱除⾝体中⽞魔神掌的寒⽓⽽学习九阳神功,其实他根本不晓得九阳神功随后能帮他解决那么多棘⼿的问题。
【2】COM本质指什么?COM本质是⼀种说明如何建⽴可动态互变组件的规范。
这种规范提供了为保证能够互操作,客户和组件应遵循的⼆进制和⽹络标准。
通过这种标准将可以在任意两个组件之间进⾏通信⽽不⽤考虑其所处的操作环境是否相同、使⽤的开发语⾔是否⼀致以及是否运⾏于同⼀台计算机。
【3】COM规范的作⽤?COM作⽤:提供⼀种独⽴于平台与编程语⾔之外的,共享⼆进制代码的⽅法。
在COM规范下将能够以⾼度灵活的编程⼿段来开发、维护应⽤程序。
可以将⼀个单独的复杂程序划分为多个独⽴的模块进⾏开发,这⾥的每⼀个独⽴模块都是⼀个⾃给⾃⾜的组件,可以采取不同的开发语⾔去设计每⼀个组件。
在运⾏时将这些组件通过接⼝组装起来以形成所需要的应⽤程序。
构成应⽤程序的每⼀个组件都可以在不影响其它组件的前提下被升级。
这⾥所说的组件是特指在⼆进制级别上进⾏集成和重⽤⽽能够被独⽴⽣产获得和配置的软件单元。
COM规范所描述的即是如何编写组件,遵循COM标准的任何⼀个组件都是可以被⽤来组合成应⽤程序的。
⾄于组件采取的是何种编程语⾔则是⽆关紧要的,可以⾃由选取。
作为⼀个真正意义上的组件,应具备如下特征:1. 实现了对开发语⾔的封装。
2. 以⼆进制形式发布。
3. 能够在不妨碍已有⽤户的情况下被升级。
4. 在⽹络上的位置必须能够被透明的重新分配。
这些特征使COM组件具有很好的可重⽤性,这种可重⽤性与DLL⼀样都是建⽴在⼆进制基础上的代码重⽤。
第三方接口(外部api)对接流程及规范

第三方接口(外部api)对接流程及规范下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor.I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!第三方接口(外部API)对接流程与规范详解在现代软件开发中,第三方接口(External API,也称为外部API)的使用已经变得非常普遍。
COM 组件设计与应用(十五)——连接点(vc6.0)

COM 组件设计与应用(十五)——连接点(vc6.0)一、前言上回书介绍了回调接口,在此基础上,我们理解连接点就容易多了。
二、原理图一、连接点组件原理图。
左侧为客户端,右侧为服务端(组件对象)看着好复杂呀......呵呵,其实简单的紧:(注1)1、一个 COM 组件,允许有多个连接点对象(IConnectionPoint)。
也就是说可以有多个发生“事件”的源头。
上图就有3个连接点;2、管理这些连接点的接口叫“连接点容器”(IConnectionPointContainer)。
连接点容器接口特别简单,因为只有2个函数,一个是 FindConnectionPoint(),表示查找你想要的连接点;另一个是 EnumConnectionPoints(),表示列出所有的连接点,然后你去选择使用哪个。
在实际的应用中,查找法使用最多,占90%,而枚举法使用只占 10%,一般在支持第三方的插件(Plug in)时才使用。
(你想写个 IE 的插件吗?我们后面就要讲到啦)3、每一个连接点,可以被多个客户端的接收器(Sink)连接;这个我们已经熟悉啦,还记得我们在上回书中为了管理多个回调接口,使用了 cookie 的方式进行区别吗?!三、实现组件(一)1、建立一个工作区(WorkSpace)2、在工作区中,建立一个 ATL 工程(Project)。
示例程序中工程名称叫 Simple15,接受全部默认选项。
3、ClassView 中,执行鼠标右键菜单命令 New Atl Object...,添加 ALT 类。
4、左侧分类 Category 选择 Objects,右侧 Objects 选择 SimpleObject(其实就是默认项目)。
5、名称 Name 卡片中,输入组件名称。
示例程序中是 DispConnect。
6、属性 Attributes 卡片中,接口类型选 Dual 双接口。
注意一定要选择 Support Connection Points 来支持连接点。
[总结]最原始的COM组件调用过程(不使用注册表信息)
![[总结]最原始的COM组件调用过程(不使用注册表信息)](https://img.taocdn.com/s3/m/0b4bf724443610661ed9ad51f01dc281e53a5622.png)
[总结]最原始的COM组件调⽤过程(不使⽤注册表信息)最近因为项⽬的关系开始研究COM组件了,以前都认为COM过时了,所以也没怎么接触. 现在好好补补课了.⼀般调⽤COM都是通过注册表找到它的位置, 然后调⽤COM库的标准函数. 这些封装⽆疑使得我这个初学者⽆法了解⾥⾯到底做了什么, ⽽且注册表和COM库标准函数都是windows提供的, 但是COM这个思想是可以在Linux下实现的. 只要知道它的实现原理就⾏了. 因此我就试着⽤最基本的调⽤⽅法来使⽤COM组件, 以了解其调⽤过程和原理.⾸先,我⽤vs的ATL创建了⼀个简单的ATL项⽬test, 然后添加了⼀个简单对象Mytest, 该对象实现了⼀个IMytest接⼝,该接⼝有⼀个testfunc函数. 编译⽣成了⼀堆⾃动产⽣的⽂件, 我们只需要最后的test.dll⽂件和test.h⽂件. 有了这两个⽂件,我们就可以使⽤该组件中实现的接⼝了.然后,我创建了⼀个win32控制台项⽬来测试⼀下如何不使⽤注册表来调⽤COM组件中的接⼝⽅法. 不使⽤注册表,那么该test.DLL⽂件也就不需要使⽤regsvr32.exe来注册组件了,我们使⽤⼿动加载的⽅式来使⽤COM组件. (将test.dll放在win32程序运⾏⽬录下,将test.H⽂件放在win32⼯程⽬录下)过程如下:// usetest.cpp : 定义控制台应⽤程序的⼊⼝点。
//#include "stdafx.h"#include "test.h"//#import "test.dll"#include <iostream>using namespace std;typedef HRESULT ( __stdcall *CREATEFUNC)(REFCLSID clsid,REFIID iid,void** ppobj);int _tmain(int argc, _TCHAR* argv[]){HINSTANCE hi= ::LoadLibrary(L"test.dll");if(hi!=NULL){cout<<"dll loaded."<<endl;CREATEFUNC CreateInstance = (CREATEFUNC)::GetProcAddress(hi,"DllGetClassObject");if(CreateInstance!=NULL){cout<<"get DllGetClassObject method - Success."<<endl;IClassFactory* pICF = NULL;HRESULT hr = CreateInstance(__uuidof(Mytest),IID_IClassFactory,(void**)&pICF);if(SUCCEEDED(hr)){cout<<"create IClassFactory - Success."<<endl;IMytest* pIMytest=NULL;HRESULT hr2 = pICF->CreateInstance(NULL,__uuidof(IMytest),(void**)&pIMytest);if (SUCCEEDED(hr2)){cout<<"get interface - Success."<<endl;HRESULT hr3=pIMytest->testfunc(1);if (SUCCEEDED(hr3)){cout<<"Invoke interface method OK."<<endl;}pIMytest->Release();}pICF->Release();}}FreeLibrary(hi);}return 0;}和windows相关的只⽤到了dll加载相关的API,⽽这些在其他系统下都有对应的api. 所以如果想在其他系统下实现以下COM的调⽤, 还是可以的.更进⼀步,可以使⽤xml⽂件来维护com组件的位置信息, 然后写⼀套与系统⽆关的通过xml⽂件查找com组件的库,这样就可以实现com组件的跨平台了.哈哈,想法不错,实现起来还是有难度的.。
COM组件三个最基本的接口类和使用COM库的三种方法

COM组件三个最基本的接口类//VC6中使用COM库的三种方法COM组件有三个最基本的接口类,分别是IUnknown、IClassFactory、IDispatch。
COM规范规定任何组件、任何接口都必须从IUnknown继承,IUnknown包含三个函数,分别是QueryInterface、AddRef、Release。
这三个函数是无比重要的,而且它们的排列顺序也是不可改变的。
QueryInterface用于查询组件实现的其它接口,说白了也就是看看这个组件的父类中还有哪些接口类,AddRef用于增加引用计数,Release用于减少引用计数。
引用计数也是COM中的一个非常重要的概念。
大体上简单的说来可以这么理解,COM组件是个DLL,当客户程序要用它时就要把它装到内存里。
另一方面,一个组件也不是只给你一个人用的,可能会有很多个程序同时都要用到它。
但实际上DLL只装载了一次,即内存中只有一个COM组件,那COM组件由谁来释放?由客户程序吗?不可能,因为如果你释放了组件,那别人怎么用,所以只能由COM组件自己来负责。
所以出现了引用计数的概念,COM维持一个计数,记录当前有多少人在用它,每多一次调用计数就加一,少一个客户用它就减一,当最后一个客户释放它的时侯,COM知道已经没有人用它了,它的使用已经结束了,那它就把它自己给释放了。
引用计数是COM编程里非常容易出错的一个地方,但所幸VC的各种各样的类库里已经基本上把AddRef的调用给隐含了,在我的印象里,我编程的时侯还从来没有调用过AddRef,我们只需在适当的时侯调用Release。
至少有两个时侯要记住调用Release,第一个是调用了QueryInterface以后,第二个是调用了任何得到一个接口的指针的函数以后,记住多查MSDN 以确定某个函数内部是否调用了AddRef,如果是的话那调用Release的责任就要归你了。
IUnknown的这三个函数的实现非常规范但也非常烦琐,容易出错,所幸的事我们可能永远也不需要自己来实现它们。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何使用第三方COM组件?已经有了第三方的COM组件(如OCX,DLL,TLB),该如何使用呢?
最简单的方法就是:
1.了解组件,详细了解组件包含什么样的接口和方法;
建议使用OleView.exe程序来详细了解组件包含什么样的接口和方法。
找不到,Dcomcnfg.exe也行。
引入接口
通过#import指令引入接口,例如:
#import“ABCDEFG.DLL” named_guids raw_interfaces_only no_namespace
2.初始化
调用CoInitialize()或CoInitlaizeEx()来初始化COM运行环境,例如:
CoInitialize(0);
获取接口
根据第一步了解的知识,在初始化环境后,可以获取接口了,例如:
IMyObject* obj = NULL; // 假定接口是IMyObject
// 返回值为HRESULT类型的,典型地,S_OK(0)表示成功,E_FAIL表示失败,还有其它的失败值
HRESULT hr = CoCreateInst ance(__uuidof(MyObject), NULL, CLSCTX_ALL, __uuido f(IMyObject), (v oid **)&obj);
if ( SUCCEEDED(hr) ) // 或者if ( !FAILEd(hr) )
{
…..利用接口作些事
//最后释放接口
IMyObject->Release();
}
3.方法调用
根据第一步了解的知识,调用接口的方法做某些事,例如:
HRESULT hr= obj->Method(arg1, arg2); // 方法都返回HRESULT类型的值
if ( SUCCEEDED(hr) )
{
// 调用成功,作其它事
}
注意事项
使用COM组件,特别注意方法的参数类型,如BSTR,SAFEARRAY,VARIANT之类,如果有用到这些类型,请仔细参阅有关这些类型说明的资料。
4.结束
接口使用结束后,需要释放COM环境,如下:
CoUninitialize();。