无法将 CHAR 转换为 LPWSTR

Cannot convert CHAR to LPWSTR

我在 Visual Studio 2015 年遇到编译错误,我正在尝试将 char 数据转换为 LPWSTR。我可以吗?或者它只适用于字符串类型?

这是我的一段代码:

    ⋮
FILE *sortie;
char fichier[256];//   <--- HERE s my char table

int main(int argc, char *argv[])
{
    //on masque 
    HWND hwnd = GetForegroundWindow();
    ShowWindow(hwnd, SW_HIDE);

    int i, lettre, result, lastresult, lastletter, compteur;

    GetCurrentDirectory(256, fichier); 
    strcat(fichier, "\fichierlog.txt");

在发布我的问题之前,我在:

  1. https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k%28C2664%29&rd=true

  2. C++ cannot convert from enum to LPCTSTR

  3. How to Convert char* to LPWSTR in VC++?

我没有找到我的箱子:(

您正在使用 unicode 进行编译,因此您必须使用 wchar_t 来声明字符串。而不是 strcat 使用 unicode 版本 wcscat.

同时将字符串 "\fichierlog.txt" 更改为 L"\fichierlog.txt"

FILE *sortie;
//char fichier[256];//   <--- HERE s my char table
wchar_t fichier[256];//   <--- HERE s my char table

//on masque 
HWND hwnd = GetForegroundWindow();
ShowWindow(hwnd, SW_HIDE);

int i, lettre, result, lastresult, lastletter, compteur;

GetCurrentDirectory(256, fichier);
//strcat(fichier, "\fichierlog.txt");
wcscat(fichier, L"\fichierlog.txt");

而不是您当前的代码:

FILE *sortie;
char fichier[256];//   <--- HERE s my char table

int main(int argc, char *argv[])
{
    //on masque 
    HWND hwnd = GetForegroundWindow();
    ShowWindow(hwnd, SW_HIDE);

    int i, lettre, result, lastresult, lastletter, compteur;

    GetCurrentDirectory(256, fichier); 
    strcat(fichier, "\fichierlog.txt");

做例如

auto main() -> int
{
    //on masque 
    HWND hwnd = GetForegroundWindow();
    ShowWindow(hwnd, SW_HIDE);

    int i, lettre, result, lastresult, lastletter, compteur;

    std::wstring fichier( MAX_PATH, L'[=11=]' );//   <--- HERE s my char table
    const DWORD len = GetCurrentDirectory( fichier.size(), &fichier[0] );
    if( len == 0 || len >= fichier.size() ) { throw std::runtime_error( "GetCurrentDirectory failed." ); }
    fichier.resize( len );
    fichier += L"/fichierlog.txt";

    std::ifstream sortie( fichier );

这应该可以解决三个问题:

  • 您正在编译为 Unicode(可能是一个 Visual Studio 项目),但代码是针对 Windows ANSI API.

  • 您正在使用 C++ 编译器,但代码是低级 C。

  • 最大路径长度的缓冲区太小,连接可能会溢出缓冲区。

请注意,接受宽字符串的 ifstream 构造函数是 Microsoft 扩展。然而,通过将文件系统添加到 C++17 中的标准库,Windows C++ 编译器实际上需要它。

您的 Visual Studio 项目设置为使用 "widechars" 作为默认编码(又名 UNICODE)进行编译,因此所有 Windows API 都采用 wchar_t 数组而不是 char 处理字符串时的数组。

要么将您的项目设置为使用标准字符集,要么使用 GetCurrentDirectoryA 指定 GetCurrentDirectory 的 ASCII 版本。

GetCurrentDirectory 实际上不是一个函数,而是一个预处理器宏,它会将您路由到 GetCurrentDirectoryAGetCurrentDirectoryW,具体取决于您的编译器设置使用的编码。