2012-06-20 3 views
2

Учитывая объект типа clsPerson:Могу ли я создать новый объект на основе его типа?

dim oP as New clsPerson 
oP.FirstName = "Sam" 

есть способ опрашивать переменную oP и создать новый объект этого типа?

+0

'TypeName (oP)' должно указывать имя класса (в данном случае 'clsPerson'). Или вы пытаетесь взять имя класса и использовать что-то вроде «CreateObject» для его программного создания? – JimmyPena

+0

@Jp Это именно то, что я пытаюсь сделать. Но CreateObject не работает, поэтому я отказался от этого подхода. Кажется, что CreateObject работает с объектами, зарегистрированными в реестре. – AngryHacker

+0

Я пробовал 'CreateObject (TypeName (oP))' и он терпит неудачу. Кажется, у вас уже есть представление о ProgID объекта. – JimmyPena

ответ

1

Если класс правильно зарегистрирован 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 найден в проекте -> Ссылки.

+0

'GetAnotherInstanceOf' фактически ничего не возвращает. – AngryHacker

+0

@AngryHacker. Буфер возвращаемого значения функции передается по ссылке на API и заполняется указателем. – GSerg

+0

Я вижу, довольно умный. Вот проблема. Объект является внутренним объектом, закрытым для EXE. Поэтому '.ClassInfoFromObject' не будет работать. Но вы после GUID, поэтому я попробовал '.InterfaceInforFromObject', который также возвращает GUID. Однако возвращаемое значение GetAnotherInstanceOf всегда ничто. Может ли это работать для внутренних объектов? – AngryHacker

Смежные вопросы