进程外组件和进程内组件关闭时的条件,为何一个是没有窗体装载,另一个是没有窗体可见?

slowgrace 2009-08-16 02:09:03
进程外部件关闭的前提条件之一:没有装载的窗体。
进程内部件关闭的前提条件之一:没有可见的窗体。即使装载了只要不可见就可以被关闭。

为啥会有这种区别呢?这里面的道理何在?
...全文
137 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2009-08-21
  • 打赏
  • 举报
回复
就是说 VB 区分了代码调用还是 Watch 调用,后者不被中断。
slowgrace 2009-08-21
  • 打赏
  • 举报
回复
奇怪。虽然显然这个属性过程被调用了,但是属性过程的STOP却会被忽略。

'---------------------------------------------------------------------------------------
' Module : Class1
'---------------------------------------------------------------------------------------

Option Explicit

Private m_Value As Long

Property Get ValueCaption() As String
Dim sCaption As String
Stop
Select Case m_Value
Case 0: sCaption = "零"
Case 1: sCaption = "壹"
Case 2: sCaption = "贰"

End Select
ValueCaption = sCaption
End Property

Private Sub Class_Initialize()
m_Value = 2
End Sub



'---------------------------------------------------------------------------------------
' Module : Module1
'---------------------------------------------------------------------------------------

Option Explicit

Public Sub test()
Dim aa As Class1
Set aa = New Class1
Stop '此时到watch窗口观察,属性值已经有了
Set aa = Nothing
End Sub

Tiger_Zhao 2009-08-19
  • 打赏
  • 举报
回复
那么如果对象有下面这样一个属性,你觉得 Watch 不通过调用属性该如何监视 ValueCaption?
private m_Value as long

Property Get ValueCaption() as string
dim sCaption as string
select case m_Value
case 0: sCaption = "零"
case 1: sCaption = "壹"
case 2: sCaption = "贰"
...
end select
ValueCaption = sCaption
End Property
slowgrace 2009-08-19
  • 打赏
  • 举报
回复
不是吧。Watch又不是Debug.Print

照你这么说,Watch也太不靠谱了,居然会不反应对象当时当地的情况,而自行去调用对象的方法??!
Tiger_Zhao 2009-08-19
  • 打赏
  • 举报
回复
Watch 窗口访问了 hWnd 属性
slowgrace 2009-08-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 tiger_zhao 的回复:]
(1) 只 New 是不会创建窗口句柄的,不过你一访问 hWnd 属性就会自动创建,所以不能用作判断。
[/Quote]

我New了一个窗体,之后STOP,之后在Watch窗口观察它的Hwnd值,这时它已经有值了。像下面这样:

Public Sub test()
Dim aa As Form1
Set aa = New Form1
Stop
End Sub
Tiger_Zhao 2009-08-19
  • 打赏
  • 举报
回复
(1) 只 New 是不会创建窗口句柄的,不过你一访问 hWnd 属性就会自动创建,所以不能用作判断。
(2) 我已经说了,作不出确切的实例,也许是 VB 本身的升级改进背离了原先的设计意图,只有 VB 的开发者知道了。
slowgrace 2009-08-19
  • 打赏
  • 举报
回复
(1)貌似一个窗体类对象只要New了之后就有hwnd的值了,也就是说hwnd是窗体类对象与生俱来的属性。

(2)我试了只New一个部件内的窗体(不Show),也会导致一个进程内部件不能卸载。

(1)+(2)合起来倒是符合你在4楼关于hwnd和窗体可见的猜测。

不过的话,那我就更迷惑了。我实在想不出如何能有造一个来自部件内部的“invisible form”,让它存在,同时又让它不影响部件的整体卸载。
slowgrace 2009-08-19
  • 打赏
  • 举报
回复
8楼是拿进程内部件试的。
slowgrace 2009-08-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xxyj6450 的回复:]
Hide有句柄吧.
我觉得你说的是有模式窗体的问题.
当打开一个有模式窗体时,程序会挂起,直等有模式窗体操作结束.这个结束可是unload该窗体,也可以只需Hide该窗体,一定要使此窗体不可见才可继续进行操作(如结束进程).
而进程外,如果打开的有模式窗体只是隐藏起来,此时进程是肯定没有被关闭的,必需Unload掉才行.

[/Quote]

不是,我是拿无模式窗体做的实验,Hide无模式窗体之后释放部件的其他所有公共对象,部件仍然不能被卸载。
三断笛 2009-08-18
  • 打赏
  • 举报
回复
Hide有句柄吧.
我觉得你说的是有模式窗体的问题.
当打开一个有模式窗体时,程序会挂起,直等有模式窗体操作结束.这个结束可是unload该窗体,也可以只需Hide该窗体,一定要使此窗体不可见才可继续进行操作(如结束进程).
而进程外,如果打开的有模式窗体只是隐藏起来,此时进程是肯定没有被关闭的,必需Unload掉才行.
slowgrace 2009-08-18
  • 打赏
  • 举报
回复
请问赵,一个Show过之后Hide起来的Form,它在Hide状态下有句柄么?
m60a1 2009-08-17
  • 打赏
  • 举报
回复
未知的问题
Tiger_Zhao 2009-08-17
  • 打赏
  • 举报
回复
[Quote=MSDN:]§ 关闭进程内部件

最终,进程内部件的生命期由其客户端程序控制,因为该部件在客户端的进程中运行。一旦客户端关闭,该部件也将卸载,而不管那些未完成的对象引用、打开的窗体等。

当客户端不再使用某个部件提供的对象时,可能要求卸载该部件。Visual Basic 的进程内部件在响应客户端请求时是否卸载该部件,规则如下:

●该部件没有可见窗体。
 可见的窗体会使该部件保留在内存中,即使没有对象引用;而不可见的窗体则不会。[/Quote]
没有确切的实例可以证明,大概意识是说:
由于窗体是 Private 的,只要窗体不可见(我怀疑这里的意思是没有创建窗口句柄 hWnd,因为从 VB 设计的本意来说是直接面向对象不需要关心句柄的),那么该窗体与部件外部没有关系,应该可以随部件的卸载而关闭。
所以不可见窗体不会阻止部件的卸载。

可以实际上窗体实例也是一个对象,你的另外一个帖子就试图向外传递窗体对象,所以 VB 按照什么逻辑来判断窗体实例完全私有无法猜测。
slowgrace 2009-08-16
  • 打赏
  • 举报
回复
我好像理解错了,又或者MSDN写错了。因为我实际试验的结果是,对于ActiveX DLL,如果有不可见的窗体存在,它仍然不会被关闭的。

英文原文如下:

In-Process Component Shut Down
In the long run, the lifetime of an in-process component is controlled by its client, because the component runs in the client’s process. When the client closes, the component is unloaded regardless of any outstanding object references, open forms, and so on.

A client may ask an in-process component to unload when the client is no longer using objects the component provides. The following rules describe the way a Visual Basic in-process component determines whether it should unload in response to a client request.

The component has no forms visible.
A visible form will keep your component in memory, even if there are no object references; an invisible form will not.

……

来自:mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN\2001OCT\1033\vbcon98.chm::/Html/vbconstartingendingcomponent.htm
slowgrace 2009-08-16
  • 打赏
  • 举报
回复
MSDN
光宇广贞 2009-08-16
  • 打赏
  • 举报
回复
……

这是谁说的……

742

社区成员

发帖
与我相关
我的任务
社区描述
VB 版八卦、闲侃,联络感情地盘,禁广告帖、作业帖
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧