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就不能既被隐式调用又被显式调用了,这里面的问题还需要去慢慢琢磨。
- DLL的隐式加载和显式加载
- 动态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运行时加载)
- 动态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运行时加载)
- 动态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运行时加载)
- 动态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运行时加载)
- dll的显示加载和隐式加载
- DLL动态库的创建,隐式加载和显式加载
- 显式加载DLL
- 显式加载dll
- DLL显式加载与隐式加载
- c++显式加载dll并使用DLL的类
- c++显式加载dll并使用DLL的类
- c++显式加载dll并使用DLL的类
- 显式加载DLL模块
- 显式加载DLL模块
- 再次显式加载DLL
- DLL的静态加载和动态加载
- 动态加载DLL和静态加载DLL的步骤
- C语言小问题
- ubuntu彻底解决wine的中文问题
- The love of programmer
- 面向接口编程详解——思想基础
- 解决【dell vostro 1014】型号机器无法关机的问题
- DLL的隐式加载和显式加载
- 内核定时器
- Fedora 15 缺少libc静态库解决方法
- Linux内核线程编程方法(经典)
- Flex 规范
- socket写数据导致进程跨掉
- 打印自己的c代码
- texlive 中文字体bug解决方法
- 土豆炖牛肉