Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

node.dll的导出函数和回调,都是cdecl的 #568

Open
qqworker opened this issue Apr 4, 2023 · 1 comment
Open

node.dll的导出函数和回调,都是cdecl的 #568

qqworker opened this issue Apr 4, 2023 · 1 comment

Comments

@qqworker
Copy link

qqworker commented Apr 4, 2023

Miniblink是个好软件,尤其是对于体积要求高,不想跟着谷歌疲于奔命的小码农真的如获至宝。。
cef3的速度实在太慢,体积实在太大,使用实在太复杂。。

但是在不开源的情况下,VB6就很难引用node.dll集成做浏览器
1、VB6导入函数对于cdecl类型的dll,只要有参数的,调用时都会报"DLL调用约定错误"
Public Declare Function wkeCreateWebWindow _
Lib "node.dll" (ByVal wkeWindowType As Long, _
ByVal parent As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal width As Long, _
ByVal height As Long) As Long
image

2、虽然https://github.com/imxcstar/vb6-miniblink-SBrowser 实现了cdcel的导入函数,但是对于回调函数无解。。尤其是downlod2这个复杂的回调,下面这段是download2回调的声明:
typedef void* wkeNetJob;

typedef enum _wkeLoadingResult {
WKE_LOADING_SUCCEEDED,
WKE_LOADING_FAILED,
WKE_LOADING_CANCELED
} wkeLoadingResult;

typedef enum _wkeDownloadOpt {
kWkeDownloadOptCancel,
kWkeDownloadOptCacheData,
} wkeDownloadOpt;

typedef void(WKE_CALL_TYPEwkeNetJobDataRecvCallback)(void ptr, wkeNetJob job, const char* data, int length);
typedef void(WKE_CALL_TYPEwkeNetJobDataFinishCallback)(void ptr, wkeNetJob job, wkeLoadingResult result);

typedef struct _wkeNetJobDataBind {
void* param;
wkeNetJobDataRecvCallback recvCallback;
wkeNetJobDataFinishCallback finishCallback;
}wkeNetJobDataBind;

typedef wkeDownloadOpt(WKE_CALL_TYPEwkeDownload2Callback)(
wkeWebView webView,
void
param,
size_t expectedContentLength,
const char* url,
const char* mime,
const char* disposition,
wkeNetJob job,
wkeNetJobDataBind* dataBind);
上述代码中WKE_CALL_TYPE的宏定义是__cdecl。。
这个也是导致download2市面上VB甚至.Net上都没有案例能实现下载,因为不改node.dll实现不了回调,也就实现不了下载
C++默认函数是__cdecl, 默认回调函数是__stdcall,估计扫地僧为了方便编译,统一用了宏,但是一不小心就断绝了VB6的跟随者,例如我。。

3、在vfb这类型的语言,download2回调的时候,wkeNetJobDataBind的recvCallback、finishCallback必须也要声明为cdecl(特别感谢驰骋乾坤大神的提醒,不然这个问题一直发现不了问题。在这里再次感谢驰骋乾坤!):
Sub wkeNetJobDataRecvCallback cdecl(ByVal param As Any Ptr, job As wkeNetJob, ByVal dataIn As Any Ptr, ByVal length As Integer)
Debug.Print length
End Sub

Sub wkeNetJobDataFinishCallback cdecl(ByVal param As Any Ptr, job As wkeNetJob, ByVal result As Long)
Debug.Print result
End Sub

4、VIP版本mb.dll中mb开头的函数都改成了__stdcall,但是Vb6对调用的dll中多线程极度不友好,例如只要调用mbPopupDialogAndDownload这类型的函数,在IDE调试的时候没问题,但是生成exe之后一旦调用都会程序直接崩溃。这个要想兼容VB6,难度系数就很高了。。

PS:希望扫地僧能每次发布的时候带上一个stdcall的node.dll。。广大VB6开发者万分感谢。。

@qqworker
Copy link
Author

qqworker commented Apr 4, 2023

对于下载的问题。。建议增加一个配置,点击直接弹出文件选择框,点击保存直接下载。。而不需要download2这种回调来实现。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant