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_t
或 char
,具体取决于 [=18] =]分别定义与否。
在 C++Builder 6 中(其中 String
是 AnsiString
的别名),默认情况下未定义 UNICODE
。在 C++Builder 2009 之后的版本中(其中 String
是 UnicodeString
的别名),默认情况下定义 UNICODE
,但如果遗留项目需要 can be turned off。
由于您使用的是基于 TCHAR
的结构,因此在定义 字符串文字 时应使用基于 TCHAR
的 TEXT()
宏为此,例如:
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
变量来定义结构的字符串,则只有当 UNICODE
为 undefined[=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);
}
我有一个简单的目录处理代码,这里是其中的一部分。问题是,在旧版本的构建器中(我猜是 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_t
或 char
,具体取决于 [=18] =]分别定义与否。
在 C++Builder 6 中(其中 String
是 AnsiString
的别名),默认情况下未定义 UNICODE
。在 C++Builder 2009 之后的版本中(其中 String
是 UnicodeString
的别名),默认情况下定义 UNICODE
,但如果遗留项目需要 can be turned off。
由于您使用的是基于 TCHAR
的结构,因此在定义 字符串文字 时应使用基于 TCHAR
的 TEXT()
宏为此,例如:
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
变量来定义结构的字符串,则只有当 UNICODE
为 undefined[=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);
}