Miniblink是一款非常值得推荐的精简版的cef3的浏览器组件,作者扫地僧是国内浏览器界的大咖。前几年他搞了个ie6的源码,再把chrome的js的内核整合编译搞了个怪咖出来,楼主对他敬佩之情犹如滔滔江水,绵绵不绝。。。
楼主是做了一个小众的BS架构的店务管理软件,在维护客户发现浏览器存在这几个问题:
1、体积巨大,一个浏览器动则上百兆甚至三四百兆
2、不同浏览器兼容很麻烦
3、同一个浏览器不同版本也存在兼容问题
4、服务器支持https,也支持http,但是浏览器打印插件只能使用http协议,谷歌新版本一旦点击进去https,除非进行蛮复杂的操作,不然再也回不去http了。
这些奇葩的问题,导致楼主在维护客户的时候很困难,于是萌生自己定制一款浏览器的想法。
由于VB多线程的兼容性不好,浏览器肯定会涉及到文件的下载(软件带有安装包下载、报表的下载),而Miniblink的VIP版本mb.dll点击下载回调是mbOnDownloadInBlinkThread,这个方法是在线程中调用的,VB使用mb开头的函数只要涉及到线程的话,在开发时能通过,但是到编译成程序后会直接崩溃。这个我跟扫地僧沟通过,VB6可能是太小众了。。
PS:VB最好不要调用API来使用多线程。。
所以我们需要调用的是node.dll,只能采用单线程的版本来试试。但是从文档来看,node.dll的导出是纯c模式,vb调用的时候会出现各种问题。我们要尝试一下重新编译一下node.dll。
Miniblink开源的版本到了2019.7.17号之后就停更了,转闭源的。考虑到之前踩坑,我还是使用开源的版本来进行编译。
于是通过github下载这个版本的dll和源码https://github.com/weolar/miniblink49/releases/
由于我们对程序的体积要求很高,我们采用的是vc6的输出版本。切换到vc6_release后,我们编译一下基础库,还有v8_5_7和v8_5_7_1两个dll。
如果选择的是No_Node版本,则编译的是v8_4_8和v8_4_8_1。
其它的则是v8_7_5和v8_7_5_1版本了。
在正式编译之前,得确保这些项目编译成功
最后再编译Miniblink这个项目和wkexe演示项目
1、把wke\wkedefine.h文件的宏定义修改为#define WKE_CALL_TYPE __stdcall
2、增加一个模块定义文件node.def把wke开头的函数包含进去。
LIBRARY node
EXPORTS
wkeAddDirtyArea
wkeAddNpapiPlugin
wkeAddPluginDirectory
wkeAwaken
wkeCanGoBack
wkeCanGoForward
wkeConfigure
wkeContentsHeight
wkeContentsWidth
wkeContextMenuEvent
wkeCookieEnabled
wkeCopy
wkeCreateMemBuf
wkeCreateString
wkeCreateStringW
wkeCreateWebCustomWindow
wkeCreateWebView
wkeCreateWebWindow
wkeCut
wkeDelete
wkeDeleteString
wkeDestroyWebView
wkeDestroyWebWindow
wkeDragTargetDragEnter
wkeDragTargetDragLeave
wkeDragTargetDragOver
wkeDragTargetDrop
wkeDragTargetEnd
wkeEditorCopy
wkeEditorCut
wkeEditorDelete
wkeEditorPaste
wkeEditorRedo
wkeEditorSelectAll
wkeEditorUnSelect
wkeEditorUndo
wkeEnableWindow
wkeFinalize
wkeFireContextMenuEvent
wkeFireKeyDownEvent
wkeFireKeyPressEvent
wkeFireKeyUpEvent
wkeFireMouseEvent
wkeFireMouseWheelEvent
wkeFireWindowsMessage
wkeFocus
wkeFreeMemBuf
wkeGC
wkeGetBlinkMainThreadIsolate
wkeGetCaret
wkeGetCaretRect
wkeGetClientHandler
wkeGetContentAsMarkup
wkeGetContentHeight
wkeGetContentWidth
wkeGetCookie
wkeGetCookieW
wkeGetCursorInfoType
wkeGetDebugConfig
wkeGetDocumentCompleteURL
wkeGetFrameUrl
wkeGetGlobalExecByFrame
wkeGetHeight
wkeGetHostHWND
wkeGetMediaVolume
wkeGetSource
wkeGetString
wkeGetStringW
wkeGetTempCallbackInfo
wkeGetTitle
wkeGetTitleW
wkeGetURL
wkeGetUserAgent
wkeGetUserKeyValue
wkeGetVersion
wkeGetVersionString
wkeGetViewDC
wkeGetWebViewByNData
wkeGetWebViewForCurrentContext
wkeGetWebviewId
wkeGetWidth
wkeGetWindowHandle
wkeGetZoomFactor
wkeGlobalExec
wkeGoBack
wkeGoForward
wkeGoToIndex
wkeGoToOffset
wkeHeight
wkeInit
wkeInitialize
wkeInitializeEx
wkeInsertCSSByFrame
wkeIsAwake
wkeIsCookieEnabled
wkeIsDirty
wkeIsDocumentReady
wkeIsInitialize
wkeIsLoadComplete
wkeIsLoadFailed
wkeIsLoaded
wkeIsLoading
wkeIsLoadingCompleted
wkeIsLoadingFailed
wkeIsLoadingSucceeded
wkeIsMainFrame
wkeIsProcessingUserGesture
wkeIsTransparent
wkeIsWebRemoteFrame
wkeIsWebviewAlive
wkeJsBindFunction
wkeJsBindGetter
wkeJsBindGetter
wkeKeyDown
wkeKeyPress
wkeKeyUp
wkeKillFocus
wkeLayoutIfNeeded
wkeLoadFile
wkeLoadFileW
wkeLoadHTML
wkeLoadHTMLW
wkeLoadHtmlWithBaseUrl
wkeLoadURL
wkeLoadURLW
wkeLoadW
wkeMediaVolume
wkeMouseEvent
wkeMouseWheel
wkeMoveToCenter
wkeMoveWindow
wkeNetAddHTTPHeaderFieldToUrlRequest
wkeNetCancelRequest
wkeNetCancelWebUrlRequest
wkeNetChangeRequestUrl
wkeNetContinueJob
wkeNetCopyWebUrlRequest
wkeNetCreatePostBodyElement
wkeNetCreatePostBodyElements
wkeNetCreateWebUrlRequest2
wkeNetCreateWebUrlRequest
wkeNetDeleteBlinkWebURLRequestPtr
wkeNetFreePostBodyElement
wkeNetFreePostBodyElements
wkeNetGetExpectedContentLength
wkeNetGetFavicon
wkeNetGetHTTPHeaderField
wkeNetGetHTTPHeaderFieldFromResponse
wkeNetGetHttpStatusCode
wkeNetGetMIMEType
wkeNetGetPostBody
wkeNetGetRequestMethod
wkeNetGetResponseUrl
wkeNetGetUrlByJob
wkeNetHoldJobToAsynCommit
wkeNetHookRequest
wkeNetOnResponse
wkeNetSetData
wkeNetSetHTTPHeaderField
wkeNetSetMIMEType
wkeNetStartUrlRequest
wkeNodeOnCreateProcess
wkeOnAlertBox
wkeOnConfirmBox
wkeOnConsole
wkeOnContextMenuItemClick
wkeOnCreateView
wkeOnDidCreateScriptContext
wkeOnDocumentReady2
wkeOnDocumentReady
wkeOnDownload2
wkeOnDownload
wkeOnDraggableRegionsChanged
wkeOnLoadUrlBegin
wkeOnLoadUrlEnd
wkeOnLoadUrlFail
wkeOnLoadingFinish
wkeOnMouseOverUrlChanged
wkeOnNavigation
wkeOnOtherLoad
wkeOnPaintBitUpdated
wkeOnPaintUpdated
wkeOnPluginFind
wkeOnPrint
wkeOnPromptBox
wkeOnStartDragging
wkeOnTitleChanged
wkeOnURLChanged2
wkeOnURLChanged
wkeOnWillMediaLoad
wkeOnWillReleaseScriptContext
wkeOnWindowClosing
wkeOnWindowDestroy
wkePaint2
wkePaint
wkePaste
wkePerformCookieCommand
wkePostURL
wkePostURLW
wkeRegisterEmbedderCustomElement
wkeReload
wkeRepaintIfNeeded
wkeResize
wkeResizeWindow
wkeRunJS
wkeRunJSW
wkeRunJsByFrame
wkeRunMessageLoop
wkeSaveMemoryCache
wkeSelectAll
wkeSetClientHandler
wkeSetContextMenuEnabled
wkeSetContextMenuItemShow
wkeSetCookie
wkeSetCookieEnabled
wkeSetCookieJarFullPath
wkeSetCookieJarPath
wkeSetCspCheckEnable
wkeSetCursorInfoType
wkeSetDebugConfig
wkeSetDeviceParameter
wkeSetDirty
wkeSetDragDropEnable
wkeSetDragEnable
wkeSetDragFiles
wkeSetEditable
wkeSetFileSystem
wkeSetFocus
wkeSetHandle
wkeSetHandleOffset
wkeSetHeadlessEnabled
wkeSetLanguage
wkeSetLocalStorageFullPath
wkeSetMediaPlayerFactory
wkeSetMediaVolume
wkeSetMemoryCacheEnable
wkeSetMouseEnabled
wkeSetName
wkeSetNavigationToNewWindowEnable
wkeSetNpapiPluginsEnabled
wkeSetProxy
wkeSetResourceGc
wkeSetString
wkeSetStringW
wkeSetTouchEnabled
wkeSetTransparent
wkeSetUIThreadCallback
wkeSetUserAgent
wkeSetUserAgentW
wkeSetUserKeyValue
wkeSetViewNetInterface
wkeSetViewProxy
wkeSetViewSettings
wkeSetWebViewName
wkeSetWindowTitle
wkeSetWindowTitleW
wkeSetZoomFactor
wkeShowDevtools
wkeShowWindow
wkeShutdown
wkeSleep
wkeStopLoading
wkeTitle
wkeTitleW
wkeToString
wkeToStringW
wkeUnfocus
wkeUtilBase64Decode
wkeUtilBase64Encode
wkeUtilCreateV8Snapshot
wkeUtilDecodeURLEscape
wkeUtilEncodeURLEscape
wkeUtilSerializeToMHTML
wkeUtilSetUiCallback
wkeGetVersion
wkeVersionString
wkeVisitAllCookie
wkeWake
wkeWebFrameGetMainFrame
wkeWebFrameGetMainWorldScriptContext
wkeWidth
wkeZoomFactor
PS:def的生成主要使用dumpbin /exports node.dll > node.def生成,然后通过正则替换掉不需要的
编译至少要16G的内存,不然会中途崩了。
编译之后的node.dll再给VB调用就可以通过stdcall调用了。
编译旧版的源码这个只是权宜之计,@龙泉扫地僧 下次更新的时候发布一个stdcall的node.dll出来呗。。最好能联调一下,让VB6也能支持上VIP版本的mb.dll。。