您的位置:首页 > 其它

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内部的类定义为:
class dll

{

public:

dll(dll** ptr)

{

*ptr=this;

}

void task1(){};

void task2(){};

void task3(){};

}
具体DLL载入与类对象指针获取省略, 假定获得对象指针ptr,
而外部对ptr的定义是基于这样的类:
class dll

{

public:

dll(dll** ptr)

{

*ptr=this;

}

void task2(){}; //task1被去掉

void task3(){};

}
在你使用如果得操作的时候: 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窗口过程定义函数-【学...

给主人留下些什么吧!~~

评论热议
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: