日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言获取dll文件路径,C语言URLDownloadToFile获取文件下载进度

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言获取dll文件路径,C语言URLDownloadToFile获取文件下载进度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

URLDownloadToFile是urlmon.dll提供的網絡操作API,可以用于從指定的URL下載文件到本地,在C++中通過類很容易實現下載進度的獲取,今天需要在C語言中使用到這個函數,這里記錄一下使用方法。該函數的定義如下所示。

HRESULT URLDownloadToFile(

LPUNKNOWN pCaller,

LPCTSTR szURL,

LPCTSTR szFileName,

_Reserved_ DWORD dwReserved,

LPBINDSTATUSCALLBACK lpfnCB

);

參數pCaller跟ActiveX和COM有關,如有興趣參考

參數szURL為下載地址,地址的協議必須要是IE瀏覽器所支持的

參數szFileName為文件最終的保存路徑,例如C:/a.txt

參數dwReserved保留,始終為0

參數lpfnCB是一個IBindStatusCallback指針。

在urlmon.h頭文件的定義中,C語言風格的接口定義如下:

typedef struct IBindStatusCallbackVtbl

{

BEGIN_INTERFACE

HRESULT ( STDMETHODCALLTYPE *QueryInterface )(

__RPC__in IBindStatusCallback * This,

/* [in] */ __RPC__in REFIID riid,

/* [annotation][iid_is][out] */

_COM_Outptr_ void **ppvObject);

ULONG ( STDMETHODCALLTYPE *AddRef )(

__RPC__in IBindStatusCallback * This);

ULONG ( STDMETHODCALLTYPE *Release )(

__RPC__in IBindStatusCallback * This);

HRESULT ( STDMETHODCALLTYPE *OnStartBinding )(

__RPC__in IBindStatusCallback * This,

/* [in] */ DWORD dwReserved,

/* [in] */ __RPC__in_opt IBinding *pib);

HRESULT ( STDMETHODCALLTYPE *GetPriority )(

__RPC__in IBindStatusCallback * This,

/* [out] */ __RPC__out LONG *pnPriority);

HRESULT ( STDMETHODCALLTYPE *OnLowResource )(

__RPC__in IBindStatusCallback * This,

/* [in] */ DWORD reserved);

HRESULT ( STDMETHODCALLTYPE *OnProgress )(

__RPC__in IBindStatusCallback * This,

/* [in] */ ULONG ulProgress,

/* [in] */ ULONG ulProgressMax,

/* [in] */ ULONG ulStatusCode,

/* [unique][in] */ __RPC__in_opt LPCWSTR szStatusText);

HRESULT ( STDMETHODCALLTYPE *OnStopBinding )(

__RPC__in IBindStatusCallback * This,

/* [in] */ HRESULT hresult,

/* [unique][in] */ __RPC__in_opt LPCWSTR szError);

/* [local] */ HRESULT ( STDMETHODCALLTYPE *GetBindInfo )(

IBindStatusCallback * This,

/* [out] */ DWORD *grfBINDF,

/* [unique][out][in] */ BINDINFO *pbindinfo);

/* [local] */ HRESULT ( STDMETHODCALLTYPE *OnDataAvailable )(

IBindStatusCallback * This,

/* [in] */ DWORD grfBSCF,

/* [in] */ DWORD dwSize,

/* [in] */ FORMATETC *pformatetc,

/* [in] */ STGMEDIUM *pstgmed);

HRESULT ( STDMETHODCALLTYPE *OnObjectAvailable )(

__RPC__in IBindStatusCallback * This,

/* [in] */ __RPC__in REFIID riid,

/* [iid_is][in] */ __RPC__in_opt IUnknown *punk);

END_INTERFACE

} IBindStatusCallbackVtbl;

interface IBindStatusCallback

{

CONST_VTBL struct IBindStatusCallbackVtbl *lpVtbl;

};

這里的interface在C語言中的定義為struct, IBindStatusCallback回調實際上就是一個結構體,結構體只有一個字段IBindStatusCallbackVtbl *指針,你需要做的就是對這個結構體內的IBindStatusCallbackVtbl 指針進行實例化。IBindStatusCallbackVtbl 結構中包含了一系列的函數指針,也就是用于URLDownloadToFile下載時的回調函數。若要實現下載進度的獲取,只需要在OnProgress回調中處理即可。

控制臺示例代碼

#define _CRT_SECURE_NO_WARNINGS

#include

#include

#include

#pragma comment(lib,"urlmon")

HRESULT (STDMETHODCALLTYPE QueryInterface)(

IBindStatusCallback* This,

/* [in] */ REFIID riid,

/* [iid_is][out] */ void** ppvObject)

{

return E_NOTIMPL;

}

ULONG (STDMETHODCALLTYPE AddRef)(

IBindStatusCallback* This)

{

return E_NOTIMPL;

}

ULONG (STDMETHODCALLTYPE Release)(

IBindStatusCallback* This)

{

return E_NOTIMPL;

}

HRESULT (STDMETHODCALLTYPE OnStartBinding)(

IBindStatusCallback* This,

/* [in] */ DWORD dwReserved,

/* [in] */ IBinding* pib)

{

return E_NOTIMPL;

}

HRESULT (STDMETHODCALLTYPE GetPriority)(

IBindStatusCallback* This,

/* [out] */ LONG* pnPriority)

{

return E_NOTIMPL;

}

HRESULT (STDMETHODCALLTYPE OnLowResource)(

IBindStatusCallback* This,

/* [in] */ DWORD reserved)

{

return E_NOTIMPL;

}

HRESULT (STDMETHODCALLTYPE OnProgress)(

IBindStatusCallback* This,

/* [in] */ ULONG ulProgress,

/* [in] */ ULONG ulProgressMax,

/* [in] */ ULONG ulStatusCode,

/* [in] */ LPCWSTR szStatusText)

{

if (ulProgress == 0) {

return S_OK;

}

printf("%d / %d bytes , %.2f%%\n",

ulProgress, ulProgressMax,100*(double)ulProgress/(double)ulProgressMax);

return S_OK;

}

HRESULT (STDMETHODCALLTYPE OnStopBinding)(

IBindStatusCallback* This,

/* [in] */ HRESULT hresult,

/* [unique][in] */ LPCWSTR szError)

{

return E_NOTIMPL;

}

HRESULT (STDMETHODCALLTYPE GetBindInfo)(

IBindStatusCallback* This,

/* [out] */ DWORD* grfBINDF,

/* [unique][out][in] */ BINDINFO* pbindinfo)

{

return E_NOTIMPL;

}

HRESULT (STDMETHODCALLTYPE OnDataAvailable)(

IBindStatusCallback* This,

/* [in] */ DWORD grfBSCF,

/* [in] */ DWORD dwSize,

/* [in] */ FORMATETC* pformatetc,

/* [in] */ STGMEDIUM* pstgmed)

{

return E_NOTIMPL;

}

HRESULT (STDMETHODCALLTYPE OnObjectAvailable)(

IBindStatusCallback* This,

/* [in] */ REFIID riid,

/* [iid_is][in] */ IUnknown* punk)

{

return E_NOTIMPL;

}

int main(int argc,char * argv[]) {

char path[MAX_PATH];

char downloadURL[] ="https://down.qq.com/qqweb/PCQQ/PCQQ_EXE/PCQQ2020.exe";

IBindStatusCallback callBack;

IBindStatusCallbackVtbl vtbl;

vtbl.QueryInterface = QueryInterface;

vtbl.AddRef = AddRef;

vtbl.Release = Release;

vtbl.OnStartBinding = OnStartBinding;

vtbl.GetPriority = GetPriority;

vtbl.OnLowResource = OnLowResource;

vtbl.OnProgress = OnProgress;//進度回調操作

vtbl.OnStopBinding = OnStopBinding;

vtbl.GetBindInfo = GetBindInfo;

vtbl.OnDataAvailable = OnDataAvailable;

vtbl.OnObjectAvailable = OnObjectAvailable;

callBack.lpVtbl = &vtbl;

GetTempPath(sizeof(path),path);

strcat(path, "tmpqq.exe");

printf("保存位置: %s\n", path);

URLDownloadToFile(NULL,downloadURL, path,0,&callBack);

return 0;

}

掃碼領個紅包作為打賞吧~~

(余額寶支付時可抵現)

喜歡 (2)or分享 (0)

總結

以上是生活随笔為你收集整理的c语言获取dll文件路径,C语言URLDownloadToFile获取文件下载进度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。