0

我正在使用带有“使用 Unicode 字符集”选项的 VS2005

typedef unsigned char       BYTE;  
typedef unsigned long       DWORD;

BYTE       m_bGeraet[0xFF];
DWORD      m_dwAdresse[0xFF];

我如何使代码工作?

MessageBox (m_bGeraet[0], _T("Display Content"));  
MessageBox (m_dwAdresse[0], _T("Display Content"));  
4

3 回答 3

2

看起来您可能需要 C 语言本身的一些帮助,我建议您找一本与 Windows 编程无关的 C 初学者书籍。

MessageBox() 仅显示 C 样式字符串,它们是类型数组,char其中包含 ASCII 值为 0 的字符。这个零字符就是NUL字符,并且这样的字符串被称为“NUL 终止”或“零终止”。打印字符串时仅显示 NUL 之前的字符,或在连接字符串时复制。但是,如果数组中没有 NUL 字符,则字符串未正确终止,尝试显示它可能会导致崩溃或显示“垃圾”,如:“我可以喝啤酒吗?# BT&I10)aaX?。

MessageBox()的szTitleszText参数期望char *它们是指向这种类型字符串的指针。

如果您尝试传递 aBYTE而不是 a char *,则 BYTE 的值将被错误地视为地址。MessageBox() 将尝试以“指定”的值访问内存,BYTE并且会发生访问冲突。

这个问题的一种解决方案是分配一个类型的缓冲区char并用于snprintf_s将数据值转录为字符串表示形式。

例如:

字符输出缓冲区[1024];

snprintf_s(output_buffer, dimensionof(output_buffer), "Geraet = 0x%02X", m_bGeraet[i]);
MessageBox(hwnd_parent, output_buffer, "来自我的消息:", MB_OK);

将显示一个 MessageBox,其中包含一条消息,例如“Geraet = 0x35”。

于 2009-10-16T09:34:33.970 回答
0
//easy way for bytes is to do this

CString sTemp;

sTemp.Format("my byte = %d", bySomeVal);

MessageBox(sTemp);

//for a DWORD try

sTemp.Format("Dword is %lu", dwSomeVal);

MessageBox(sTemp);

如果你使用 MessageBox,我会建议像 AfxMessageBox 这样的 soetming ...

于 2009-10-16T21:28:03.373 回答
0

如果 BYTE 必须是 1 字节,那么您必须(可选地)使用 mbstowcs 将字节字符串转换为宽字符串。

于 2009-10-16T09:02:27.903 回答