我通过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编程

解决方案 »

  1.   

    关键还是参数!
    知道名字直接LoadLibrary()就可以了,省事!
      

  2.   

    哦!错了,是先LoadLibrary()后GetProcAddress()就可以!看样子不是木马就是其它非法的东西哦!
      

  3.   

    vc中可以做到吗?这么说也可以随便给个字符串,New出来该字符串对应的对象?不会 顶一下
      

  4.   

    知道函数名字能怎么样?你还要知道函数所在的dll
    就算函数名字和dll都知道了,你还要知道参数个数,类型,最终还要case我想问问楼主,你光知道了函数名字,参数从那里来的?
      

  5.   

    你好,Rogeremail(绿色环保-菜青虫)
    你不要当心那个参数问题,有办法解决,目前最重要是解决“根据已有字符串调用系统API函数”。
    你的答案可以再详细一些吗?我还是不太懂。
    如何先LoadLibrary()后GetProcAddress()?可以举个例子吗?
    谢谢!
      

  6.   

    这里怎么同LoadLibrary GetProcAddress()关联啊接收到的字符串又不是DLL中导出的请教 绿色环保-菜青虫至于LZ 要那个LoadLibrary 的例子在MSDN搜下,就OK了
    (动态显示加载DLL)
      

  7.   

    这几百个API,你得建立个简单的数据库,包含名字(还得注意xxxW()的)、所属的DLL、参数表等~~~~工作量不小哦~~~~~
      

  8.   

    当然,也可以直接从Dll里面读出导出函数的,只是全部方法,体力活都不少的!
      

  9.   

    你好,Rogeremail(绿色环保-菜青虫)
    你的答案可以再详细一些吗?我是菜鸟啊,还是不太懂。
    可以举个例子吗?可以把详细方法发到我邮箱吗?[email protected]
    或者联系我QQ99619836 (注明你是Rogeremail(绿色环保-菜青虫))
    谢谢!
      

  10.   

    //////////以下为体力部分/////////////////////
    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);
    }
      

  11.   

    //给你个省力一点的版本,不过只是原理哦!!!
    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;
    }
      

  12.   

    首先你说的那些函数并不是API,像strcmp这种函数VC会直接实现在你的EXE中.你根本就找不到这个函数的.而afxmessagebox则是mfc对messagebox的一个封装
    另外,从函数名来调用这个函数,一般就是getprocaddress,但你必须知道其所在的DLL.
      

  13.   

    你好,Rogeremail(绿色环保-菜青虫)
    首先感谢你的答复
    我需要先消化消化你的程序和思想
    如有读不懂,再请教你^_^
      

  14.   

    还给大家一些时间,如果还没有更好的方法
    我就把80分给Rogeremail(绿色环保-菜青虫)
    其他20分给另外两个有建设性意见的大侠!
    谢谢^_^
      

  15.   

    更好的方法是直接:
    push xxx
    push xxx
    ……
    push xxx
    call FFF什么问题还没解决呀?
      

  16.   

    你上面列举的这些函数有的是API,有的是C 运行期库,有的是MFC的函数,对于API你可以建立一个表格来记录它们所在的DLL,函数名,然后用LoadLibary()之类的API来加载它,但是C运行期库是静态库,并不是放在DLL中的,在编译时就已经确定了,好像没有办法用上述方法。至于MFC我不太清楚,好象它也是放在DLL中的,但也应该不能用上述方法来完成。
      

  17.   

    http://ultra.xinwen365.com/public/MYRUNDLL.RAR.TXT
    下我帮你写了个可行的EXE,并非C 运行期库不可用!多参考Depends.Exe一下!如果非商业使用,
    你可以完全自由用它!
      

  18.   

    把 MYRUNDLL.RAR.TXT 改名为 MYRUNDLL.RAR 后解压,在命令行下运行就好了!