C++ Builder 10.3 无法从 const char[18] 分配给 const wchar_t*

C++ Builder 10.3 can not assign to const wchar_t* from const char[18]

我有一个简单的目录处理代码,这里是其中的一部分。问题是,在旧版本的构建器中(我猜是 6)它工作得很好,现在它抛出 [bcc32c Error] Unit1.cpp(32): assigning to 'PCZZWSTR' (aka 'const wchar_t *') from incompatible type 'const char [18]'.

void __fastcall TForm1::Button2Click(TObject *Sender)
{
SHFILEOPSTRUCT fos;
String dirDest;
fos.hwnd = Handle;
//operacja kopiowania
fos.wFunc = FO_COPY;
//plik źródłowy
fos.pFrom = "C:\Melon\AGA\Bazy";
}

问题出在第 fos.pFrom = "C:\Melon\AGA\Bazy"; 行。我尝试使用 linkig 将 "C:\Melon\AGA\Bazy" 分配给 const wchar_t*,但它告诉我它无法链接。有人知道如何修复它吗?

您正在使用 SHFILEOPSTRUCT 的基于 TCHAR 的版本,因此其字符串字段将基于 wchar_tchar,具体取决于 [=18] =]分别定义与否。

在 C++Builder 6 中(其中 StringAnsiString 的别名),默认情况下未定义 UNICODE。在 C++Builder 2009 之后的版本中(其中 StringUnicodeString 的别名),默认情况下定义 UNICODE,但如果遗留项目需要 can be turned off

由于您使用的是基于 TCHAR 的结构,因此在定义 字符串文字 时应使用基于 TCHARTEXT() 宏为此,例如:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    SHFILEOPSTRUCT fos;
    fos.hwnd = Handle;
    //operacja kopiowania
    fos.wFunc = FO_COPY;
    //plik źródłowy
    fos.pFrom = TEXT("C:\Melon\AGA\Bazy[=10=]"); // don't forget the extra null terminator!
    fos.pTo = TEXT("...[=10=]");
    ...
    SHFileOperation(&fos);
}

这将适用于所有 C++Builder 版本。

另一方面,如果您尝试使用 String 变量来定义结构的字符串,则只有当 UNICODEundefined[=51 时才有效=] 在 2009 之前的版本中, 在 post-2009 版本中定义,例如:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    String dirSrc("C:\Melon\AGA\Bazy[=11=]", 18); // don't forget the extra null terminator!
    String disDest(...);
    SHFILEOPSTRUCT fos;
    fos.hwnd = Handle;
    //operacja kopiowania
    fos.wFunc = FO_COPY;
    //plik źródłowy
    fos.pFrom = dirSrc.c_str();
    fos.pTo = dirDest.c_str();
    ...
    SHFileOperation(&fos);
}

如果您不想依赖 UNICODE 定义,那么您应该明确地使用 SHFILEOPSTRUCT 的 ANSI 或 Unicode 版本,具体取决于您是否使用 ANSI (char) 或 Unicode (wchar_t) 字符串,例如:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    SHFILEOPSTRUCTA fos;
    fos.hwnd = Handle;
    //operacja kopiowania
    fos.wFunc = FO_COPY;
    //plik źródłowy
    fos.pFrom = "C:\Melon\AGA\Bazy[=12=]"; // don't forget the extra null terminator!
    fos.pTo = "...[=12=]";
    ...
    SHFileOperationA(&fos);
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    SHFILEOPSTRUCTW fos;
    fos.hwnd = Handle;
    //operacja kopiowania
    fos.wFunc = FO_COPY;
    //plik źródłowy
    fos.pFrom = L"C:\Melon\AGA\Bazy[=13=]"; // don't forget the extra null terminator!
    fos.pTo = L"...[=13=]";
    ...
    SHFileOperationW(&fos);
}