是这样的,我在调一个写好的工程,这个工程在debug模式下运行时会开一个控制台串口输出调试数据。这个控制台使用dll做的,叫Console.dll,用的是隐式连接(在依赖项里添了Console.lib,并且没有使用loadlibrary)。他在Console.cpp里写了“ConsoleTrace _classOTrace;”,ConsoleTrace是控制台类,即运行了实例化,于是就打开了一个控制台窗口。通过调试,我发现运行了__DllMainCRTStartup,但是我自己做了一个实验,隐式连接没有反应,必须loadlibrary才能实现他的这个效果。我想问一下,隐式连接能够运行__DllMainCRTStartup函数吗?为什么我自己做就不行,请教高手我是不是遗漏了什么东西?

解决方案 »

  1.   

    显示链接和隐式链接区别仅在于加载的时机,初始化被DLL的步骤是一样的。如果你没有更改DLL入口函数,用VS编译出来的默认就是__DllMainCRTStartup,肯定会被调用。
    检查你的DLL链接选项,/ENTRY是否指定了其他函数,或者如果你使用2005之前的版本,确保你使用的是/MD或/MDd编译选项
      

  2.   

    __DllMainCRTStartup是缺省的入口点,隐私链接也会运行
      

  3.   

    隐式连接dll. exe内部运行时会自动显式load的. 跟你手动load一样了
      

  4.   


    厄,我试了一下,所有的选项都是默认的,也符合您说的条件,结果还是隐式链接无法运行__DllMainCRTStartup,我打开了crtdll,并在__DllMainCRTStartup打上了断点,显式链接可以进入,隐式链接无反应,区别只在于是否运行了HANDLE h = LoadLibrary(Console); ...,继续求教...
      

  5.   

    谢谢大家,发现问题了,隐式连接的时候,必须调用dll的一个导出函数,这样才能加载dll,只是包含头文件和pragma comment是不会加载dll的(output信息里都没有)。可以结贴散分了,哪位高手可以给个说法?谢谢!
      

  6.   

    这当然是的,只有用到了dll导出符号,才会在生成的exe中包含那个dll的导入目录,有导入目录才会加载那个dll
    你连接器中指定再多lib,如果没有用到里面的东西等于没加
    你去看看工程设置里面有多少导入库,你实际隐式连接的的dll又有多少