vc2005中DLL调用错误分析

载入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等结构也应该保持一致.

<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>
阅读(668) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值