bstrProgId作为string结尾的“.1”是什么意思?

当dynamic创build一个用户窗体布局,同时添加控件,我发现语法需要在bstrProgId的末尾“.1”作为string在下面的代码位:

For loopthroughsteps = 0 To 0 For foodgroup_id = 0 To 6 'For vit = 2 To 18 For vit = 2 To 3 Dim listbox As Object Set listbox = UserForm3.Controls.Add("Forms.Listbox.1", foodgroup_id & "-" & vit & "-" & loopthroughsteps, True) With listbox .Left = 35 * (vit - 1) + 205 * (vit - 2) .Top = 25 + (foodgroup_id) * 50 .Height = 50 .Width = 205 End With Next vit Next foodgroup_id Next loopthroughsteps 

什么是“.1”后Controls.Add("Forms.Listbox做或意味着什么?

我在文档中找不到它,但我很好奇;

  • 它是一个控制forms的索引,但为什么它(总是)1? 为什么它会是一个string中的数字?

  • 或者是某种迹象,如果是的话?

 Add(ProgID, Name, Visible) 

第一个参数progID只是一个string,COM工厂parsing并决定创build哪个对象。 它没有被指定为类的编程名称(即types名称),而是对象工厂映射到给定类的string。

为什么是"Forms.Listbox.1"而不是Forms.Listbox ? 这个“.1”背后的原因与实现有关,很可能是由于开发和维护VBA的开发团队中的“版本控制”。 开发人员只需要使用UserForm.Add方法中logging的指定string“progID”。

除了其他好的答案,这里是一些文件(太多的评论)…

如果您使用Regedit.exe特别是CLASSES_ROOT \ CLSIDconfiguration单元来注册registry,那么您将看到类似这样的内容

 [HKEY_CLASSES_ROOT\CLSID\{884e2013-217d-11da-b2a4-000e7bbb2b09}] [HKEY_CLASSES_ROOT\CLSID\{884e2013-217d-11da-b2a4-000e7bbb2b09}\ProgID] @="X509Enrollment.CAlternativeName.1" [HKEY_CLASSES_ROOT\CLSID\{884e2013-217d-11da-b2a4-000e7bbb2b09}\VersionIndependentProgID] @="X509Enrollment.CAlternativeName" 

因此可以看到一个ProgID和一个VersionIndependentProgID 。 用这个可以控制要实例化的控件的版本。

这里是Microsoft文档链接VersionIndependentProgID