gpt4 book ai didi

c - 如何使用 va_list 在 FormatMessage() 中添加多个参数?

转载 作者:行者123 更新时间:2023-11-30 20:19:43 30 4
gpt4 key购买 nike

我有一个如下所示的函数:

void test() {
char lpBuffer[MAX_PATH];
LPVOID pv = NULL;
va_list Environment = (va_list)malloc(MAX_PATH);
Environment = (va_list)"abc";
FormatMessageA(0x2500, "%1\\test.exe", 0, 0, (LPSTR)&pv, 0, &Environment);
printf("%s\n", pv);
}

这个test()函数打印abc\test.exe。现在我想在函数参数后面添加更多字符串。例如,

void test(char* var) {
...
Environment =(va_list)"abc";
...
...
FormatMessageA(0x2500, "%1\\test.exe %2", 0, 0, (LPSTR)&pv, 0, &Environment);
printf("%s\n", pv);
}

现在该函数应该打印 abc\test.exe var 但这不起作用。我读过FormatMessage()文档。我怎样才能做到这一点?

最佳答案

va_list 是一种不透明的对象类型,其实现取决于操作系统和/或编译器。它通常只是堆栈上的一个位置,但您不能这样假设。

获取 va_list 的有效方法是通过可变参数函数:

int myfunc(const char*fmt, ...)
{
va_list args;
va_start(args, fmt);
// use args va_list here.
va_end(args);
}

使用 FormatMessage 它可能看起来像这样:

LPSTR FormatMyMessage(const char*fmt, ...)
{
int ret;
LPSTR str;
va_list args;
va_start(args, fmt);
ret = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_STRING, fmt, 0, 0, (LPSTR) &str, 0, &args);
va_end(args);
return ret ? str : NULL;
}

...

LPSTR str = FormatMyMessage("%1\\test.exe %2", "abc", "def");
if (str)
{
MessageBoxA(NULL, str, NULL, 0);
LocalFree(str);
}

如果此模式不适合您,那么您不能使用 va_list。

幸运的是,当您使用 FORMAT_MESSAGE_ARGUMENT_ARRAY 标志时,FormatMessage 函数还支持简单数组中的参数:

DWORD_PTR params[2] = { (DWORD_PTR) "abc", (DWORD_PTR) "def" };
char*str;
if (FormatMessageA(FORMAT_MESSAGE_ARGUMENT_ARRAY|FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_STRING, "%1\\test.exe %2", 0, 0, (LPSTR) &str, 0, (va_list*) params))
{
MessageBoxA(NULL, str, NULL, 0);
LocalFree(str);
}

对于像这样的简单字符串格式,您还可以使用 wsprintf但它不会为您分配内存。

关于c - 如何使用 va_list 在 FormatMessage() 中添加多个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49308067/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com