关于VB6可视对象类名的问题
VB6中的窗体及控件等,基本上都有它自己特定的“类名”。
比如:
窗体的类名是 ThunderRT6FormDC
图片框的类名是 ThunderRT6PictureBoxDC
编辑框的类名是 ThunderRT6TextBox
不知道哪位高人,能否知道VB6中,有没它的‘内部常量’来表示这些类名的?
[最优解释]
上面的代码在没引用TLBINF32.DLL文件时无法运行,修正如下:
Public Sub EnumVBObjectClassName(frmTest As Form)
Dim i As Long, j As Long
Dim tApp As Object
Dim ti As Object
Dim cci As Object
Dim mi As Object
Dim strClassName As String
Dim ctl As Control
On Error Resume Next
If frmTest Is Nothing Then Exit Sub
Debug.Print "Form", GetWindowClassName(frmTest.hwnd)
Set tApp = CreateObject("TLI.TLIApplication")
Set ti = tApp.TypeLibInfoFromRegistry("{FCFB3D2E-A0FA-1068-A738-08002B3371B5}", 6, 0, 9)
For Each cci In ti.CoClasses
For i = 1 To cci.Interfaces.Count
For j = 1 To cci.Interfaces(i).Members.Count
Set mi = cci.Interfaces(i).Members(j)
If mi.Name = "hWnd" And mi.InvokeKind = 2 Then
Set ctl = frmTest.Controls.Add("VB." + cci.Name, "test_" + cci.Name + "_1")
If Err.Number = 0 And ctl.hwnd <> 0 Then
Debug.Print cci.Name, GetWindowClassName(ctl.hwnd)
frmTest.Controls.Remove ctl
Else
Err.Clear
End If
Exit For
End If
Next
Next
Next
End Sub
[其他解释]
木有,内部只需要使VB6中的类名就可以了啊,你要的话,GetWindowClass之类的函数来获取就可以了啊
------其他解决方案--------------------
不会有常量,原因很简单,OCX可以是官方的也可以是第三方的,如果官方需要定义一个常量来代表一个对象的话,那么第三方怎么办?你还让不让第三方开发OCX?
它不像message可以有常量来定义出所有消息的名称,因为这东西只是官方的,没听说过还能有第三方的自定义一个系统消息名出来!(当然了什么HOOK之类出来的名称这东西不能算.......)
[其他解释]
既然是内部常量,当然是外部不可访问的。
VB 设计上就是对基础的 API 进行封装,使得程序员只需要关心 Form、PictureBox、TextBox。
[其他解释]
GetWindowClass之类的函数来获取就可以了啊
[其他解释]
先坐沙发上等回复。
[其他解释]
遍历VB的控件就行了,代码如下:
Option Explicit
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Sub Form_Load()
EnumVBObjectClassName Me
End Sub
Public Sub EnumVBObjectClassName(frmTest As Form)
Dim i As Long, j As Long
Dim tApp As TLI.TLIApplication
Dim ti As Object
Dim cci As Object
Dim mi As Object
Dim strClassName As String
Dim ctl As Control
On Error Resume Next
If frmTest Is Nothing Then Exit Sub
Debug.Print "Form", GetWindowClassName(frmTest.hwnd)
Set tApp = CreateObject("TLI.TLIApplication")
Set ti = tApp.TypeLibInfoFromRegistry("{FCFB3D2E-A0FA-1068-A738-08002B3371B5}", 6, 0, 9)
For Each cci In ti.CoClasses
For i = 1 To cci.Interfaces.Count
For j = 1 To cci.Interfaces(i).Members.Count
Set mi = cci.Interfaces(i).Members(j)
If mi.Name = "hWnd" And mi.InvokeKind = INVOKE_PROPERTYGET Then
Set ctl = frmTest.Controls.Add("VB." + cci.Name, "test_" + cci.Name + "_1")
If Err.Number = 0 And ctl.hwnd <> 0 Then
Debug.Print cci.Name, GetWindowClassName(ctl.hwnd)
frmTest.Controls.Remove ctl
Else
Err.Clear
End If
Exit For
End If
Next
Next
Next
End Sub
Private Function GetWindowClassName(ByVal hwnd As Long) As String
Dim strBuffer As String
strBuffer = String(255, vbNullChar)
GetWindowClassName = VBA.Left(strBuffer, GetClassName(hwnd, strBuffer, Len(strBuffer)))
End Function
另,我机器上的VB跟你的类名不一样,窗口是ThunderFormDC
[其他解释]
如果你机器上VB的UUID跟代码中的不一样,可以通过OLE VIEW工具查找“C:\Program Files\Microsoft Visual Studio\VB98\VB6.OLB”文件中的UUID
[其他解释]
不是不一样。
你把所有 Debug.Print 改为输出到窗口中,编译后运行,就跟我说的一样了。
我再说一下:
我需要找的是VB6.0的 IDE内定义好的常量。 其它方面不在这个问题的范畴。
谢谢你的代码!
[其他解释]
哎……
自己顶下…………
[其他解释]
该回复于2012-10-04 22:19:53被版主删除
[其他解释]
应该说,我对问题的需求描述,已经说得很明白了。
欢迎顶贴,更欢迎给出了我需要的东西。
但是…………我欢迎自作聪明……
[其他解释]
郁闷,居然少了个字!
更正一下,应该是:
但是…………我不欢迎自作聪明……
[其他解释]
唉……
这儿连打酱油路过的都太少了。
[其他解释]
我说的是“类名”的常量。这个常量跟对象扯不上关系吧。
“如果官方需要定义一个常量来代表一个对象”显然是不成立、不存在的假设。
你觉得可能这样做吗…………
并且,IDE本身提供些什么常量,跟‘第三方’也不会有什么冲突,也跟第三方没任何关联。
你提到了message,我也顺便用这个来说一下。比如:
MsgBox "消息内容。", 64, "消息"
这里的64在代码中就是一个常数(常量),我可以用系统定义的 vbInformation 代替这个64。
同样也可以自己声明一个合法的常量,其值为64,我这句代码中就能不用写64或vbInformation,
而写上我自己声明好的那个常量名。
(当然这里用一个变量作为参数也完全合法,只要其值为64,效果就是一样的)
[其他解释]
老鸟,你真会抠字眼啊……
很明显我说的不是那个意思,我说的内部,指的是开发环境内。
如果仅限于编译器内部能用的,我去关心它干什么呢?
结贴了,反正这个问题也没太大的意义,大不了在必要时自己定义一下。