C 得到一个奇数,真是奇数
以下是相关代码:C 得到一个奇数,真是奇数,c,visual-c++,C,Visual C++,以下是相关代码: char* url; url = "http://xxxx/index.txt"; TCHAR t_url[256]; charToTchar(url, t_url); downloadFile(t_url); 两个功能: charToTchar(const char *_char, TCHAR *tchar)
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。有解决方案吗?如果字符集类型为Unicode,则从一开始就使用char*是不正确的
TCHAR url[] = _T("http://xxxx/index.txt");
DeleteUrlCacheEntry(url);
downloadFile(url);
函数DeleteUrlCacheEntry采用LPCTSTR
<>这个类型的定义取决于VisualC++的生成设置。如果构建是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:“DeleteUrlCacheEntryW”:无法将参数1从“char*”转换为“LPCWSTR”
指向的类型是不相关的;转换需要重新解释转换、C样式转换或函数样式转换
如果您确信它是UNICODE,并且永远不会是任何其他字符集构建,那么您可以避免所有这些,只使用std::wstring而不是TCHAR和_t。或者更好的是,您可以使用std::basic_字符串并利用可用的函数。为什么要在char和TCHAR之间来回跳跃?它们不是一回事。DelteUrlCacheEntry使用指向TCHAR的指针,而不是char*。使用tchar定义的方法“\u tcscat”我建议url应该是const char*@PaulMcKenzie,因为如果我传递char*url,DelteUrlCacheEntry会出错。错误C2664:“DeleteUrlCacheEntry”:无法将参数1从“unsigned short*”转换为“const char*”ps。我正在执行一个unicode项目。@corn3lius Nah。。。仍然得到奇数值。没有人需要再支持windows 98了,没有理由再使用TCHAR或_T了。只要使用宽字符串。@Mgetz-没人是个大字。也许大多数。无论如何,我的最后一段强调了这一点。我得到了这样一条:“DeleteUrlCacheEntry”:无法将参数1从“unsigned short[42]”转换为“const char*”,那么您就不是在编译Unicode版本。看看我编辑的答案和小样本程序。当字符集类型为UNICODE时,它可以在VisualStudio2010中干净地编译 内置UNICODE:项目设置->c/c++->预处理器定义->UNICODE,UNICODE,对吗?