将变量传递给另一个可变参数函数 [专家版]
Passing variables to another variadic function [Experts Edition]
我需要为 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
指向的 outside 代码做同样的事情:
[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;
}
所以,这个技巧是不能连续做两次的。所以我被卡住了。
第二个输入是格式字符串,因此可以根据字符串的长度轻松确定参数的数量。那么,我能否以 void
s 的形式访问变量输入,然后根据参数的数量将它们传递给单独的调用。我可以使用基于参数数量的开关,然后调用 myPyArg_ParseTuple(inp1, inp2, arg1)
、myPyArg_ParseTuple(inp1, inp2, arg1, arg2)
等
我不清楚如何以 void
的形式访问输入,或者我是否可以这样做。
没有独立于平台的方法来包装可变参数函数,因为 C 没有在不创建 va_list
.
的情况下转发可变参数的工具
这就是可变参数库函数通常是采用 va_list
的函数的包装器的原因。例如,Python API 包含 PyArg_VaParse
,您可以用 va_list
调用它。也正好是PyArg_ArgParse
.
的实现
[我添加的编辑]
虽然不是通用解决方案,但具体解决方案是从 DLL 访问 PyArg_VaParse 函数并将存根输入传递给它。然后存根按照指定的方式工作,并且可以与它们镜像的标称函数具有相同的名称。
我需要为 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
指向的 outside 代码做同样的事情:
[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;
}
所以,这个技巧是不能连续做两次的。所以我被卡住了。
第二个输入是格式字符串,因此可以根据字符串的长度轻松确定参数的数量。那么,我能否以 void
s 的形式访问变量输入,然后根据参数的数量将它们传递给单独的调用。我可以使用基于参数数量的开关,然后调用 myPyArg_ParseTuple(inp1, inp2, arg1)
、myPyArg_ParseTuple(inp1, inp2, arg1, arg2)
等
我不清楚如何以 void
的形式访问输入,或者我是否可以这样做。
没有独立于平台的方法来包装可变参数函数,因为 C 没有在不创建 va_list
.
这就是可变参数库函数通常是采用 va_list
的函数的包装器的原因。例如,Python API 包含 PyArg_VaParse
,您可以用 va_list
调用它。也正好是PyArg_ArgParse
.
[我添加的编辑] 虽然不是通用解决方案,但具体解决方案是从 DLL 访问 PyArg_VaParse 函数并将存根输入传递给它。然后存根按照指定的方式工作,并且可以与它们镜像的标称函数具有相同的名称。