现在有这样一个需求:用户以字符串的形式给出dll中某个函数的函数名,然后希望调用相应的函数。例如,已知 example.dll 中导出有下列函数:void func1();void SetType(int type);void GetType();.....现在用户给出字符串 "GetType",那么程序就自动调用 GetType() 函数;用户给出字符串"func1",程序就自动调用func1()。请问这应该怎么实现呢?

解决方案 »

  1.   

    用if elseif
    if(string=="GetType")
    {
        //调用GetType
    }
    else if(string=="func1")
    {
        //调用func1
    }
    ...
      

  2.   

    类似这样的
    void func1();
    void SetType(int type);
    void GetType();
    void func1_map(LPCTSTR lParam)
    {
      func1();
    }
    void SetType_map(LPCTSTR lParam)
    {
     // 解析参数
     SetType(..);
    }
    ...
    typedef void (FUN_POINT*)(LPCTSTR lpParmeter);typedef struct _MAP_ENTRY_
    {
     TCHAR szFunName[MAX_COUNT];
     FUN_POINT FunEntry;
    }MAP_ENTRY;
      

  3.   

    你的意思估计就是你不知道如何动态调用DLL. 参考下面的例子:
    typedef void (*pTestDll) ();
    CString FuncName = "ShowDlg";  //你要调用函数名
    HINSTANCE m_instance = LoadLibrary(m_DllPath);  //你要调用的Dll的路径
    if (m_instance == NULL)
    {
    MessageBox("加载DLL失败!", "提示信息", MB_OK | MB_ICONWARNING);
    return;
    }
    pTestDll pBuf = (pTestDll)GetProcAddress(m_instance, FuncName); if (pBuf == NULL)
    MessageBox("没有找到函数!", "提示信息", MB_OK | MB_ICONWARNING);
            else
    pBuf(); FreeLibrary(m_instance);
      

  4.   


    自己写一个函数映射,就是if else判断而已
      

  5.   

    如果写映射,岂不是很死?就是对不同的dll就要写不同的映射。如果dll中的函数更新了,就要更新映射。
      

  6.   


    2个参数
    你把dll的名字作为参数传,还有映射的函数名
      

  7.   

    to lj2lxm:很感谢你指教。有个问题:你的例子中用GetProcAddress得到对应的函数地址,但是因为dll中函数参数形式是多种多样的,那么你定义的typedef void (*pTestDll) ();怎么能适应所有情况呢?比如现在字符串是"SetType",那么这个指针形式就不对了啊?那怎么定义一个适合所有情况的指针呢?
      

  8.   

    使用 if else 判断吧。
      

  9.   

    有个问题:你的例子中用GetProcAddress得到对应的函数地址,但是因为dll中函数参数形式是多种多样的,那么你定义的typedef void (*pTestDll) ();怎么能适应所有情况呢?比如现在字符串是"SetType",那么这个指针形式就不对了啊?那怎么定义一个适合所有情况的指针呢?
      

  10.   


    你的意思是说dll里可能出现重载?

    func(int i int j);
    func(int i);至于你想一个适合所有情况的指针,恐怕不行
      

  11.   

    [Quote=引用 10 楼 testpwd 的回复:]
    to lj2lxm:很感谢你指教。有个问题:你的例子中用GetProcAddress得到对应的函数地址,但是因为dll中函数参数形式是多种多样的,那么你定义的typedef void (*pTestDll) ();怎么能适应所有情况呢?比如现在字符串是"SetType",那么这个指针形式就不对了啊?那怎么定义一个适合所有情况的指针呢?
    [/Quot]
    你说的估计是要用到函数重载,我没有试过,晚上回去试试,如果想直接点儿那就用if()判断或用switch()选择是肯定能实现的.一个函数名对应一个tyepdef,正确设置函数返回值类型和参数类型就行了
      

  12.   

    我的意思是说比如对于函数: int func1() 定义一个函数指针:int (*pFunc1)();对于函数 double func2(int a)就要定义函数指针:double (*pFunc2)(int);调用 GetProcAddress(hInstance, funcName)时,你是无法知道funcName对应的哪个函数,也就不知道将GetProcAddress的返回值转化成哪种函数指针的形式啊。
      

  13.   

    如果用类似下面的代码:if(funcName = "func1")
    {
       调用func1;
    }
    else if(funcName = "func2")
    {
       调用func2;
    }
    else if(...)
    ...这样的话觉得比较麻烦,另外如果dll被更新了(里面的函数增加或减少了),那这里的代码也要跟着变,不太好啊。
      

  14.   


    这个你就要很清楚dll里面有哪些导出函数了, 为每个导出函数定义一个函数指针, 没什么捷径的!