我需要调用一个函数,其中我有LPVOID和参数个数。此外,我知道参数的类型和位置。 参数可以是int,int *,double,double *,string,string *类型。 由于参数可以是任何顺序,因此可能的模板列表将非常大。返回值始终是布尔值。
bool Func1(int);
bool Func1(int*);
bool Func1(double);
(...)
bool Func2(int,int);
bool Func2(int,int*);
(...)
所以这不是一个选择。我试过使用std :: tuple但没有成功。 以下示例仅适用于带参数的函数(int,double)。
template <typename R, typename... Args>
R call(FARPROC fp, Args... args) throw(HRESULT)
{
typedef R(__stdcall * function_pointer)(Args...);
function_pointer P = (function_pointer)fp;
const auto return_value = (*P)(std::forward<Args>(args)...);
().do_cast(fetch_back(args))...);
return return_value;
}
(...)
LPVOID function;
int iVal1 = 2;
double dbVal1 = 3.0;
auto t = std::make_tuple(iVal1 , dbVal1);
bool bRes = call<bool>((FARPROC)function, std::get<0>(t), std::get<1>(t));
我在想的是基于某些输入(字符串等)创建std :: tuple的通用方法,例如:auto t = create_tuple(&#34; int,int *,int&#34; )。
答案 0 :(得分:0)
我有一个提案,但你必须通过它的地址设置double
变量,就像指针一样,因为双变量有8个字节,而void指针的大小有x86的4个字节和x64的8个字节。此外,string
变量必须设置为指针:
#include "stdafx.h"
#include <string>
using namespace std;
bool Func1(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)
{
bool result = false;
int a1 = (int)arg1;
int a2 = *(int*)arg2;
double a3 = *(double*)arg3;
double* a4 = (double*)arg4;
string a5 = *(string*)arg5;
string* a6 = (string*)arg6;
//Do something...
return result;
}
int main()
{
bool(*myFun)(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);
myFun = &Func1;
int a1 = 2;
int a2 = 3;
double a3 = 4;
double* a4 = new double(5);
string a5= "MyData 1";
string* a6 = new string("MyData 2");
bool r = (*myFun)((void*)a1, (void*)&a2, (void*)&a3, (void*)a4, (void*)&a5, (void*)a6);
return 0;
}
我希望这可以帮到你。
答案 1 :(得分:0)
我的建议,对任何对替代品感兴趣的人......
将LPVOID函数隐藏在有意义的API下,不再直接使用它。
显然,LPVOID函数带有一堆void * ters不是自我记录的,所以提供一些东西。
提供各种构造函数或辅助方法,这些方法接受对LPVOID进行特定低级调用所需的值,并提供将值下移到LPVOID的转换方法。