用VC向导生成动态库工程时,输出中可能出现如下三种情况:
1、只有lib文件;
2、只有dll文件;
3、同时有上述两种文件。
如果是第一种,应该是静态库,如果是第二种,应该是“纯种”的动态库,如果是第三种哪?还有这几种库加载方式有何区别?

解决方案 »

  1.   

    第二种我还真没见过... 可以只生成独dll?
    同时生成.lib和.dll,那么lib是dll的导入库,提供链接时需要的符号再说加载方式...
    静态库.lib是不需要(运行时)加载的,因为代码已经在链接时合到目标可执行文件去了
    第二种 -- if it does exist...就要(运行时)动态加载了, LoadLibrary
    第三种,"一般"是(运行时)静态加载,即在程序启动时由系统帮你LoadLibrary, 退出时FreeLibrary
      

  2.   

    如果lib是dll的导入库,在链接时用到,那程序运行时系统就自动加载Dll了,这时用户就不需要Loadlibrary了,直接用dll中提供的函数就可以了,是这样吗?
      

  3.   

    那什么情况用户可以自己在程序运行时加载dll哪?
      

  4.   

    都可以啊,只要有dll就可以用LoadLibrary来加载
    只不过要注意导出的符号名就是了
      

  5.   

    如果有DLL又使用lib文件,那么应该就是链接时动态加载了,这时程序运行时系统会自动加载dll,如何在运行时动态加载哪?
      

  6.   

    链接时没有加载的说法哦...
    链接时只是相当于把dll中的符号和位置告诉目标代码,dll本身一样是运行时加载系统自动加载以后dll已经map到你的空间了,所以是不用加载, 但是你一样可以使用LoadLibrary得到这个dll的句柄,这个时候跟调用GetModuleHandle是一样的,不同之处在于LoadLibrary调用之后要FreeLibrary一下,给referrence count减1
      

  7.   

    jasonshark(没暑假了...) 讲得比较清楚了。
      

  8.   

    讲错了,应该是加载时动态链接,还有就是运行时动态链接,也就是用LoadLibrary方法。但这两种方法dll都已经map到内存里了,也就是说dll里的函数已经起作用了,对吧。
      

  9.   

    加载时动态链接...这个说法还是有些欠妥,不过你明白整个意思了就好,呵呵是的, 程序启动时自动加载的,dll都已经map到内存里了
      

  10.   

    你是指在DllMain里面返回FALSE? 
    但是要注意如果是LoadLibraryEx带DONT_RESOLVE_DLL_REFERENCES参数的话是不会调用你的DllMain的
      

  11.   

    不是啊,既然程序运行时就加载我的dll了,我可以在其中任意一个函数类去访问注册表,如果不成功就报错。