Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;URL下载文件到CLR论坛中的可执行目录 我试图找出如何修复我在C++中使用URLDead LooToFILE函数所拥有的两个问题。第一个问题是,当试图下载所讨论的文件时,直到CLR C++窗口关闭,下载才真正出现。第二个问题是,如下图所示,结果文件的文件名和扩展名(位于成功窗口上方)被弄乱了(尽管打开它通常会显示文件下载良好,但名称是例外)。如果有人对我如何解决这两个问题有任何建议,我将不胜感激_C++_Url_Download_Clr - Fatal编程技术网

C++;URL下载文件到CLR论坛中的可执行目录 我试图找出如何修复我在C++中使用URLDead LooToFILE函数所拥有的两个问题。第一个问题是,当试图下载所讨论的文件时,直到CLR C++窗口关闭,下载才真正出现。第二个问题是,如下图所示,结果文件的文件名和扩展名(位于成功窗口上方)被弄乱了(尽管打开它通常会显示文件下载良好,但名称是例外)。如果有人对我如何解决这两个问题有任何建议,我将不胜感激

C++;URL下载文件到CLR论坛中的可执行目录 我试图找出如何修复我在C++中使用URLDead LooToFILE函数所拥有的两个问题。第一个问题是,当试图下载所讨论的文件时,直到CLR C++窗口关闭,下载才真正出现。第二个问题是,如下图所示,结果文件的文件名和扩展名(位于成功窗口上方)被弄乱了(尽管打开它通常会显示文件下载良好,但名称是例外)。如果有人对我如何解决这两个问题有任何建议,我将不胜感激,c++,url,download,clr,C++,Url,Download,Clr,对于这种逻辑,我使用: { char buffer[MAX_PATH]; GetModuleFileNameA(NULL, buffer, MAX_PATH); std::string::size_type pos = std::string(buffer).find_last_of("\\/"); return std::string(buffer).substr(0, pos); } void StartDownload() {

对于这种逻辑,我使用:

{
    char buffer[MAX_PATH];
    GetModuleFileNameA(NULL, buffer, MAX_PATH);
    std::string::size_type pos = std::string(buffer).find_last_of("\\/");

    return std::string(buffer).substr(0, pos);
}

void StartDownload()
{
    HRESULT downloadUpdate;
    LPCTSTR downloadUrl = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png", File = "download.png";

    string currentDirectory = GetCurrentDirectory();
    LPTSTR currentDirectoryLPTSTR = new TCHAR[currentDirectory.size() + 1];

    std::string(currentDirectoryLPTSTR).append(File).c_str();

    downloadUpdate = URLDownloadToFile(0, downloadUrl, currentDirectoryLPTSTR, 0, 0);
    switch (downloadUpdate)
    {
    case S_OK:
        updateSuccess();
        break;
    case E_OUTOFMEMORY:
        updateOOMError();
        break;
    case INET_E_DOWNLOAD_FAILURE:
        updateError();
        break;
    default:
        updateErrorUnknown();
        break;
    }
}

[STAThread]
int main() {
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false);
    Application::Run(gcnew UpdaterGUIProject::UpdaterGUI()); 

    StartDownload();

    return 0;
}

LPTSTR currentDirectoryLPTSTR=newtchar[currentDirectory.size()+1]分配内存,但不使用任何数据填充内存

std::string(currentDirectoryLPTSTR)
创建一个新的
string
对象,并尝试将数据从
currentDirectoryLPTSTR
复制到
字符串中。这是未定义的行为,因为
currentDirectoryLPTSTR
不是正确的以null结尾的字符串。此代码不会导致
字符串
对象指向为
currentDirectoryLPTSTR
分配的内存,就像您清楚地认为的那样

然后将
append()
ing
File
添加到该
string
对象,而不是添加到
currentDirectoryLPTSTR
的内容

然后扔掉刚刚创建的
字符串
对象,按原样将未填充的
currentDirectoryLPTSTR
传递到
URLDownloadToFile()
。这就是为什么你的输出文件有一个混乱的文件名(你很幸运,它甚至显示在正确的文件夹中)

请尝试以下方法:

std::string GetCurrentDirectory()
{
字符缓冲区[MAX_PATH]={};
DWORD size=GetModuleFileNameA(空,缓冲区,最大路径);
if(size==0 | | size==MAX_PATH)返回“”;
字符串文件名(缓冲区、大小);
std::string::size\u type pos=fileName。查找(“\\/”)中的最后一个;
返回fileName.substr(0,位置+1);
}
void StartDownload()
{
HRESULT下载更新;
LPCSTR下载URL=”https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png,File=“download.png”;
字符串localFile=GetCurrentDirectory()+文件;
downloadUpdate=URLDownloadToFileA(0,downloadUrl,localFile.c_str(),0,0);
开关(下载更新)
{
案例S_OK:
updateSuccess();
打破
案例E_OUTOFMEMORY:
UpdateOmerRor();
打破
案例INET_E_下载失败:
updateError();
打破
违约:
updateErrorUnknown();
打破
}
}
另一方面,您确实不应该将文件下载到运行程序的文件夹中。如果您的程序安装在像
C:\program Files
C:\program Files(x86)
这样的文件夹中,只有管理员可以写入,则下载可能会失败。您应该下载到用户有写访问权的文件夹中,例如下载到您在
%APPDATA%
下创建的供程序使用的子文件夹中