Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1643958
  • 博文数量: 245
  • 博客积分: 10378
  • 博客等级: 上将
  • 技术积分: 2571
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-27 08:19
文章分类

全部博文(245)

文章存档

2013年(4)

2012年(8)

2011年(13)

2010年(68)

2009年(152)

分类: WINDOWS

2010-09-16 10:31:40

载入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) |
给主人留下些什么吧!~~