- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个如下所示的函数:
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/
当传递给 FormatMessage 的参数太长时,我遇到了问题。 void testMessage(UINT id, ...) { va_list argList; va_start
如何从父组件获取 intl.formatMessage ?我用injectIntl包装了父组件,并希望将intl.formatMessage发送到子组件。有人可以帮我吗?谢谢! 父组件 impor
CString ErrorMessageFromErrorCode(DWORD errorCode){ void* pMsgBuf = NULL; ::FormatMessage(
是否可以翻译system error codes特定语言? 我只能通过MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)至 FormatMessage .否则,函
当一个参数值用于多个时,FORMATMESSAGE 函数返回 NULL消息字符串。 DECLARE @myvar VARCHAR(10) = 100 SELECT FORMATMESSAGE ('Fi
我用的是CodeBlocks和Mingw:g++版本是4.7.1 例子来自 MSDN (请参阅最后一个示例,就在“要求”部分之前): // Formats a message string using
我正在尝试使用 react-intl为我的应用添加本地化。像这样 但我需要一个字符串,所以我尝试了这个 const title = this.props.intl.formatMessage({
我使用react-intl与 en和fr ,我的 React 应用程序包含在 中 这样,例如当lang是 en ,全部intl.formatMessage调用结果为英文文本。 我想要实现的是我想要
我不确定我的实现是否存在根本性问题,或者 Windows API 中是否存在关于格式化系统错误消息的错误。 我有一个用于 FormatMessage 函数的 Windows API 包装器方法。我的实
当我执行以下代码片段时,它失败并显示错误代码 317。如何解决问题?我们正在为项目使用 Unicode 字符集 char* pszMessgeBuffer = NULL; FormatMess
我正在尝试学习一些 WinAPI 知识,并且正在使用 RegOpenKeyEx 函数。我有这段代码: LPCTSTR subKey; subKey = TEXT("WinSide"); HKEY hK
我需要使用 FormatMessage()对于一个项目,但我不喜欢它可怕的界面。有谁知道在允许替换参数的同时整理它的外观? 我刚刚阅读了 second part of the FastFormat i
没有: MFC ATL 如何使用 FormatMessage()获取 HRESULT 的错误文本? HRESULT hresult = application.CreateInstance("Exc
我正在尝试使用标准 直接在 comp 外部调用 formatMessage() API组件。 const locale = 'en'; const messages= defineMessages(
我正在尝试使用 react-intl 进行语言翻译。当我使用这个时,它运行完美。但是当我将以下代码与 intl.formatMessage() 一起使用时,它不起作用并抛出一些错误。我不知道这有什么问
我有一个如下所示的函数: void test() { char lpBuffer[MAX_PATH]; LPVOID pv = NULL; va_list Environmen
我正在调用 SetupCopyOEMInf 来复制设备驱动程序的 .inf 文件(MSFT 文档说:“SetupAPI 继续用于 installing device drivers”)。 调用返回 f
这个问题在这里已经有了答案: Javascript object bracket notation ({ Navigation } =) on left side of assign (5 个答案)
我正在运行它来测试 FormatMessage : LPVOID lpMsgBuf; errCode=12163; FormatMessage( FORMAT_MESSAGE_ALLOCATE
我只是想用这个简单的代码获取最后一个错误的文本: #include #include #include int main(){ char err[256]; memset(err
我是一名优秀的程序员,十分优秀!