【发布时间】:2018-07-23 16:00:03
【问题描述】:
我需要为dll 中的现有可变参数函数编写一个存根。所以我按照名义上的建议去做:
myPyArg_ParseTuple = (void *)GetProcAddress(dll, "PyArg_ParseTuple");
int PyArg_ParseTuple(PyObject *inp1, const char *inp2, ...)
{
int ret = 0;
static va_list args;
va_start(args, inp2);
ret = myPyArg_ParseTuple(inp1, inp2, args);
va_end(args);
return ret;
}
一切都很好,对吧?嗯,不。因为事实证明myPyArg_ParseTuple 指向的外部代码做了同样的事情:
[Source code of call in the .dll]
PyArg_ParseTuple(PyObject *args, const char *format, ...)
{
int retval;
va_list va;
va_start(va, format);
retval = vgetargs1(args, format, &va, 0);
va_end(va);
return retval;
}
所以,这个技巧是不能连续做两次的。所以我被困住了。
第二个输入是格式字符串,因此可以根据字符串的长度轻松确定参数的数量。那么,我能否以voids 的形式访问变量输入,然后根据参数的数量将它们传递给单独的调用。我可以使用基于参数数量的开关,然后调用myPyArg_ParseTuple(inp1, inp2, arg1)、myPyArg_ParseTuple(inp1, inp2, arg1, arg2) 等。
我不清楚如何以voids 访问输入,或者我什至可以这样做。
【问题讨论】: