以下是相关代码:
char* url;
url = "http://xxxx/index.txt";
TCHAR t_url[256];
charToTchar(url, t_url);
downloadFile(t_url);
两个功能:
charToTchar(const char *_char, TCHAR *tchar)
{
int iLength ;
iLength = MultiByteToWideChar (CP_ACP, 0, _char, strlen (_char) + 1, NULL, 0) ;
MultiByteToWideChar (CP_ACP, 0, _char, strlen (_char) + 1, tchar, iLength) ;
}
downloadFile(TCHAR *url_value)
{
TCHAR path[256];
SHGetSpecialFolderPath(NULL, path, 28 , false);
wcscat_s(path, _T("\\check.txt"));
char* c_url_value;
c_url_value = "";
int iLength ;
iLength = WideCharToMultiByte(CP_ACP, 0, url_value, -1, NULL, 0, NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, url_value, -1, c_url_value, iLength, NULL, NULL);
DeleteUrlCacheEntry(c_url_value);
HRESULT hr = URLDownloadToFile(0, url_value, path, 0, 0);
}
正确的TCHAR路径应如下所示:
C:。。\ ...... \ L.o.c.a.l \ c.h.e.c.k ... t.x.t
但是,当我第二次运行" downloadFile"功能,TCHAR路径变得如此奇怪:
C:\ ....... \ L.o.c.a.l.index.txt.k.t.x.t
ps我使用VC ++并且我认为它不支持" wcscat_s"。任何解决方案?
答案 0 :(得分:0)
如果字符集类型是Unicode,那么从一开始就使用char *是不正确的。
TCHAR url[] = _T("http://xxxx/index.txt");
DeleteUrlCacheEntry(url);
downloadFile(url);
函数DeleteUrlCacheEntry
需要LPCTSTR
。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa383983%28v=vs.85%29.aspx
此类型的定义取决于Visual C ++的构建设置。如果构建是UNICODE
,则字符串类型是16位,而不是8位。
因此,要构建中性",要使用的类型是TCHAR
,并且可以使用_T
宏来创建字符串常量。
当选择的字符集类型为Unicode(Visual Studio 2010)时,以下程序成功编译:
#include <tchar.h>
#include <windows.h>
#include <WinInet.h>
int main()
{
TCHAR url[] = _T("http://xxxx/index.txt");
DeleteUrlCacheEntry(url);
}
如果选择了UNICODE构建,则以下程序无法成功编译:
#include <tchar.h>
#include <windows.h>
#include <WinInet.h>
int main()
{
char* url = "http://xxxx/index.txt";
DeleteUrlCacheEntry(url);
}
错误如下:
错误C2664:&#39; DeleteUrlCacheEntryW&#39; :无法从&#39; char *&#39;转换参数1到LPCWSTR&#39; 指向的类型是无关的;转换需要reinterpret_cast,C风格的转换或函数式转换
如果你确定它是UNICODE并且不会成为任何其他字符集构建,你可以避开所有这些并只使用std::wstring
,而不是{{1} }和TCHAR
。或者更好的是,您可以使用_T
并利用可用的功能。