我通过UDP协议得到一个字符串,它可能是AfxMessageBox、strcmp、SsmPickup等等(都是系统API函数,但是预先不知道是什么)。
我的应用程序用char command[20]接收了这个字符串,
例如可能command="SsmPickup"。
请问如何根据这个command字符串去调用这个相对应的API函数SsmPickup?
需要说明的是:我知道使用switch case语句是可以实现的,但是考虑到可能的API太多了,switch的分支会成百上千!很烦琐而且不实际。同样使用for或者while逐个比较、确定是哪一个API函数再去执行,这样的办法也是不太实际的。
有个大侠给了我一个建议:使用动态加载的方式来解决,如C#反射的调用,“根据传来的数据动态生成,然后调用”!我认为这就是我一直希望使用的方法。
但是问题是我不知道怎么去实现,哪位大侠可以给我指点吗???(希望答案尽量详尽些,因为小弟是菜鸟,谢谢^_^)
我使用的是Visual C++6.0编程
我的应用程序用char command[20]接收了这个字符串,
例如可能command="SsmPickup"。
请问如何根据这个command字符串去调用这个相对应的API函数SsmPickup?
需要说明的是:我知道使用switch case语句是可以实现的,但是考虑到可能的API太多了,switch的分支会成百上千!很烦琐而且不实际。同样使用for或者while逐个比较、确定是哪一个API函数再去执行,这样的办法也是不太实际的。
有个大侠给了我一个建议:使用动态加载的方式来解决,如C#反射的调用,“根据传来的数据动态生成,然后调用”!我认为这就是我一直希望使用的方法。
但是问题是我不知道怎么去实现,哪位大侠可以给我指点吗???(希望答案尽量详尽些,因为小弟是菜鸟,谢谢^_^)
我使用的是Visual C++6.0编程
解决方案 »
- CHttpFile发送数据?
- 请问,MFC中可以把CDialog绑定一个变量么
- 列集和散集的问题
- 路过的好心人,请问您安装完VC之后有没有一个Complex.h头文件
- vc6编译的奇怪错误
- 怎样设置Bitmap类中的像素为8位的灰度值?
- 怎么播放已载入内存的SWF文件?(0字节)
- 主题:能谁提供zip开发库?高分相送。
- 其实我了 ,难道vc也有歧视;怎么我的代码就是通不过,高手们看看
- cal3d导出问题
- 在c++中 void fun(char a)与void fun(char *a)不能区分吗?
- 编译问题:error C2143: syntax error : missing ';' before 'string'
知道名字直接LoadLibrary()就可以了,省事!
就算函数名字和dll都知道了,你还要知道参数个数,类型,最终还要case我想问问楼主,你光知道了函数名字,参数从那里来的?
你不要当心那个参数问题,有办法解决,目前最重要是解决“根据已有字符串调用系统API函数”。
你的答案可以再详细一些吗?我还是不太懂。
如何先LoadLibrary()后GetProcAddress()?可以举个例子吗?
谢谢!
(动态显示加载DLL)
你的答案可以再详细一些吗?我是菜鸟啊,还是不太懂。
可以举个例子吗?可以把详细方法发到我邮箱吗?[email protected]
或者联系我QQ99619836 (注明你是Rogeremail(绿色环保-菜青虫))
谢谢!
typedef int (WINAPI Fun_MessageBoxA)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
Fun_MessageBoxA *pFun = NULL;
/////////以上为体力部分///////////////////// HINSTANCE hDll = LoadLibrary(_T("User32.dll"));//根据查出结果填充
if(hDll != NULL)
{
pFun = (Fun_MessageBoxA*)GetProcAddress(hDll, "MessageBoxA");//根据查出结果填充
if(pFun != NULL)
{
pFun(NULL, "Hello,World!", "First", 0);//根据查出结果填充,可以参考va_list实现
}
FreeLibrary(hDll);
}
FARPROC *pFun = NULL;
HINSTANCE hDll = LoadLibrary(_T("User32.dll"));//根据查出结果填充
if(hDll != NULL)
{
pFun = (FARPROC*)GetProcAddress(hDll, "MessageBoxA");//根据查出结果填充
if(pFun != NULL)
{
//和API的参数顺序相反!!!
char cFormat[] = "%u %s %s %u";
CallApi(pFun, cFormat, 0, "First", "Hello,World!", 0); }
FreeLibrary(hDll);
}
DWORD CallApi(FARPROC *pFun, char *pFormat, ...)//和API的参数顺序相反!!!
{
va_list arg_ptr;
va_start(arg_ptr, pFormat); int iParameterNum = 0;
const char cSkip[] = " ,;"; char *p = strtok(pFormat, cSkip);
while(p != NULL)
{
////////proc//////////////////////////
if(p[0] == '%')
{
switch(p[1])
{
case 'u':
case 'U':
case 'd':
case 'D':
{
DWORD dwT = va_arg(arg_ptr, DWORD);
TRACE("%d\n", dwT);
_asm
{
push dwT
}
}
break; case 's':
case 'S':
{
char *pT = va_arg(arg_ptr, char*);
TRACE("%s\n", pT);
_asm
{
push pT
}
}
break;
default:
;
}
}
////////proc//////////////////////////
p = strtok(NULL, cSkip);
iParameterNum ++;
}
va_end(arg_ptr); DWORD dwRet = 0;
_asm
{
call pFun
mov dwRet,eax
} return dwRet;
}
另外,从函数名来调用这个函数,一般就是getprocaddress,但你必须知道其所在的DLL.
首先感谢你的答复
我需要先消化消化你的程序和思想
如有读不懂,再请教你^_^
我就把80分给Rogeremail(绿色环保-菜青虫)
其他20分给另外两个有建设性意见的大侠!
谢谢^_^
push xxx
push xxx
……
push xxx
call FFF什么问题还没解决呀?
下我帮你写了个可行的EXE,并非C 运行期库不可用!多参考Depends.Exe一下!如果非商业使用,
你可以完全自由用它!