问题描述
我正在使用 Visual Studio 2019 在通用 Windows 程序中使用 WinInet 创建 FTP 下载器。
Visual Studio 2019 没有提供在属性配置选项卡中更改字符集的选项。
我需要将以下多字节格式的内容转换为 Unicode:
CHAR * szHead[] = "Accept: */*\r\n\r\n";
整个代码来自以前使用具有多字节字符集选项的编译器的旧项目,并且按原样运行良好。不幸的是,我需要在支持 Windows 应用商店的编译器中完成这项工作,该编译器只有 Unicode。
if (!(hConnect = InternetopenUrlW(hOpen,szUrl,szHead,strlen(szHead),INTERNET_FLAG_DONT_CACHE,0)))
我收到以下错误:
Error (active) E0520 initialization with '{...}' expected for aggregate object
Error C2440 'initializing': cannot convert from 'const wchar_t [16]' to 'LPCTSTR []'
Error C2664 'size_t strlen(const char *)': cannot convert argument 1 from 'LPCTSTR []' to 'const char *'
从其他研究来看,这些错误的产生是因为编译器期望使用 Unicode,但是却得到了多字节。
解决方法
首先,CHAR * szHead[] = "Accept: */*\r\n\r\n";
不会编译。您正在尝试使用单个常量指针初始化非常量指针数组。您需要改用它:
CHAR szHead[] = "Accept: */*\r\n\r\n";`
或者这个:
const CHAR * szHead = "Accept: */*\r\n\r\n";
话虽如此,InternetOpenUrlW()
需要 WCHAR
字符串(因此名称中包含 W
),而不是 CHAR
字符串。您是否考虑过简单地使用 InternetOpenUrlA()
代替?
CHAR szHead[] = "Accept: */*\r\n\r\n";
if (!(hConnect = InternetOpenUrlA(...,szHead,-1,)))
如果这不是一个选项,那么您将不得不:
- 使用
MultiByteToWideChar()
(或等效的)将CHAR
字符串转换为WCHAR
字符串,例如:
CHAR szHead[] = "Accept: */*\r\n\r\n";
WCHAR wszHead[16];
...
MultiByteToWideChar(CP_ACP,wszHead,_countof(wszHead));
if (!(hConnect = InternetOpenUrlW(...,...)))
- 或者简单地使用
WCHAR
字符串开头,例如:
WCHAR szHead[] = L"Accept: */*\r\n\r\n";
...
if (!(hConnect = InternetOpenUrlW(...,...)))
,
这解决了错误信息
LPCWSTR szHead = L"接受:/\r\n\r\n";
我不知道程序是否有效,因为我得到 3 个未解析的外部对象。如果我从链接器取消链接 Wininet.lib,我会在 Visual Studio 6.0 中得到完全相同的错误消息。
我需要找到一种在 Wininet.lib 中进行链接的方法,但是这个编译器没有给你任何明显或简单的方法来做到这一点。我说的是visual studio 2019社区版
,实际上,您可以在 Visual Studio 2019 中添加 wininet.lib。您可以添加现有项目并导航到 vc98 lib 文件夹,然后单击 wininet.lib,编译器将其直接放入构建中,错误消失了。不幸的是,您似乎无法使用在商店项目中下载其他代码的代码,因为我发现该应用在下载开始时中止并显示不支持操作。使用 c# 下载文件有更简单、更当前的方法,但即使使用当前代码简单的 C# 代码,当下载开始说不支持操作时,应用程序也会中止