得到一个奇怪的价值,很奇怪

时间:2014-10-29 14:40:30

标签: 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)
            {
                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"。任何解决方案?

1 个答案:

答案 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并利用可用的功能。