DLL的隐式加载和显式加载

来源:互联网 发布:购买备案域名可以用吗? 编辑:程序博客网 时间:2024/06/06 15:51

这几天一直在弄win32下的DLL,遇到了不少问题,现在将几个主要的写一下。

隐式加载:

       编写DLL自身代码的时候问题不大,在这个DLL中的一个导出变量g_nResult和一个导出函数Add。但在编写测试程序的时候则碰到了不少的问题,最开始我的DLL导出变量和函数用的都是默认的堆栈调用方式__cdecl,但每次加载DLL的时候都有如下错误:

                           error LNK2001: 无法解析的外部符号 __imp__Add

                           (导出函数名为Add)

       最后无奈的将其堆栈调用方式改成了__stdcall,改完之后就可以加载成功了。至于内部的具体原因尚未弄清楚。不太了解这两者的区别。

 

显式加载:

       在显式加载测试程序中,如用上面所生成的DLL,则LoadLibrary能够成功加载DLL,但当我调用GetProcAddress(hInstDll , "Add")时就出现了问题,用GetLastError检测时函数返加127,就是因为没有找到函数Add,于是用Depends工具查看该DLL,发现Add的函数名变成了_Add@8,这个问题以前遇到过,用__stdcall调用时,编译时会将其名字改成这个样子。

       于是重新调用GetProcAddress(hInstDll , "_Add@8"),发现还真的是可以找到这个函数,但随后又出现了新的问题,就是在调用Add函数的时候出现调试中断,内存访问出现了冲突,但如果继续执行还是可以往下走,并能返回正确的值,最反在函数结束的时候又出现了这样的一次调试中断,个中原因不太明白。于是再改,这一次是将DLL导出变量和函数的栈调用方式从__stdcall改成默认的__cdecl,并重新用GetProcAddress(hInstDll , "Add")调 用,结果加载成功了。

 

       如此看的话隐式调用和显式调用就出现了矛盾,同一个DLL就不能既被隐式调用又被显式调用了,这里面的问题还需要去慢慢琢磨。

原创粉丝点击