动态调用DLL的问题呀

pengjzp619 2002-09-17 05:03:33
我如下动态调用一DLL时
库里的程序能正确执行
Command里的命令是
MessageBox(0,"A","dll call",0);
但我一点击确定后
程序出错,出错代码为:
Debug Error!

Program:............
Module:
File:i386\chkesp.c
Line:42

The value of ESP was not properly saved across a function all, the is
usually a result of calling a function declared with one calling convention with a function pointer declared with a different calloing converntion.
///////////////////////////////////////////////////
程序代码如下:
HMODULE fp;
typedef int (*PROC1)(int);
if(1)
{
fp = LoadLibrary("c.dll");

PROC1 proc = (PROC1)GetProcAddress(fp, "Command");
int a = (*proc)(0);
}

FreeLibrary(fp);

////////////////////////
程序代码如下时不会出任何的错误:
HMODULE fp;
typedef int (*PROC1)();
if(1)
{
fp = LoadLibrary("c.dll");

PROC1 proc = (PROC1)GetProcAddress(fp, "Command");
int a = (*proc)();
}

FreeLibrary(fp);
/////////////////////////////////////////
WHYWHYWHYWHYWHYWHYWHYWHYWHYWHYWHYWHYWHYWHYWHYWHYWHY
...全文
22 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengjzp619 2002-09-23
  • 打赏
  • 举报
回复
多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢

各位大哥多谢了
小弟实在是感激不尽呀!!!!!

版主
可以结帖了呀
我想多送些给各位大哥呀
布学无数 2002-09-22
  • 打赏
  • 举报
回复
// DLL.CPP
int WINAPI Command(int a)
{
switch(a)
{
case 0:
MessageBox(0,"B","dll call",0);
default:
MessageBox(0,"A","dll call",0);
}

return a;
}

//DLL.H
int WINAPI Command(int);

//DLL.DEF
EXPORTS
Command @1


//CALL.CPP
HMODULE hModule;
typedef int (WINAPI * LPCOMMAND)(int);

if(1)
{
hModule = LoadLibrary("Dll.dll");
LPCOMAND Command;
Command = (LPCOMMAND)GetProcAddress(hModule,"Command");
int iResult = Command(0);
FreeLibrary(hModule);
}

照这个格式写写看吧,会发现奇迹的:)
siphonelee 2002-09-22
  • 打赏
  • 举报
回复
dll中:
__declspec( dllexport ) _stdcall int Comand(int a)
{
if(a)
{
MessageBox(0,"A","dll call",0);
}
else
{
MessageBox(0,"B","dll call",0);
}
return 0;
}

调用程序里面声明:
typedef int (__stdcall *PROC1)(int);
oldworm 2002-09-22
  • 打赏
  • 举报
回复
注意:dll也要如此声明,并Rebuild All,还有一个细节要注意,字节对齐方式也要一致。
oldworm 2002-09-22
  • 打赏
  • 举报
回复
没有参数的时候没有问题,有参数的时候有问题,一定是参数调用规则不对
你用__stdcall声明dll中的函数,并重新编译,外部调用的时候也类似处理,肯定ok
pengjzp619 2002-09-22
  • 打赏
  • 举报
回复
唉还是一样呀
why
为什么没有任何参数时就没有任何问题
一加参数就出了问题呢?
afc 2002-09-21
  • 打赏
  • 举报
回复
再试试typedef int (__cdecl *PROC1)(int);
pengjzp619 2002-09-20
  • 打赏
  • 举报
回复
还是一样的错误呀??????

是这样的:
我有三个dll,A、B、C这三个dll里的函数及接口参数都是一样的command(int)
A里面的command执行MessageBox(0,"A","dll call",0);
B里面的command执行MessageBox(0,"B","dll call",0);
C里面的command根椐int,如果是0就调用A.dll,如果是1就调用B.dll
我在D程序里面动态调用C这个动态库,让C根椐参数分别去调用A.dll或B.dll

各位大哥有什么高招没有呀
小弟急呀
多谢!!!!!!!!!!!!!!!!
afc 2002-09-20
  • 打赏
  • 举报
回复
typedef int (__stdcall *PROC1)(int);试一下
Alain_Delone 2002-09-18
  • 打赏
  • 举报
回复
是不是函数指针和实际函数类型不对应?
pengjzp619 2002-09-18
  • 打赏
  • 举报
回复
那为什么没有参数时能正确执行呢?
就只有上面一条语句
pengjzp619 2002-09-18
  • 打赏
  • 举报
回复
dll里的command命令如下:
int Comand(int a)
{
if(a)
{
MessageBox(0,"A","dll call",0);
}
else
{
MessageBox(0,"B","dll call",0);
}

return 0;
}
victorlee_lq 2002-09-17
  • 打赏
  • 举报
回复
要看一下您的DLL是怎么写的,否则没有办法修改

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧