如何解决C根据给定的整数值调用其他函数
我正在编写一个C程序来调用DLL,但是类型列表和返回值未知。我找到了一种绕过此方法的方法:不强制转换为任何函数。
//todll.c
int test(int arg1,int arg2) {
return arg1 + arg2;
}
//caller.c
#include <windows.h>
int main() {
HMODULE module = LoadLibrary("test.dll"); //load the library into an HMODULE
FARPROC proc = GetProcAddress(module,"test"); //get the process
printf("%d",proc((void*) 9),((void*) 10);
}
这有效。但是问题在于用户可以输入不同的参数长度。我将参数的长度存储在名为argc (type int)
的变量中,并将实际参数存储在变量argv (type void**)
中。现在我想将argv传递给dll。
我知道我可以做类似的事情
switch (argc) {
case 0:
return proc();
case 1:
return proc(argv[0]);
case 2:
return proc(argv[0],argv[1]);
case 3:
return proc(argv[0],argv[1],argv[2]);
//etc...
case 127:
return proc(argv[0],argv[2],argv[3],argv[4],/* etc... */,argv[126]);
}
但是我认为应该有一个更好的方法来实现这一目标。
解决方法
首先,处理现有函数的正确方法是将GetProcAddress
的返回值转换为正确的类型:
int (*proc)(int,int) = (int (*)(int,int))GetProcAddress(module,"test");
然后您可以正确地调用它:
printf("%d",proc(9,10));
关于如何处理多个值,请更改库函数以接受长度参数和指向数组开头的指针:
int test(int argc,void **argv) {
int sum = 0;
int i;
for (i=0;i<argc;i++) {
sum += *((int *)(argv[i]));
}
return sum;
}
然后将argc
和argv
传递给您的函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。