vc2005中DLL调用错误分析
2013-06-25 17:30
489 查看
载入DLL文件:
HMODULE hm hm=LoadLibrary( DLL PATH );
载入成功过后,获得相应函数的地址:
函数指针=GetProcAddress(hm,"函数名");
释放DLL文件:
FreeLibrary(hm);
上边是DLL调用的所有流程.
首先载入DLL,然后获得相应函数的指针,然后就可以后续操作了.
这样,问题来了:
问题1:
GetProcAddress,返回的函数指针没有类型,需要你包含相应的头文件,并强制转换为相应的函数指针,形如:
函数指针=(函数指针类型)GetProcAddress(hm,"函数名");问题2: 如果返回的是指向某一个DLL内部类对象的指针,就需要特别注意.如果外部申明的类指针的原型与DLL内部类的原型不一样,就会发生诡异的现象,调用A对象,却跑到了B对象那,例如:DLL内部的类定义为:
具体DLL载入与类对象指针获取省略, 假定获得对象指针ptr,
而外部对ptr的定义是基于这样的类:
在你使用如果得操作的时候: ptr->task2();实际上,指针指向的是task1(),尽管外部的定义没有task1,但ptr此时的指针式指向dll内部的,内部的dll定义中是有task1的,外部的调用解释道汇编语言,只是ptr对应dll内部对象的起始指针,而相应函数的调用,只是当前地址的偏移. 得出的结论: dll 调用时,相应的class类型和函数类型的定义必须保持一致.由此推导:相应的struct union等结构也应该保持一致.
阅读(668) | 评论(0) | 转发(0) |
0
上一篇:c++中string与int之间相互转换
下一篇:Boost学习之正则表达式--regex
相关热门文章
Windows下 webrtc voice engin...
www.ub8.cm 76、时时彩转15选5...
U盘安装Debian教程
php5.4.16 安装出现 error: ‘...
用好WinXP自身的功能,赤手空...
10种启动故障解决方法(转)...
关于自动弹出网页的解决方法...
Auto CAD 2007中文版 迅雷免费...
出现“high definition audio...
全国计算机一级考试试题...
MQ 服务器错误代码2035
bat脚本设置dns
点击记录常用的windows命令...
Win7下共享网络连接至WLAN的批...
WinProc窗口过程定义函数-【学...
给主人留下些什么吧!~~
评论热议
HMODULE hm hm=LoadLibrary( DLL PATH );
载入成功过后,获得相应函数的地址:
函数指针=GetProcAddress(hm,"函数名");
释放DLL文件:
FreeLibrary(hm);
上边是DLL调用的所有流程.
首先载入DLL,然后获得相应函数的指针,然后就可以后续操作了.
这样,问题来了:
问题1:
GetProcAddress,返回的函数指针没有类型,需要你包含相应的头文件,并强制转换为相应的函数指针,形如:
函数指针=(函数指针类型)GetProcAddress(hm,"函数名");问题2: 如果返回的是指向某一个DLL内部类对象的指针,就需要特别注意.如果外部申明的类指针的原型与DLL内部类的原型不一样,就会发生诡异的现象,调用A对象,却跑到了B对象那,例如:DLL内部的类定义为:
class dll { public: dll(dll** ptr) { *ptr=this; } void task1(){}; void task2(){}; void task3(){}; } |
而外部对ptr的定义是基于这样的类:
class dll { public: dll(dll** ptr) { *ptr=this; } void task2(){}; //task1被去掉 void task3(){}; } |
阅读(668) | 评论(0) | 转发(0) |
0
上一篇:c++中string与int之间相互转换
下一篇:Boost学习之正则表达式--regex
相关热门文章
Windows下 webrtc voice engin...
www.ub8.cm 76、时时彩转15选5...
U盘安装Debian教程
php5.4.16 安装出现 error: ‘...
用好WinXP自身的功能,赤手空...
10种启动故障解决方法(转)...
关于自动弹出网页的解决方法...
Auto CAD 2007中文版 迅雷免费...
出现“high definition audio...
全国计算机一级考试试题...
MQ 服务器错误代码2035
bat脚本设置dns
点击记录常用的windows命令...
Win7下共享网络连接至WLAN的批...
WinProc窗口过程定义函数-【学...
给主人留下些什么吧!~~
评论热议
相关文章推荐
- VS或VC调用matlab程序dll路径配置及错误分析
- VC6调用VC2005编译生成的lib/dll库出现“unresolved external symbol "__declspec(dllimport) int __cdecl”错误的原因
- 用VC写DLL中"error LNK2005: _DllMain@12 already defined"的错误
- vc++2005环境中静态调用DLL(隐式)
- VC++ 调用DLL的时候,总是出现Link1029的错误
- 用VC写DLL中"error LNK2005: _DllMain@12 already defined"的错误
- VC++编译错误: Nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12已经在dllmain.obj 中定义
- 用VC写DLL中"error LNK2005: _DllMain@12 already defined"的错误
- VB.NET(2005)中关于dll调用的错误信息(转)
- VC编译错误: Nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12已经在dllmain.obj 中定义
- VB.NET(2005)中关于dll调用的错误信息(转)
- vc2005 调用c#dll
- vc程序调用别人的dll报错的原因分析
- VC编译错误: Nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12已经在dllmain.obj 中定义
- 用VC写DLL中"error LNK2005: _DllMain@12 already defined"的错误
- 用VC写DLL中"error LNK2005: _DllMain@12 already defined"的错误
- 在ASP 调用 VB.net 编写的dll 出错 提示:Microsoft VBScript 运行时错误 错误 '800a01ad' ActiveX 部件不能创建对象
- VC编译错误:msvcrtd.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class typ
- VC中使用动态链接库DLL:静态调用和动态调用
- vc调用vb DLL方法