如何将WCHAR []打印到Linux中的文件中

问题描述 投票:1回答:1

我正在尝试在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); 

Trial1:执行GetModuleInfo2()之后,将参数值打印到文件中,如下所示。

FILE * pFile;
pFile = fopen ("/tmp/myfile.txt","a");
fwprintf (pFile, L"wszName: %ls \n",wszName);
fclose (pFile);

文件中的打印输出如下。

wszName: ?????????????????????????????????????
wszName: ???????????????????????????????????l??
wszName: ??????????????????????????????????????????????????l????

Trial2:

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:0assemblyID:140525290184540之前

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

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

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

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

c++ linux clr clang++ coreclr
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.