因为我可以开始使用新的RAD Studio Xe4,我想我会尝试一下。 不幸的是,我对C ++并不熟悉,因此我想知道为什么在VC ++中完美运行的代码在C ++ Builder中根本不起作用。 大多数问题都是转换不同的var类型。 例如:
std::string Test = " ";
GetFileAttributes(Test.c_str());
在VC ++中工作但在C ++ Builder中它不会编译,告诉我" E2034无法转换' const char *'到' wchar_t *'。 我错过了什么吗?在所有编译器上都没有相同的工作原因是什么? 感谢
答案 0 :(得分:6)
欢迎使用Windows Unicode / ASCII地狱。
功能
GetFileAttributes
实际上是一个定义为GetFileAttributesA
或GetFileAttributesW
的宏,具体取决于您是否包含_UNICODE
(或UNICODE
,或两者兼有?) Windows标头。 *A
变体采用char*
和相关参数,*W
函数采用wchar_t*
和相关参数。
我建议直接在新代码中调用宽*W
变体。这意味着只针对Windows代码切换到std :: wstring,并为跨平台应用程序选择一些经过深思熟虑的设计选择。
答案 1 :(得分:1)
您的C ++ Builder配置设置为使用UNICODE字符集,这意味着Win32 API已解析为其宽字符版本。因此,您需要在C ++代码中使用宽字符串。如果您将VS配置设置为使用UNICODE,则会出现相同的错误。
你可以试试这个:
// wstring = basic_string<wchar_t>
// _T macro ensures that the specified literal is a wide char literal
std::wstring Test = _T(" ");
GetFileAttributes(Test.c_str()); // c_str now returns const wchar_t*, not const char*
在此处查看有关_T / _TEXT宏的更多详细信息:http://docwiki.embarcadero.com/RADStudio/XE3/en/TCHAR_Mapping
答案 2 :(得分:1)
您已在Builder中定义了_UNICODE
和/或UNICODE
,但未在VC中对其进行定义。
大多数Windows API有两种版本的ANSI风格和UNICODE风格。
因为,当您致电SetWindowText
时,确实没有SetWindowText
个功能。相反,有2个不同的功能
- SetWindowTextA
采用ANSI字符串
和
- SetWindowTextW
,其中包含UNICODE字符串。
如果您的程序是使用/ DUNICODE / D_UNICODE编译的,SetWindowText
映射到SetWindowTextW which expects a
const wchar_t *`。
如果编译的程序未定义这些宏,则会映射到SetWindowTextA
,其中const char *
。
Windows标头通常会执行类似的操作来实现此目的。
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
同样,有2 GetFileAttributes
。
DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName);
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName);
在VC中,您尚未定义UNICODE / _UNICODE&amp;因此,您可以通过string::c_str()
返回char *
。
在Builder中,您可能已经定义了UNICODE / _UNICODE&amp;它需要wchar_t *
。
您可能没有明确地完成此UNICODE / _UNICODE事件 - 可能是IDE正在为您执行此操作 - 因此请检查IDE中的选项。
您有很多方法可以解决此问题
或
std::w_string
- 然后c_str()
将返回wchar_t *
或
GetFileAttributesA
而不是GetFileAttributes
- 您需要为这两种变体附带的每个其他Windows API执行此操作。