3

我在 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++ 无法从枚举转换为 LPCTSTR

  3. 如何在 VC++ 中将 char* 转换为 LPWSTR?

我没有找到我的案子:(

4

3 回答 3

3

而不是您当前的代码:

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'\0' );//   <--- 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 扩展。然而,Windows C++ 编译器实际上需要文件系统添加到 C++17 中的标准库。

于 2015-06-17T02:33:25.703 回答
2

您正在使用 unicode 进行编译,因此您必须使用wchar_t来声明字符串。而不是strcat使用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");
于 2015-06-17T02:32:15.213 回答
1

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

将您的项目设置为使用标准字符集或指定 ASCII 版本,而不是GetCurrentDirectory使用GetCurrentDirectoryA

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

于 2015-06-17T02:49:36.177 回答