首页
社区
课程
招聘
[旧帖] DLL动态加载中的问题 0.00雪花
发表于: 2011-4-16 16:45 1582

[旧帖] DLL动态加载中的问题 0.00雪花

2011-4-16 16:45
1582

DLL的动态加载:[/B]
(我是Windows程序设计的初学者,在使用DLL的时候出了点问题,望大家能够来踩踩,指点个一招半式,先在在片头谢谢了大家了)


DLL 使用时,如果要由用户程序来加载,使用的就是动态加载DLL:
   书中写的是动态加载DLL就是使用WIN32 API中的LoadLibrary()进行DLL的加载
   然后用GetProcAddress()来获取DLL中指定的导出函数的入口地址。
   最后,当不再使用此DLL的时候,用FreeLibrary()来释放DLL的地址空间。
////////////////////////////////////////////////////////////////////////////////////////////////
我是刚学DLL这部分内容,写了个比较简单的DLL,并使用此DLL,以下是使用DLL中导出函数的
程序代码:
/////////////////////////////////////////
//  ×××.c
/////////////////////////////////////////
//  运行时出错:ESP问题
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#define LEAN_WIN32_AND_MEAN
HMODULE hModuleDLL;   

void main(int argc,char *argv[])
{  BOOL bIsFree;  
  FARPROC lpDLLfun;
  printf("加载DLL\n");
  hModuleDLL=LoadLibrary("dllLibry.dll");
  if(hModuleDLL!=NULL)
    printf("Load DLL成功!\n");
  else
  {
    printf("Load DLL 失败!\n");
    exit(0);
  }

  
  lpDLLfun=GetProcAddress(hModuleDLL,"fun2"); 
  if(lpDLLfun!=NULL)
  {  printf("使用导出函数入口地址进DLL中的调用\n");
    (*lpDLLfun)(0,0);
  
    // 参数没错
    printf("DLL使用成功!\n");
  }
  else
  {  printf("DLL使用失败!\n");
    printf("lpDLLfun=%d\n",lpDLLfun);
  }
  bIsFree=FreeLibrary(hModuleDLL);
  if(bIsFree)
    printf("DLL释放成功!\n");
    
}

  
程序中fun2()是我的dllLibry.dll中的函数,此程序能通过编译和连接(使用的是VC++6.0),但
在运行的时候,出了以下图示错误,望高手能够指点(最好详细点,谢谢!)

////////////////////////////////////////////////////////////////////
错误信息:
Debug   Error!
Program:F:\Debug\DLoadDLL.exe
Module:
File:i386\chkesp.c
Line:42

The value of ESP was not properly saved across a  function call.
This is usually a result of calling a function declared  with one calling 
convention with a function pointer declared with a different calling convertion.

(Press Retry to debug the application)
//////////////////////////////////////////////////////////////

这个错误中有个ESP寄存器,我估计是和堆栈有关的错误,查了好多有关这个错误的描述,但始终没弄清楚具体错误在哪里和出错的原因,望看此贴的能够给我讲哈...
此外,顺便能讲讲“堆栈平衡“。
先谢谢大家了!

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
DLL源码看看
2011-4-16 17:02
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
DLL中的源码没什么问题
我在里面加了这两句:

typedef BOOL  (_cdecl *FARPROC)(int x,int y);  (1)
....
lpDLLfun=(FARPROC)GetProcAddress("****.dll","fun1");
后用lpDLLfun调用函数

(*lpDLLfun)=fun1(0,0);

就加了这几句(网上搜的),编译连接后就不会跳出那错误信息了..

但小弟我还是不明白上面的第(1)句到底什么意思,望大牛们给我讲讲,谢谢!\n
2011-4-18 17:44
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4

好不容易发到了看雪上,都说看雪很牛,问题虽小,怎么就没人回帖了呢,看来下次应该在百度上发帖~
2011-5-23 17:31
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你的 dll 中的函数原型大概是这个样子吧 fun2(int, int)。但是你看看 FARPROC 的定义:typedef INT_PTR (FAR WINAPI *FARPROC)(); 它是一个不带参数的函数指针,你调用它的时候带了参数 (*proc)(0, 0),那肯定要出错的。

至于你说的那个 (1),是个函数指针,需要和你 dll 中的函数定义保持一致。
2011-5-24 10:01
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
LZ,先把帖子内容整理整理,字体颜色啊乱七八糟的。
这个问题象调用约定的问题,__cdecl, __stdcall之类的,所以导致了栈的不平衡。
2011-5-24 17:13
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
第一句是声明函数原型,可以把这句里的调用约定删去,然后在下面调用函数的时候把*号去掉,你调用的时候与函数 不匹配,前面老鸟说过的!
2012-3-26 09:36
0
游客
登录 | 注册 方可回帖
返回
//