当我们想要在vc中调用一个DLL文件所提供的组件的时候怎么办?
第一种方法: 是使用.tlb.
假如我们想调用msxml4.dll中提供的组件来操作XML文件.
那么首先要调用#import "msxml4.dll",
然后你就可以使用msxml4.dll中提供的组件了,比如说
::CoInitialize(NULL);//初始化COM环境 一定要加 不要忘记!!!
MSXML2::IXMLDOMDocumentPtr pDoc;
MSXML2::IXMLDOMElementPtr xmlRoot;
//创建DOMDocument对象
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
if(!SUCCEEDED(hr))
{
MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
return ;
}
else
{
}
//根节点的名称为Book
//创建元素并添加到文档中
xmlRoot=pDoc->createElement((_bstr_t)"Book");
//设置属性
xmlRoot->setAttribute("id",(const char *)m_strId);
xmlRoot->Puttext((_bstr_t)(const char *)m_strAuthor);
pDoc->appendChild(xmlRoot);
MSXML2::IXMLDOMElementPtr pNode;
//添加“author”元素
pNode=pDoc->createElement((_bstr_t)"Author");
pNode->setAttribute("id",(const char *)m_strId);
pNode->Puttext((_bstr_t)(const char *)m_strAuthor);
xmlRoot->appendChild(pNode);
//添加“Title”元素
pNode=pDoc->createElement("Title");
pNode->Puttext((const char *)m_strTitle);
xmlRoot->appendChild(pNode);
//保存到文件
//如果不存在就建立,存在就覆盖
pDoc->save("d://he.xml");
重点:
1 #import "msxml4.dll"
这条语句的作用是产生.tlh和.tli文件.
你查看你的工程文件, 在编译后, 在debug或release文件夹中会产生两个文件msxml4.tlh, msxml4.tli.
在vc中打开它们可以看到, msxml4.tlh是头文件, 有各个接口类的定义, 而msxml4.tli是实现文件, 有接口类函数的代码.
我们在某些代码中可以看到这样的语句: #import "filename.tlb"
它的作用与#import "filename.dll"是一样的, 只是有的组件会提供单独的.tlb文件, 有的会把.tlb嵌入到.dll.(嵌入的方法是生成.tlb和.dll后, 将.tlb作为资源插入到dll中,再次生成
dll, .tlb就已经存在于.dll中了)
.tlb文件叫做类型库文件, 组件的创作者用MIDL编译器编译它的IDL文件产生的.
com的优点之一是跨语言, 既然要跨语言, 就是要用什么语言都能写COM, 而且写出来的东西什么语言都可以使用.
为了实现这个目的, COM使用了IDL语言来定义接口, MID把这个IDL文件编译后,生成一个.TLB文件, 在该文件中包括组件定义等等的信息.
当VC想要调用该组件的接口时, 使用#import "filename.tlb", VC编译器会解析该filename.tlb文件, 并在你的工程目录中生成对就的filename.tli 和 filename.tlh文件, 你可以在其中查找到接口名字. 然后就可以在程序中使用了.
第二种方法是使用组件的包装类.
当我们有了一个组件文件后(filename.dll), 在vc中有一个工具,可以为该组件生成一个包装类. 在vc中就可以使用这个包装类来生成对应的对象.