首页
社区
课程
招聘
[旧帖] VB+DLL(内嵌汇编的) 创建线程下回调 出错 不解 有没有人看下 0.00雪花
发表于: 2011-7-13 23:24 3080

[旧帖] VB+DLL(内嵌汇编的) 创建线程下回调 出错 不解 有没有人看下 0.00雪花

2011-7-13 23:24
3080
主要就是去PING一个IP,返回延迟,是创建线程的回调。

DLL 是 PowerBasic 编写的

'回调地址,IP,识别索引
Private Declare Sub Ping Lib "Net.dll" (byval BackCall as long , byval IpStr as string,byval KeyId as long)

Private Sub Btn_Click()
	Call Ping(addressof PingBackCall,"125.126.153.144",1)
End Sub

'模块

public sub PingBackCall(byval ms as long,byval keyid as long)
	if keyid = 1 then
		msgbox "a"
	end if
end sub

'DLL

'这是输出函数,主要创建PING的线程
SUB Ping ALIAS "Ping" (BYVAL BackCall AS DWORD ,BYVAL Ipstr AS STRING ,byval KeyId as dword ) EXPORT
    DIM hThread AS DWORD
    gBackCall = BackCall
    gIpstr = Ipstr
	gKeyId = KeyId
    hThread = CreateThread(BYVAL 0,0,CODEPTR(PingProc),0,0,gThreadID)
    SLEEP(30)
    CALL CloseHandle( hThread )
END SUB  

'这里是执行回调和传递参数给VB的 
'类似 Call Vb.PingBackCall(ms,gKeyId)

sub AsmBackCall(byval ms as dword)
	!push gKeyId
	!push ms
	!call gBackCall
end sub

'这里是执行PING的
sub PingProc()
....
	Call AsmBackCall(100) 结果
end sub

逻辑是这样的

VB 只是调用DLL,然后提供一个模块函数地址给DLL用回调用

当VB 调用DLL  Ping函数后 创建线程,在线程内进行PING操作

完成后 在线程里 调用 另外一个函数 进行汇编形式的CALL(回调 和传递值) 到VB模块函数地址

出错和不解的地方是有时候成功,有时候错误,有时候传递的参数是值的指针 。

如果在回调里输入msgbox "a" 有几率错误。

用DELPHI 和VC也测试过调用DLL,也遇到上面的问题,DLL里的感叹号是 汇编指令

而且我push 3个也不会出错

为了提问,所以代码直接文本写的,逻辑没错!

如果有更好的异步回调方法 也请告诉我下!,C++的DLL也行

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//