首页
社区
课程
招聘
[求助]请教:在VC里我调用外部程序的DLL时,参数传递出现错误???
发表于: 2005-6-28 16:41 7175

[求助]请教:在VC里我调用外部程序的DLL时,参数传递出现错误???

2005-6-28 16:41
7175
E226 Extra parameter in call
我知道这个错误是因为调用外部DLL里的函数时,参数引起的
因为外部DLL的参数调用方法正确的是:int add(x)
但是我现在只能是int add()才能通过编译,不知道参数x怎么样才能让它通过??????

谢谢大家了,编程工具是VC和BCB

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 244
活跃值: (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
UPUPUPUPUPUPUP
2005-6-29 19:29
0
雪    币: 519
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
3
没看太明白,代码贴一下?
2005-6-30 16:11
0
雪    币: 244
活跃值: (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
多谢,下面是代码:
unsigned int temp;

HANDLE hLibrary;
FARPROC lpFunc;

hLibrary=LoadLibrary("test.dll");
lpFunc=GetProcAddress(hLibrary,"addtest");
if(lpFunc != NULL)
  {
   temp=0x12345678;
   temp=lpFunc(temp);   //就是这里编译通不过,如果把temp去掉就OK了,但是这样的话DLL里的参数就不对了
   FreeLibrary(hLibrary);
  }
else
  {
   Application->MessageBoxA("调用API失败?","错误",0);
  }

//test.dll里的addtest函数的原形是 int addtest(int temp)
2005-6-30 18:12
0
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
5
把addtest()部分的代码也贴上来吧。
2005-7-1 08:43
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
6
改成这样大概就可以了。
unsigned int temp;

HANDLE hLibrary;
FARPROC lpFunc;
int (*MyFunc)(int temp);

hLibrary=LoadLibrary("test.dll");
lpFunc=GetProcAddress(hLibrary,"addtest");
if(lpFunc != NULL)
  {
   temp=0x12345678;
这里改成这样。
   MyFunc = lpFunc;
   temp = (*MyFunc)(temp);

//   temp=lpFunc(temp);   //就是这里编译通不过,如果把temp去掉就OK了,但是这样的话DLL里的参数就不对了
   FreeLibrary(hLibrary);
  }
else
  {
   Application->MessageBoxA("调用API失败?","错误",0);
  }

//test.dll里的addtest函数的原形是 int addtest(int temp)
2005-7-1 11:02
0
雪    币: 244
活跃值: (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
最初由 小虾 发布
改成这样大概就可以了。
unsigned int temp;

HANDLE hLibrary;
FARPROC lpFunc;
........


谢谢虾XD,不过编译同不过
Error: E2034 Cannot convert 'int (__stdcall *)()' to 'int(*)(int)'
2005-7-1 20:19
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
8
语法类型检查不过关,我忘了你是使用C++的(C++的语法检查比较严格),上面的源码我用C是编译成功的。在C++里就要修改修改了。改成下面的就应该没问题了。
unsigned int temp;

HANDLE hLibrary;
FARPROC lpFunc;
typedef int (__stdcall *MyFunc)(int temp); //定义一个自己的函数指针
MyFunc _MyFunc; //声明一个自定义函数指针


hLibrary=LoadLibrary("test.dll");
lpFunc=GetProcAddress(hLibrary,"addtest");
if(lpFunc != NULL)
  {
   temp=0x12345678;

   _MyFunc = (MyFunc)lpFunc; //将函数指针强制转成自己的函数定义
   temp = _MyFunc(temp); //函数调用

//   temp=lpFunc(temp);   //就是这里编译通不过,如果把temp去掉就OK了,但是这样的话DLL里的参数就不对了
   FreeLibrary(hLibrary);
  }
else
  {
   Application->MessageBoxA("调用API失败?","错误",0);
  }

//test.dll里的addtest函数的原形是 int addtest(int temp)
2005-7-1 21:05
0
雪    币: 213
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
typedef int (WINAPI *paddtest)(unsigned int temp);
paddtest addtest;
addtest=(paddtest)GetProcAddress(hLibrary,"addtest");

temp=addtest(temp);

试试
2005-7-1 21:54
0
雪    币: 244
活跃值: (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
最初由 小虾 发布
语法类型检查不过关,我忘了你是使用C++的(C++的语法检查比较严格),上面的源码我用C是编译成功的。在C++里就要修改修改了。改成下面的就应该没问题了。
unsigned int temp;

HANDLE hLibrary;
FARPROC lpFunc;
........


嘿嘿,多谢虾兄,差不多通过了,还有最后一个错误
Error E2206 legal character' '(0xa1a1)
是发生在MyFunc _MyFunc;这里
2005-7-2 15:27
0
雪    币: 244
活跃值: (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
最初由 d1y2j3 发布
typedef int (WINAPI *paddtest)(unsigned int temp);
paddtest addtest;
addtest=(paddtest)GetProcAddress(hLibrary,"addtest");

temp=addtest(temp);
........


谢谢,编译通过,结果正确~
有时候真郁闷,ASM写这些真TMD的容易,C++里写都要受到语法限制
哪怕都是DWORD,却也要转换
2005-7-2 15:34
0
游客
登录 | 注册 方可回帖
返回
//