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获取文件下载进度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R语言常用数据文件的导入
- 下一篇: 罗技驱动只能安装在c盘么?