Как загрузить файл на компьютер - URLDownloadToFile

322
01 августа 2017, 17:48
#include <urlmon.h>    
#include <iostream>
#pragma comment(lib, "urlmon.lib")
using namespace std;

class MyCallback : public IBindStatusCallback
{
public:
    MyCallback() {}
    ~MyCallback() { }
    // This one is called by URLDownloadToFile
    STDMETHOD(OnProgress)(/* [in] */ ULONG ulProgress, /* [in] */ ULONG ulProgressMax, /* [in] */ ULONG ulStatusCode, /* [in] */ LPCWSTR wszStatusText)
    {
        cout << "Downloaded " << ulProgress << " of " << ulProgressMax << " byte(s), " << " Status Code = " << ulStatusCode << endl;
        return S_OK;
    }
    // The rest  don't do anything...
    STDMETHOD(OnStartBinding)(/* [in] */ DWORD dwReserved, /* [in] */ IBinding __RPC_FAR *pib)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(GetPriority)(/* [out] */ LONG __RPC_FAR *pnPriority)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(OnLowResource)(/* [in] */ DWORD reserved)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(OnStopBinding)(/* [in] */ HRESULT hresult, /* [unique][in] */ LPCWSTR szError)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(GetBindInfo)(/* [out] */ DWORD __RPC_FAR *grfBINDF, /* [unique][out][in] */ BINDINFO __RPC_FAR *pbindinfo)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(OnDataAvailable)(/* [in] */ DWORD grfBSCF, /* [in] */ DWORD dwSize, /* [in] */ FORMATETC __RPC_FAR *pformatetc, /* [in] */ STGMEDIUM __RPC_FAR *pstgmed)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(OnObjectAvailable)(/* [in] */ REFIID riid, /* [iid_is][in] */ IUnknown __RPC_FAR *punk)
    {
        return E_NOTIMPL;
    }
    // IUnknown stuff
    STDMETHOD_(ULONG, AddRef)()
    {
        return 0;
    }
    STDMETHOD_(ULONG, Release)()
    {
        return 0;
    }
    STDMETHOD(QueryInterface)(/* [in] */ REFIID riid, /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
    {
        return E_NOTIMPL;
    }
};

Пробую загрузить файл на диск C:\\

int main(int argc, char* argv[])
{
    std::wstring location = L"C:\\выходной файл";
    std::wstring url = L"https://www.codeproject.com/script/Articles/Download.aspx?file=/KB/winsdk/registrymonitor/RegistryMonitor_src.zip&rp=https://www.codeproject.com/Articles/4502/RegistryMonitor-a-NET-wrapper-class-for-RegNotifyC";
    MyCallback pCallback;
    URLDownloadToFile(NULL, url.c_str(), location.c_str(), 0, &pCallback);
    system("Pause");
    return 0;
}

Но файл не появляется, если же изменить путь в std::wstring location = L"C:\\"; на std::wstring location = L"C:\\File.rar" то файл появляется нужного размера, но открыть его невозможно, пишет что: Архив повреждён

READ ALSO
Оптимизация по времени и памяти

Оптимизация по времени и памяти

Задача: Для положительного целого числа n определим функцию f:

286
AddressSanitizer Stack Buffer Overflow

AddressSanitizer Stack Buffer Overflow

Есть следующий код

396
Как получить язык текущей локали

Как получить язык текущей локали

Есть ли кроссплатформенный вариант получения языка из текущей локали пользователя/системы(Не Си локали, а например ту, что в $LANG)? В Boost ничего...

293