载入DLL文件:
具体DLL载入与类对象指针获取省略, 假定获得对象指针ptr,
在你使用如果得操作的时候: ptr->task2();实际上,指针指向的是task1(),尽管外部的定义没有task1,但ptr此时的指针式指向dll内部的,内部的dll定义中是有task1的,外部的调用解释道汇编语言,只是ptr对应dll内部对象的起始指针,而相应函数的调用,只是当前地址的偏移.
阅读(668) | 评论(0) | 转发(0) |
<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
HMODULE
hm
hm=LoadLibrary( DLL PATH );
载入成功过后,获得相应函数的地址:
函数指针=GetProcAddress(
hm,"函数名"
);
释放DLL文件:
FreeLibrary(hm);
上边是DLL调用的所有流程.
首先载入DLL,然后获得相应函数的指针,然后就可以后续操作了.
这样,问题来了:
问题1:
GetProcAddress,返回的函数指针没有类型,需要你包含相应的头文件,并强制转换为相应的函数指针,形如:
函数指针=(函数指针类型) GetProcAddress(hm,"函数名");
函数指针=(函数指针类型) GetProcAddress(hm,"函数名");
问题2:
如果返回的是指向某一个DLL内部类对象的指针,就需要特别注意.如果外部申明的类指针的原型与DLL内部类的原型不一样,就会发生诡异的现象,调用A对象,却跑到了B对象那,例如:
DLL内部的类定义为:
|
而外部对ptr的定义是基于这样的类:
|
得出的结论:
dll 调用时,相应的class类型和函数类型的定义必须保持一致.由此推导:相应的struct union等结构也应该保持一致.
相关热门文章
给主人留下些什么吧!~~
评论热议