gpt4 book ai didi

c++ - 在 C++ 控制台应用程序中打印字符串资源(字符串表)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:29:05 25 4
gpt4 key购买 nike

背景:我正在开发可以同时运行 GUI 和控制台模式的 C++ MFC 应用程序。但是在这两种情况下,用户都需要使用带有一些参数的命令提示符来运行应用程序。当初始化应用程序时,它会检查命令提示符下的使用输入参数,并决定以控制台模式还是 GUI 模式运行。此应用程序需要使用多种语言。所以我使用字符串表来存储显示文本。

所以我在这里使用这个函数将现有的命令提示符附加到应用程序,以在应用程序以控制台模式运行时显示状态。

BOOL CMyclass::EnableConsolePrinting(){
BOOL GotConsoleAttach = FALSE;
if (AttachConsole(ATTACH_PARENT_PROCESS))
{
int osfh = _open_osfhandle((intptr_t) GetStdHandle(STD_OUTPUT_HANDLE), 8);
if ((HANDLE)osfh != INVALID_HANDLE_VALUE)
{
*stdout = *_tfdopen(osfh, _T("a"));
GotConsoleAttach = TRUE;
}
}
return GotConsoleAttach;
}

然后像这样将状态打印到控制台。

this->EnableConsolePrinting();  
cout << CMsg(IDS_STRING_ERROR_MESSAGE);

在 GUI 模式下,我使用此方法在标签中显示文本。

lblError.SetWindowTextW(CMsg(IDS_STRING_ERROR_MESSAGE));

问题:两种方法都可以正常编译和运行。但是 GUI 模式显示正确的字符串,并且控制台打印一些像这样意义不大的代码。 00C2D210 相同的字符串。有什么想法吗?

最佳答案

因为字符串是宽字符串(从W中的尾部SetWindowTextW猜测,使用窄字符std::cout时宽字符串的输出往往是一个神秘的十六进制数)。使用 wcout将宽字符串输出到控制台。

std::wcout << CMsg(IDS_STRING_ERROR_MESSAGE);

可能是标准输出流可能无法打印CString直接,在这种情况下,您可能必须为其添加输出运算符重载:

std::ostream& operator<<(std::ostream& os, const CString& str)
{
auto length = str.GetLength();
os << str.GetBuffer(length + 1);
str.ReleaseBuffer();

return os;
}

关于c++ - 在 C++ 控制台应用程序中打印字符串资源(字符串表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14768750/

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