将变量传递给另一个可变参数函数 [专家版]

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;
}

所以,这个技巧是不能连续做两次的。所以我被卡住了。 第二个输入是格式字符串,因此可以根据字符串的长度轻松确定参数的数量。那么,我能否以 voids 的形式访问变量输入,然后根据参数的数量将它们传递给单独的调用。我可以使用基于参数数量的开关,然后调用 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 函数并将存根输入传递给它。然后存根按照指定的方式工作,并且可以与它们镜像的标称函数具有相同的名称。