Учитывая объект типа clsPerson:Могу ли я создать новый объект на основе его типа?
dim oP as New clsPerson
oP.FirstName = "Sam"
есть способ опрашивать переменную oP
и создать новый объект этого типа?
Учитывая объект типа clsPerson:Могу ли я создать новый объект на основе его типа?
dim oP as New clsPerson
oP.FirstName = "Sam"
есть способ опрашивать переменную oP
и создать новый объект этого типа?
Если класс правильно зарегистрирован COM (то есть, исходя из проекта длл ActiveX), то да:
Option Explicit
Private Type Guid
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Const CLSCTX_INPROC_SERVER As Long = 1
Private Const IID_IUnknown As String = "{00000000-0000-0000-C000-000000000046}"
Private Declare Function CLSIDFromString Lib "ole32.dll" (ByVal lpsz As Long, ByRef pclsid As Guid) As Long
Private Declare Function IIDFromString Lib "ole32.dll" (ByVal lpsz As Long, ByRef lpiid As Guid) As Long
Private Declare Function CoCreateInstance Lib "ole32.dll" (ByRef rclsid As Guid, ByVal pUnkOuter As Long, ByVal dwClsContext As Long, ByRef riid As Guid, ByRef ppv As Object) As Long
Public Function GetAnotherInstanceOf(ByVal this As Object) As Object
Static iunk As Guid
If iunk.Data4(7) = 0 Then
IIDFromString StrPtr(IID_IUnknown), iunk
End If
Dim ti As TLI.TypeInfo
With New TLI.TLIApplication
Set ti = .ClassInfoFromObject(this)
End With
Dim clsid As Guid
CLSIDFromString StrPtr(ti.Guid), clsid
CoCreateInstance clsid, 0, CLSCTX_INPROC_SERVER, iunk, GetAnotherInstanceOf
End Function
Использование:
Dim s As New MSXML2.DOMDocument60
Dim clone As Object
MsgBox TypeName(clone)
Set clone = GetAnotherInstanceOf(s)
MsgBox TypeName(clone)
TLI
является TypeLib Information
найден в проекте -> Ссылки.
'GetAnotherInstanceOf' фактически ничего не возвращает. – AngryHacker
@AngryHacker. Буфер возвращаемого значения функции передается по ссылке на API и заполняется указателем. – GSerg
Я вижу, довольно умный. Вот проблема. Объект является внутренним объектом, закрытым для EXE. Поэтому '.ClassInfoFromObject' не будет работать. Но вы после GUID, поэтому я попробовал '.InterfaceInforFromObject', который также возвращает GUID. Однако возвращаемое значение GetAnotherInstanceOf всегда ничто. Может ли это работать для внутренних объектов? – AngryHacker
'TypeName (oP)' должно указывать имя класса (в данном случае 'clsPerson'). Или вы пытаетесь взять имя класса и использовать что-то вроде «CreateObject» для его программного создания? – JimmyPena
@Jp Это именно то, что я пытаюсь сделать. Но CreateObject не работает, поэтому я отказался от этого подхода. Кажется, что CreateObject работает с объектами, зарегистрированными в реестре. – AngryHacker
Я пробовал 'CreateObject (TypeName (oP))' и он терпит неудачу. Кажется, у вас уже есть представление о ProgID объекта. – JimmyPena