载入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等结构也应该保持一致.
阅读(2425) | 评论(0) | 转发(0) |