现在有这样一个需求:用户以字符串的形式给出dll中某个函数的函数名,然后希望调用相应的函数。例如,已知 example.dll 中导出有下列函数:void func1();void SetType(int type);void GetType();.....现在用户给出字符串 "GetType",那么程序就自动调用 GetType() 函数;用户给出字符串"func1",程序就自动调用func1()。请问这应该怎么实现呢?
解决方案 »
- WinSock Select 问题?
- 编译时报错:LINK : fatal error LNK1104: cannot open file "E:\Program.obj"
- 比较奇怪的问题
- 提个小问题!
- BEGIN_MESSAGE_MAP(CMyDlg, CDialog) 后 怎么添加自定义的消息?
- 谁能给我一份C++编码规范呀?
- 请问combobox的items如何输入?
- 我在编写类似网络数据包的截获与分析的程序,可是上网的时候程序会为什么会自动退出呢?
- 微软的面试考题:四人过桥
- 用API实现的Dialog对话框的问题
- VC++ 怎么才能一条一条的显示记录?
- vc++保存panel里画的图片
if(string=="GetType")
{
//调用GetType
}
else if(string=="func1")
{
//调用func1
}
...
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;
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);
自己写一个函数映射,就是if else判断而已
2个参数
你把dll的名字作为参数传,还有映射的函数名
你的意思是说dll里可能出现重载?
有
func(int i int j);
func(int i);至于你想一个适合所有情况的指针,恐怕不行
to lj2lxm:很感谢你指教。有个问题:你的例子中用GetProcAddress得到对应的函数地址,但是因为dll中函数参数形式是多种多样的,那么你定义的typedef void (*pTestDll) ();怎么能适应所有情况呢?比如现在字符串是"SetType",那么这个指针形式就不对了啊?那怎么定义一个适合所有情况的指针呢?
[/Quot]
你说的估计是要用到函数重载,我没有试过,晚上回去试试,如果想直接点儿那就用if()判断或用switch()选择是肯定能实现的.一个函数名对应一个tyepdef,正确设置函数返回值类型和参数类型就行了
{
调用func1;
}
else if(funcName = "func2")
{
调用func2;
}
else if(...)
...这样的话觉得比较麻烦,另外如果dll被更新了(里面的函数增加或减少了),那这里的代码也要跟着变,不太好啊。
这个你就要很清楚dll里面有哪些导出函数了, 为每个导出函数定义一个函数指针, 没什么捷径的!