c++ - 如何在Linux中将WCHAR []打印到文件中

标签 c++ linux clr clang++ coreclr

我正在尝试在 linux 中使用 IcorProfiler API(使用 clang++ 编译)来分析 .NET 核心应用程序。
在这里,我尝试将模块名称打印到文件中,该文件使用 WCHAR wszName[300] 变量中的 GetModuleInfo2() 填充。

    ModuleID moduleID;
    LPCBYTE pbBaseLoadAddr;
    WCHAR wszName[300];
    ULONG cchNameIn = _countof(wszName);
    ULONG cchNameOut;
    AssemblyID assemblyID;
    DWORD pdwModuleFlags = 0;

   GetModuleInfo2(moduleID, &pbBaseLoadAddr, cchNameIn, &cchNameOut, wszName, &assemblyID, &pdwModuleFlags); 

试用1:
执行 GetModuleInfo2() 后,将参数值打印到文件中,如下所示。
FILE * pFile;
pFile = fopen ("/tmp/myfile.txt","a");
fwprintf (pFile, L"wszName: %ls \n",wszName);
fclose (pFile);

文件中的打印输出如下。
wszName: ?????????????????????????????????????
wszName: ???????????????????????????????????l??
wszName: ??????????????????????????????????????????????????l????

试验2:
wofstream of;
    char threadid[64];
    sprintf(threadid,"/tmp/module-%d.txt",getpid());
    of.open(threadid,std::ios::in | std::ios::binary | std::ios::app);
     of<< "After MODULENAME:" << wszName << "    " <<
         "cchNameIn:" << cchNameIn <<"  " <<
         "cchNameOut:"<< cchNameOut << " " <<"pbBaseLoadAddr:" << pbBaseLoadAddr << " " <<
         "pdwModuleFlags:" << pdwModuleFlags << " " << "assemblyID:" << assemblyID << std::endl;               
    of.close();

文件中的打印输出如下。

在 MODULENAME:0x7ffe35f07010 cchNameIn:300 cchNameOut:2557930008 pbBaseLoadAddr:0x1 pdwModuleFlags:0 assemblyID:140525290184540 之前

MODULENAME:0x7ffe35f07010 cchNameIn:300 cchNameOut:80 pbBaseLoadAddr:0x7fce97e40000 pdwModuleFlags:1 assemblyID:31169008 之后

使用 fwprintf() 将 WCHAR [ ] 写入文件是打印问号并使用 wofstream 写入在 Linux 中打印其地址。

这是从 IcorProfiler API 获取模块名称的正确方法吗?如果是,我如何将模块名称(wszname)打印到文件中?

最佳答案

我会用
https://en.cppreference.com/w/c/string/multibyte/wcstombs (wcstombs_s) 首先将其转换为字符,然后使用通常用于写入文件的任何方式

char name[300]; // Limitation was used from the question code
size_t convertedChars = 0;

if (wcstombs_s(&convertedChars, name, 300, wszName) != 0)
{
    // Error
}

if (convertedChars != cchNameOut)
{
    // Error
}

编辑:
在 Linux 中对其进行测试后,似乎 WCHAR 实际上是一个 char16_t(与 windows 不同,它被定义为一个 wchar_t)。关于区别的很好的阅读在这里 https://ducmanhphan.github.io/2018-12-06-How-to-use-char-wchar_t-char16_t-char32_t-right-a-way-in-C++/

将 char16_t 转换为 char 数组有点棘手,因为您必须单独解析每个字符。您可以使用std::c16rtomb .

关于c++ - 如何在Linux中将WCHAR []打印到文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59579588/

相关文章:

sql-server-2005 - CLR存储过程:SqlContext.Pipe.SendResultsStart/SendResultsRow/SendResultsEnd的替代方法?

c# - 与 Windows 控件的 C++ 相比,clr 如何处理 C# 中的标准事件?

c# - .NET 4.0 项目如何引用使用 v2.0.50727 运行时的程序集?

c# - 使用 ADO.NET 库的 C++ 中的 SQL Server 2014 查询通知

c++ - 以溢出安全的方式用 N 个有效的十进制数字舍入 double

c++ - 如何在 C++ 中将数组中的所有数字相加?

python - 重置Python解释器

c++ - 检查两个(智能)指针是否指向同一个派生类

linux - 如何让 gdb 在 'symbol lookup error' 上中断

linux - 如何使用杯子将多个作业打印为一项作业