“会员功能”是最顽固的东西。只是我无法将它们转换为*void
值。我已经做了一些可以解决这个问题的方法;然而,唯一让我恼火的是:我必须为每组参数类型创建一个新定义。所以实现目标的最快方法:
struct FOO{
void ONE_PARAM(int){}
void TWO_PARAM(int, int){}
void THREE_PARAM(int, int, int){}
void FOUR_PARAM(int, int, int, int){}
};
首先,通过汇编调用结构函数成员:
__asm mov ecx, ADDRESS_OF_STRUCTURE
__asm push //parameters
__asm call ADDRESS_OF_MEMBER_FUNCTION
最长:模板...
template <class F,void (F::*Function)(int)> //Note : Only for FOO::ONE_PARAM
void * GetFunctionAddress() {
union ADDRESS
{
void (F::*func)(int);
void * function_address;
}address_data;
address_data.func = Function;
return address_data.function_address;
}
更短的方法:定义一个指向成员函数的函数指针
void *function_address;
///////////////////////////////////////////////
void(FOO::*address_ONE_PARAM)(int) = FOO::ONE_PARAM;
void(FOO::*address_TWO_PARAM)(int, int) = FOO::TWO_PARAM;
void(FOO::*address_THREE_PARAM)(int, int, int) = FOO::THREE_PARAM;
void(FOO::*address_FOUR_PARAM)(int, int, int, int) = FOO::FOUR_PARAM;
__asm mov eax, address_ONE_PARAM //OK
__asm mov function_address, eax
__asm mov eax, address_TWO_PARAM //OK
__asm mov function_address, eax
__asm mov eax, address_THREE_PARAM //OK
__asm mov function_address, eax
__asm mov eax, address_FOUR_PARAM //OK
__asm mov function_address, eax
但是还是太长了。
最方便的方法:直接使用标准函数:sprintf
我发现__thiscall函数也可以作为“...”参数推送,我已经通过函数printf仔细检查了它。这很简单,您不需要再次定义它的整套参数类型来接受指针。和代码:
unsigned int address;
char buffer[12];
///////////////////////////////////////////////
sprintf(buffer, "0x%X", FOO::ONE_PARAM);
address = strtol(buffer,NULL,16);
sprintf(buffer, "0x%X", FOO::TWO_PARAM);
address = strtol(buffer,NULL,16);
sprintf(buffer, "0x%X", FOO::THREE_PARAM);
address = strtol(buffer,NULL,16);
sprintf(buffer, "0x%X", FOO::FOUR_PARAM);
address = strtol(buffer,NULL,16);
如您所见,这种方法要短得多,而且非常方便。我不需要插入汇编代码,代码看起来更好,但另一方面,我担心速度。代码可以压缩更多吗?假设现在有两个命令,它只需要一个命令就可以工作,这可能吗?