1,系统怎么区分一个dll是不是需要隐式连接,我新建一个mfc工程,系统就隐式连接了很多dll,比如kernel32.dll。那我自己编写的dll,我怎么知道系统是不是给我隐式连接了呢?
2,看书上说,隐式连接需要三个东西,一个.h文件,一个.lib文件,一个dll文件。那么系统自带的dll的.h文件和.lib文件都存放在哪里呢?比如说kernel32.dll的.h文件是什么呢,存放在哪里呢,它的.lib文件又是什么呢,又存放在哪里呢?非常感谢各位高手不辞吝教!!

解决方案 »

  1.   

    kernal32.dll, user32.dll gdi32.dll是windows系统核心,你不用操心了。 其他的dll一般来讲如果你在工程中不显式引入,是不会连接的。
      

  2.   

    1,系统怎么区分一个dll是不是需要隐式连接,我新建一个mfc工程,系统就隐式连接了很多dll,比如kernel32.dll。那我自己编写的dll,我怎么知道系统是不是给我隐式连接了呢?
    ——注意,是链接。编译器不区分所要链接的库是系统的,还是用户的,它只是按它的配置路径去查找所要链接的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,头文件可能有多个。
      

  3.   

    你的回答非常好。我还有两个疑问,希望不辞吝教!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呀,万分感谢!
      

  4.   


    不好意思,我本想说您的帖子对我有用的,不小心点错了,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呀,万分感谢!
      

  5.   


    程序 当运行时,遇到外部接口 才会去查找链接。  通过接口的不同来区分不同的dll
      

  6.   

    就是说只有我在程序中调用了某个dll导出的函数时才会引起程序加载这个dll吗?但是我很明确的知道程序在运行之前就已经加载好了所需的dll,而不是在运行到某个语句是才加载的呀!O(∩_∩)O谢谢
      

  7.   

    你的回答非常好。我还有两个疑问,希望不辞吝教!O(∩_∩)O谢谢
    (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。
      

  8.   

    程序 当运行时,遇到外部接口 才会去查找链接。 通过接口的不同来区分不同的dll就是说只有我在程序中调用了某个dll导出的函数时才会引起程序加载这个dll吗?但是我很明确的知道程序在运行之前就已经加载好了所需的dll,而不是在运行到某个语句是才加载的呀!O(∩_∩)O谢谢
    =================
    这个就是隐式调用DLL与显式调用DLL之间的区别了。
    隐式调用DLL时,链接时并不将DLL中的代码加入到EXE中,但是它将DLL的信息和引用DLL中的函数信息加入到EXE文件的导入表中,在EXE文件运行时,在主模块加载之前,先根据这个导入表将相关的DLL先加载进来,如果加载失败,那么EXE加载过程中断,会初始化失败的错。也就是说,隐式调用DLL时,在加载EXE之前,先加载隐式调用的DLL,然后才加载EXE。显式调用是用LoadLibrary来加载DLL的,所以,只有执行到这一步时才会真正加载DLL。
      

  9.   

    重新答一下你原来的两个问题
    1,系统怎么区分一个dll是不是需要隐式连接,我新建一个mfc工程,系统就隐式连接了很多dll,比如kernel32.dll。那我自己编写的dll,我怎么知道系统是不是给我隐式连接了呢?
    ===============================
    这个上面已经说过了,工程属性中有相关的地方记录了工程引用的LIB文件(VC6与VS2005的菜单不同),链接进凡是你工程中没有实现的函数它会在上面这些LIB文件中去找,找到了,就链接,找不到就会报链接出错。
    当然,你也可以在程序中用#pragma comment(lib,"*.lib")来说明你想引用的LIB文件,这个同样也是隐式调用DLL。你自己编写的DLL,你要想隐式调用它的话,方法也是上面两种,一种是在工程属性的相关位置上加入相关的LIB文件,一种就是用#pragma comment(lib,"*.lib"),要不然,是不会给你隐式链接的。
      

  10.   

    受益无穷呀,非常感谢!!在请教一个问题!
    既然kernel32.dll所对应的.h文件和.lib文件都是在Visual Studio的目录下,那意思就是如果我的电脑不安装Visual Studio,那么kernel32.dll这个库根本不能用,因为没有.h文件和.lib文件的支持,但是为什么在安装Visual Studio之前我的电脑上的桌面应用程序(桌面应用程序基本都会用到kernel32.dll这个库的)都可以正常运行呀,求解!