请教tlb文件和lib文件的区别

gooore 2010-01-25 08:27:20
在下手抄了一个COM,不是用ATL做的,也没有写idl

编译之后不能注册,加载library失败。但是工程生成了lib文件,没有生成tlb文件。我一直理解的是这两个文件一样。

请教这两个文件有什么区别?

如果不用idl,怎样去给dll加library信息?

...全文
838 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
StrokeAce 2012-04-27
  • 打赏
  • 举报
回复
正解
[Quote=引用 5 楼 的回复:]
lib文件得看你是静态库还是动态库了,
如果是静态库,编译后所有的二进制文件都在LIB文件里
动态库的话,编译后的代码放在DLL中,LIB只是起个索引

TLB是组件服务的接口
而DLL包含了接口和实现
有些情况下,比如客户方需要远程调用,那么在客户机上部署dll是没有意义的,因为dll所需的环境在服务器上,而客户只需要dll里的接口定义部分,这个时候tlb就派上用场了……
[/Quote]
gooore 2010-01-26
  • 打赏
  • 举报
回复
是不是不导出自注册的两个函数,编译出来就是静态库?文件编译总会有lib和dll吧?

[Quote=引用 5 楼 zoulie 的回复:]
lib文件得看你是静态库还是动态库了,
如果是静态库,编译后所有的二进制文件都在LIB文件里
动态库的话,编译后的代码放在DLL中,LIB只是起个索引

TLB是组件服务的接口 
  而DLL包含了接口和实现 
  有些情况下,比如客户方需要远程调用,那么在客户机上部署dll是没有意义的,因为dll所需的环境在服务器上,而客户只需要dll里的接口定义部分,这个时候tlb就派上用场了 

[/Quote]
gooore 2010-01-25
  • 打赏
  • 举报
回复
如果直接import tlb,是不是和vb里面的添加引用一个意思?程序运行的时候会调用相关的dll?

import tlb和import dll是一回事吧?
zoulie 2010-01-25
  • 打赏
  • 举报
回复
lib文件得看你是静态库还是动态库了,
如果是静态库,编译后所有的二进制文件都在LIB文件里
动态库的话,编译后的代码放在DLL中,LIB只是起个索引

TLB是组件服务的接口
而DLL包含了接口和实现
有些情况下,比如客户方需要远程调用,那么在客户机上部署dll是没有意义的,因为dll所需的环境在服务器上,而客户只需要dll里的接口定义部分,这个时候tlb就派上用场了
gooore 2010-01-25
  • 打赏
  • 举报
回复
拜托啊,这些网上考下来的话我也查到啦。

请问下是不是这样的,

lib实际上就是组件的二进制代码,在编译的时候如果有需要用到就会被编译器调用。

tlb只包含了接口信息,编译后的 dll也会包含的一些接口信息,所以tlb不是必须的。

如果直接import tlb,是不是和vb里面的添加引用一个意思?程序运行的时候会调用相关的dll?
xwsn007 2010-01-25
  • 打赏
  • 举报
回复
再介绍一下DLL的概念:

动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。动态链接库文件的扩展名一般是dll,也有可能是drv、sys和fon,它和可执行文件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。

  动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。

  一般情况下,如果一个应用程序使用了动态链接库,Win32系统保证内存中只有DLL的一份复制品,这是通过内存映射文件实现的。DLL首先被调入Win32系统的全局堆栈,然后映射到调用这个DLL的进程地址空间。在Win32系统中,每个进程拥有自己的32位线性地址空间,如果一个DLL被多个进程调用,每个进程都会收到该DLL的一份映像。与16位Windows不同,在Win32中DLL可以看作是每个进程自己的代码。
xwsn007 2010-01-25
  • 打赏
  • 举报
回复

.lib是在你的程序编译连接的时候就连接的文件,因此你必须告知编译器连接的lib文件在那里。一般来说,与动态连接文件相对比,lib文件也被称为是静态连接库。当你把代码编译成这几种格式的文件时,在以后他们就不可能再被更改。如果你想使用lib文件,就必须:
1 包含一个对应的头文件告知编译器lib文件里面的具体内容
2 设置lib文件允许编译器去查找已经编译好的二进制代码

如果你想从你的代码分离一个dll文件出来代替静态连接库,仍然需要一个lib文件。这个lib文件将被连接到程序告诉操作系统在运行的时候你想用到什么dll文件,一般情况下,lib文件里有相应的dll文件的名字和一个指明dll输出函数入口的顺序表。如果不想用lib文件或者是没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress。
附注:
TLB是COM/ActiveX/Ole的类型信息,DLL中也可以包含,包含的就叫Active Library,只要支持MS的COM的东东都有TLB,ActiveX可以用工具import activeX library导出。
TLB是开发期的东东,可以作early binding前期bind,里面一般有IXXXX: COM interface这个只能用作early binding,说白了就是在程序编译时就知道接口函数在dll中的相对位置,调用起来当然快啦,但, 组件更新后,调用的程序就不一定能用的啦。IxxxDisp: COM dispatch interface这个是IDispatch 的子类,注意下函数有个disp id(声明的最后),这个是相对的id,使用接口时用这个相对id查一个dispatch table找到函数入口地址,
注: IxxxDisp调用是一次进程间交换数据就可以得到入口地址,进程间交换数据是很慢的一种操作IDispatch中有三个方法Invoke,GetDSOfNames.(忘了), 更过分,可以在之后用函数名查所有的id,invoke则是用id得到相对地址...这种应用很广的啦,比方VB,Delphi的Variant,ASP/IIS,
注:IDispatch要二次进程间交换
总结一下IDispatch,用IDispatch的叫late binding,用IxxxDisp的叫smart binding(不知是不是,中文智能调用,真不知哪智能了),用法不同,同时有上面两个接的dual interface。
xwsn007 2010-01-25
  • 打赏
  • 举报
回复
lib: dll导入库文件
tlb: com组件的类型库文件

3,245

社区成员

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

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