Unicode CRT WinAPI和可变printf函数 我目前正在研究Charles Petzold的Windows API第五(Windows编程版)和C(不C++)。我正在尝试并希望保持它尽可能纯C,然后跳到C++或C语言。 我的问题在于使用可变的***printf***()版本

Unicode CRT WinAPI和可变printf函数 我目前正在研究Charles Petzold的Windows API第五(Windows编程版)和C(不C++)。我正在尝试并希望保持它尽可能纯C,然后跳到C++或C语言。 我的问题在于使用可变的***printf***()版本,unicode,printf,ascii,messagebox,crt,Unicode,Printf,Ascii,Messagebox,Crt,项目:我想制作一个函数,该函数能够识别我使用的是ASCII、UNICODE还是其他类型的多字节字符集(MBCS),然后相应地格式化输入并在MessageBox()中键入输出 在我正在阅读的书中,作者使用了下面的源代码来制作类似的东西: SCRNSIZE.C /*−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− SCRNSIZE.C −− Displays screen size in a message box (c) Charles P

项目:我想制作一个函数,该函数能够识别我使用的是ASCII、UNICODE还是其他类型的多字节字符集(MBCS),然后相应地格式化输入并在MessageBox()中键入输出

在我正在阅读的书中,作者使用了下面的源代码来制作类似的东西: SCRNSIZE.C

/*−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
SCRNSIZE.C −− Displays screen size in a message box
(c) Charles Petzold, 1998
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−*/
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
int CDECL MessageBoxPrintf (TCHAR * szCaption, TCHAR * szFormat, ...)
{
TCHAR szBuffer [1024] ;
va_list pArgList ;
// The va_start macro (defined in STDARG.H) is usually equivalent to:
// pArgList = (char *) &szFormat + sizeof (szFormat) ;
va_start (pArgList, szFormat) ;
// The last argument to wvsprintf points to the arguments
_vsntprintf (szBuffer, sizeof (szBuffer) / sizeof (TCHAR),
szFormat, pArgList) ;
// The va_end macro just zeroes out pArgList for no good reason
va_end (pArgList) ;
return MessageBox (NULL, szBuffer, szCaption, 0) ;
}
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
int cxScreen, cyScreen ;
cxScreen = GetSystemMetrics (SM_CXSCREEN) ;
cyScreen = GetSystemMetrics (SM_CYSCREEN) ;
MessageBoxPrintf (TEXT ("ScrnSize"),
TEXT ("The screen is %i pixels wide by %i pixels high."),
cxScreen, cyScreen) ;
return 0 ;
}
MessageBox()
正在使用以下技巧来处理ASCII或UNICODE:

#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
在尝试为我的项目编写代码之前(我开始了,但我有一些问题无法自己回答),我想解决一些我还没有解决的难题

1) 他如何使用
int
作为
MessageBoxPrintf()
中的返回类型,并能够返回像
MessageBox()
这样的完整C对象?通常,当我返回像MessageBox()这样的完整函数时,我的返回类型应该是什么

2) 作者使用的函数是
\u vsntprintf
。MSDN否认它存在,但我在源代码中发现了这一点:

#define _vsntprintf _vsnwprintf
int _vsnwprintf(wchar_t *_Buffer, size_t _BufferCount, const wchar_t *_Format, va_list _ArgList)
此外,他还使用两个分区和TCHAR来获得缓冲区的实际大小 使用UNICODE

2) 根据您的经验或偏好,此版本的printf仍然是最好的使用方式吗? 因为搜索MSDN,我找到了很多不同的变量版本的
printf

3) 您是否会更改代码中的任何内容以使其更具可移植性或更“正确”…我看不到任何错误处理,从我所读到的内容来看,最好使用
va_u
宏,这些宏是黑匣子,因此您的代码可以更具可移植性

如果有些问题听起来很愚蠢,我很抱歉,但是这个例子让我不知所措

提前感谢。

1)
MessageBox
是一个函数。他正在返回方法
MessageBox
的返回值。请查看此处的文档:

2) 以下是vsnwprintf的所有现有变体。每种类型采用不同的单位大小(例如:byte、char、tchar、wchar等)

此方法的第二个参数请求缓冲区中的元素数。假定
sizeof(szBuffer)
提供了以
字节为单位的缓冲区大小(而不是缓冲区内
TCHAR
s的数量),则必须将其除以TCHAR的大小(
sizeof(TCHAR)
)。因此,
sizeof(szBuffer)/sizeof(TCHAR)

3) 我有点迷路了。介意改进一下吗?

1)谢谢你,我现在明白了……第五次写这篇评论时……我不知道如何换行。2)我们说的是同样的事情……根据你的经验,你对可变打印函数有偏好吗?因为它们中的许多只是做同样的事情,但可能它们在实现上有内部差异,并且更便于移植例如。3)改进程序的想法和建议,如在您知道可能失败的地方添加错误处理,或使用其他方法而不是TCHAR…主要是想法和建议。
#define _vsntprintf _vsnwprintf
int _vsnwprintf(wchar_t *_Buffer, size_t _BufferCount, const wchar_t *_Format, va_list _ArgList)