win32进程中的函数(称之为void cCB())调用VB6 Sub(称之为vb6S,它从cCB接收一些数字数据类型数据.cCB最初通过AddressOf接收vb6S引用。
我有两个基本的新手问题:
问题1:当vb6S()执行其代码时,cCB的线程是否被调用阻止?
问题2:如果cCB的线程终止和cCB,VB是否会有任何“问题” 在vb6S完成其工作之前,内存是否已取消分配?
修改 : 的 为了回应代码请求(并且感谢那个downvote),这是问题所在:
该任务是一个微秒计时器,用于在调试两个通过WM_COPYDATA消息进行通信的VB应用程序时解锁两个VB IDE的WM队列。
那就是:有应用程序Alice和Bob。当Alice向Bob发送wm74(WM_COPYDATA)消息时,Bob会挂钩,将信息保存在copydatastruct中,然后完成消息。问题是,现在,在调试中,只要调试器处于断点,Alice和Bob的消息队列都会被阻塞。在那时杀死一个或两个IDE并不需要很长时间。
所以我想要实现的是一个旧的Java Applet技巧:Bob调用进程,等待一小段时间,然后回调。在进程失败时,Bob可以发布消息,即app / IDE告诉Windows消息处理,Alice可以开展业务。为此,在返回之前,Bob的消息处理程序调用win32 DLL函数,例如:
typedef void (__stdcall *FUNCPTR)(int);
void __stdcall ExecuteCallback(FUNCPTR cbAddress, double microS){};
Bob称之为
ExecuteCallback AddressOf My74Processor, 250
其中My74Processor包含应用程序逻辑,用于根据Alice放入消息结构中的代码中的案例处理字符串。
ExecuteCallback从那些队列中抓取现有的timingWork代码对象,并通过workQueue管理器将其放入线程队列,该管理器知道在timingWork类的适当位置启动线程。
在计时工作计时器通过观察QueryPerformanceCounter计时250微秒(在这种情况下)后,它会在
处回叫Bob的Sub Sub My74Processor(ByVal reason as Long)
并终止。 timingWork对象不会被破坏;它做的最后一件事就是将自己放回可用对象的队列中。另一方面,该线程终止,并且在线程队列中可用于更多,可能不同的工作,当它再次出现时。
回到Bob,Sub My74Processor中的处理代码中设置了一个断点。那么,我的问题就是这样:
(a)当该断点被击中,并且程序员需要一些时间来检查变量和逻辑,然后继续该过程,在My74Processor结束后,Bob的IDE堆栈中的一切都会正常吗?
(b)当timingWork例程进行回调时,该线程是否会被阻止?
我几乎可以肯定(b)的答案是“不”。我很担心,并且没有足够的经验与VB6知道答案。
EDIT2 @wqw,我得出了与昨晚睡觉相同的结论,但不是因为你在评论中说明的正确理由。
怎么样:使用相同的进程外调用,而不是回调函数,发送cCB信息,以便向VB6S发送WM_COMMAND消息,欺骗其中一个控件的状态更改,比如一个按钮,但是-CB ?然后ExecuteCallback(..)变为ExecuteClickback(..)
void __stdcall ExecuteClickback(WORD butID, HANDLE hBut, HANDLE hVB6S, double microS){};
timerWork对象执行WM_COMMAND的PostMessage
到hVB6S的表格:
wParam = (DWORD) ( (butID << sizeof(WORD)) + (WORD) BN_CLICKED ); lParam = hBut;
然后,VB6S的表单应该提升它的butCB_Click()事件。该事件处理程序将具有调用My74Processor()的指令。由于一旦调用ExecuteClickback,VB6S必然处于纯消息等待状态,WM_COMMAND的到达应该“看”到VB6S,就像用户实际点击按钮一样。