背景:最近开始实习(打工)生涯。
需求:使用miniblink,显示网页,点击下载链接,可以实现下载。
寻求大佬帮助,得到了wke.h版本的下载相关的代码。
这里进行一些简单的分析:
实际语句:
wkeOnDownload2(webView, onDownloadCallback, nullptr);
通过调用该函数实现:
点击链接,实现下载功能。
函数原型:
ITERATOR3(void, wkeOnDownload2, wkeWebView webView, wkeDownload2Callback callback, void* param, "")这个是wke的导出函数。格式按照【返回类型】【函数名】【参数】来排列。
那么wkeDownload2Callback是?
typedef wkeDownloadOpt(WKE_CALL_TYPE*wkeDownload2Callback)( wkeWebView webView, void* param, size_t expectedContentLength, const char* url, const char* mime, const char* disposition, wkeNetJob job, wkeNetJobDataBind* dataBind);
wkeDownload2Callback是一个函数指针类型。
指向的函数的类型形如:
wkeDownloadOpt 函数名( wkeWebView webView, void* param, size_t expectedContentLength, const char* url, const char* mime, const char* disposition, wkeNetJob job, wkeNetJobDataBind* dataBind);
返回值,函数名,参数列表都比较清晰了。
这是传递的实际形参的函数:
static wkeDownloadOpt WKE_CALL_TYPE onDownloadCallback(wkeWebView webView, void* param, size_t expectedContentLength, const char* url, const char* mime, const char* disposition, wkeNetJob job, wkeNetJobDataBind* dataBind) { //忽略 }
关于返回值类型:
typedef enum _wkeDownloadOpt { kWkeDownloadOptCancel, kWkeDownloadOptCacheData, } wkeDownloadOpt;
kWkeDownloadOptCancel:0
kWkeDownloadOptCacheData:1类似bool
背景:上面的功能代码是wke.h版本的,我需要把它修改成mb.h版本的。
然后卡住了。
这是我报错的语句:
mbOnDownload(this->mbView, onDownloadCallback, nullptr);
函数原型:
ITERATOR3(void, mbOnDownload, mbWebView webView, mbDownloadCallback callback, void* param, "")
声明了一个函数指针类型:mbDownloadCallback
typedef BOOL(MB_CALL_TYPE *mbDownloadCallback)(
mbWebView webView,
void* param,
mbWebFrameHandle frameId,
const char* url,
void* downloadJob);
所以该函数指针指向的函数应该形如:
BOOL 函数名(
mbWebView webView,
void* param,
mbWebFrameHandle frameId,
const char* url,
void* downloadJob);
这是实际要调用的函数:
static mbDownloadOpt MB_CALL_TYPE onDownloadCallback(mbWebView webView,
void* param,
size_t expectedContentLength,
const char* url,
const char* mime,
const char* disposition,
mbNetJob job,
mbNetJobDataBind* dataBind);
分析可知,onDownloadCallback函数与mbDownloadCallback函数指针类型不匹配。
然后我发现我搞错了。。。
我应该调用这个函数:
void mbOnDownloadInBlinkThread(
mbWebView webView,
mbDownloadInBlinkThreadCallback callback,
void* param)
mbDownloadInBlinkThreadCallback这个函数指针类型与onDownloadCallback相匹配
typedef mbDownloadOpt(MB_CALL_TYPE* mbDownloadInBlinkThreadCallback)(
mbWebView webView,
void* params,
size_t expectedContentLength,
const char* url,
const char* mime,
const char* disposition,
mbNetJob job,
mbNetJobDataBind* dataBind
);
问题解决!!!