1,系统怎么区分一个dll是不是需要隐式连接,我新建一个mfc工程,系统就隐式连接了很多dll,比如kernel32.dll。那我自己编写的dll,我怎么知道系统是不是给我隐式连接了呢?
2,看书上说,隐式连接需要三个东西,一个.h文件,一个.lib文件,一个dll文件。那么系统自带的dll的.h文件和.lib文件都存放在哪里呢?比如说kernel32.dll的.h文件是什么呢,存放在哪里呢,它的.lib文件又是什么呢,又存放在哪里呢?非常感谢各位高手不辞吝教!!
2,看书上说,隐式连接需要三个东西,一个.h文件,一个.lib文件,一个dll文件。那么系统自带的dll的.h文件和.lib文件都存放在哪里呢?比如说kernel32.dll的.h文件是什么呢,存放在哪里呢,它的.lib文件又是什么呢,又存放在哪里呢?非常感谢各位高手不辞吝教!!
解决方案 »
- 十万火急,请教ffmpeg解码h261的问题。
- 自己写了个字符串异或函数,有个问题卡住了
- 急问 CFile文件打开的问题
- VB转VC,在MFC的基于对话框和SDI、MDI中在视类中声名了一个CButton m_btn,如何显示出来呀!(在基于MFC的窗体上)
- 请问,如何判断一个IP地址的格式?
- 关于direct show配置的问题
- 急:高分求购实现浏览器功能的VC源代码.
- 求大神帮忙:0x00000000 处有未经处理的异常: 0xC0000005: 在位置 0x0000000000000000 发生访问冲突
- Ycstdafx.h
- 各位大侠:当收到网络信息时,如果窗口处于最小化,或不是当前活动窗口时,如何使该窗口在任务栏里闪烁?
- 有一个cmd怎么在vc中调用?
- 搞定了这些,分全是你的!
——注意,是链接。编译器不区分所要链接的库是系统的,还是用户的,它只是按它的配置路径去查找所要链接的lib文件(h文件则是在编译时使用,同样是按配置的路径查找头文件),只有到运行的时候,程序才去找dll文件(如果是显式加载,则在调用加载函数LoadLibrary的时候,才查找dll文件)。你只有告诉编译器,你要链接某个lib文件时,编译器才会链接它。
2,看书上说,隐式连接需要三个东西,一个.h文件,一个.lib文件,一个dll文件。那么系统自带的dll的.h文件和.lib文件都存放在哪里呢?比如说kernel32.dll的.h文件是什么呢,存放在哪里呢,它的.lib文件又是什么呢,又存放在哪里呢?
——VC的头文件在“C:\Program Files\Microsoft Visual Studio\VC98\Include”下面;lib文件在“C:\Program Files\Microsoft Visual Studio\VC98\Lib”下面;kernel32.dll对应KERNEL32.LIB,头文件可能有多个。
(1)既然kernel32.dll所对应的.h文件和.lib文件都是在Visual Studio的目录下,那意思就是如果我的电脑不安装Visual Studio,那么kernel32.dll这个库根本不能用,因为没有.h文件和.lib文件的支持,但是为什么在安装Visual Studio之前我的电脑上的桌面应用程序(桌面应用程序基本都会用到kernel32.dll这个库的)都可以正常运行呀,求解!
(2)恕我愚钝,我还是不明白什么情况下程序会隐式链接一个dll,比如我现在有两个dll,一个a.dll和一个b.dll,我需要在代码中怎么体现,才能告诉编译器我需要编译器隐式链接a.dll,而不需要隐式链接b.dll呀,万分感谢!
不好意思,我本想说您的帖子对我有用的,不小心点错了,O(∩_∩)O~
你的回答非常好。我还有两个疑问,希望不辞吝教!O(∩_∩)O谢谢
(1)既然kernel32.dll所对应的.h文件和.lib文件都是在Visual Studio的目录下,那意思就是如果我的电脑不安装Visual Studio,那么kernel32.dll这个库根本不能用,因为没有.h文件和.lib文件的支持,但是为什么在安装Visual Studio之前我的电脑上的桌面应用程序(桌面应用程序基本都会用到kernel32.dll这个库的)都可以正常运行呀,求解!
(2)恕我愚钝,我还是不明白什么情况下程序会隐式链接一个dll,比如我现在有两个dll,一个a.dll和一个b.dll,我需要在代码中怎么体现,才能告诉编译器我需要编译器隐式链接a.dll,而不需要隐式链接b.dll呀,万分感谢!
程序 当运行时,遇到外部接口 才会去查找链接。 通过接口的不同来区分不同的dll
(1)既然kernel32.dll所对应的.h文件和.lib文件都是在Visual Studio的目录下,那意思就是如果我的电脑不安装Visual Studio,那么kernel32.dll这个库根本不能用,因为没有.h文件和.lib文件的支持,但是为什么在安装Visual Studio之前我的电脑上的桌面应用程序(桌面应用程序基本都会用到kernel32.dll这个库的)都可以正常运行呀,求解!
============================
你弄错了一个问题,h文件和LIB文件只是在编译和链接时才需要,确切的说,H文件是编译时要用的,LIB文件是链接时要用到的,而真正的代码是在DLL中,在执行时只要有DLL文件就行了,不管是隐式调用还是显式调用都是这样,其实显式的调用DLL,根本就不用LIB文件。(2)恕我愚钝,我还是不明白什么情况下程序会隐式链接一个dll,比如我现在有两个dll,一个a.dll和一个b.dll,我需要在代码中怎么体现,才能告诉编译器我需要编译器隐式链接a.dll,而不需要隐式链接b.dll呀,万分感谢!
=====================
隐式链接DLL和显式链接实际上取决于编程者自己,如果你想隐式链接一个DLL,比如kernel32.dll一般都是隐式链接的,在工程的属性中的链接选项中的输入对话框的“附加依赖项”会加入一些LIB文件,一般的Win32工程会加入
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
等LIB文件,当然你也可以自己手工加入你自己想要的LIB文件(这里是以VS2005为例的,VC6也是同样的方式,但是菜单位置应该不同)
当链接时,VS会在上面的位置中查找LIB文件,当你的代码中引用了一个某没有实现的函数,它会在上面LIB文件中去查找,然后进行链接。这样就形成了隐式调用DLL。
=================
这个就是隐式调用DLL与显式调用DLL之间的区别了。
隐式调用DLL时,链接时并不将DLL中的代码加入到EXE中,但是它将DLL的信息和引用DLL中的函数信息加入到EXE文件的导入表中,在EXE文件运行时,在主模块加载之前,先根据这个导入表将相关的DLL先加载进来,如果加载失败,那么EXE加载过程中断,会初始化失败的错。也就是说,隐式调用DLL时,在加载EXE之前,先加载隐式调用的DLL,然后才加载EXE。显式调用是用LoadLibrary来加载DLL的,所以,只有执行到这一步时才会真正加载DLL。
1,系统怎么区分一个dll是不是需要隐式连接,我新建一个mfc工程,系统就隐式连接了很多dll,比如kernel32.dll。那我自己编写的dll,我怎么知道系统是不是给我隐式连接了呢?
===============================
这个上面已经说过了,工程属性中有相关的地方记录了工程引用的LIB文件(VC6与VS2005的菜单不同),链接进凡是你工程中没有实现的函数它会在上面这些LIB文件中去找,找到了,就链接,找不到就会报链接出错。
当然,你也可以在程序中用#pragma comment(lib,"*.lib")来说明你想引用的LIB文件,这个同样也是隐式调用DLL。你自己编写的DLL,你要想隐式调用它的话,方法也是上面两种,一种是在工程属性的相关位置上加入相关的LIB文件,一种就是用#pragma comment(lib,"*.lib"),要不然,是不会给你隐式链接的。
既然kernel32.dll所对应的.h文件和.lib文件都是在Visual Studio的目录下,那意思就是如果我的电脑不安装Visual Studio,那么kernel32.dll这个库根本不能用,因为没有.h文件和.lib文件的支持,但是为什么在安装Visual Studio之前我的电脑上的桌面应用程序(桌面应用程序基本都会用到kernel32.dll这个库的)都可以正常运行呀,求解!