2011-11-09 4 views
0

VBA (Excel)에서 사용하고있는 COM 개체 (C# .NET으로 작성)가 있는데 COM 개체의 필드를 열거하고 자동으로 참조합니다. .NET에서는 이것을 반영하여 수행 할 수 있습니다. VBA에서이 작업을 수행 할 수있는 방법이 있습니까?VBA에서 COM 개체의 메서드 나 필드를 열거 할 수 있습니까?

그래서, 대신 더 비슷해

Dim x As MyCOMObject 
Set x = New MyCOMObject 
x.f1 = 1 
x.f2 = 2 
x.f3 = 3 

의 :

Dim x As MyCOMObject 
Set x = New MyCOMObject 
For i = 0 to COMFieldCount(x) - 1 
    SetCOMField(x, GetCOMFieldName(i), i+1) 
Next i 
+1

. 이 작업을 수행하는 것에 대해 생각해 보셨습니까? –

+0

이 질문을보고 싶을 수도 있습니다 : http://stackoverflow.com/questions/547903/self-inspection-of-vb6-udts – GTG

+0

@parapurarajkumar, 왜 C#에서 리플렉션을 사용하여이 작업을 수행하지 않습니까? 나는이 문제를 해결하는 함수를 만들기 위해 노력하고있다. – Ben

답변

1

당신은 아마이 코드를 조금 수정해야합니다,하지만 당신이 찾고있는 것을 대략 않습니다. 먼저 "Typelib 정보", TLBINF32.dll에 대한 참조를 추가해야합니다. 이것이 Windows의 일부인지 또는 내 컴퓨터에 설치 한 수많은 SDK 중 일부와 함께 제공되는지는 잘 모르겠지만 System32 폴더에 있습니다.

COM 개체의 속성을 설정한다고 가정하므로 "속성 넣기"함수를 호출하여 개체의 값을 설정합니다. 이러한 속성의 데이터 유형을 확인해야 할 수도 있습니다. 코드에서 데이터 유형 변환을 수행하지 않았습니다.

코드는 다음과 같습니다 심지어 반사를 사용하여 C#에서이 작업을 수행 할 것

'Define the variables 
Dim tliApp As TLI.TLIApplication 
Dim typeinfo As TLI.typeinfo 
Dim interface As TLI.InterfaceInfo 
Dim member As TLI.MemberInfo 

'Initialize typelib reflector 
Set tliApp = New TLI.TLIApplication 
'Get the type information about myObject (the COM object you want to process) 
Set typeinfo = tliApp.ClassInfoFromObject(myObject) 

'Set all properties of all the object's interfaces 
For Each interface In typeinfo.Interfaces 
    For Each member In interface.Members 
     'If this is a "property put" function 
     If member.InvokeKind = INVOKE_PROPERTYPUT Then 
      'Invoke the mebmer and set someValue to it. 
      'Note that you'll probably want to check what datatype to use and do some more error checking 
      CallByName myObject, member.Name, VbLet, someValue 
     End If 
    Next 
Next 
+0

CallByName은 내가 알지 못했던 매우 유용한 루틴입니다. 그러나 인식 할 수있는 인터페이스는 IDispatch (QueryInterface, AddRef 등) 및 몇 가지 추가 기능이므로 열거 형은 내 개체에서 작동하지 않습니다. 내 객체에서 ClassInfoFromObject에 의해 검색된 두 개의 인터페이스는 _MyObjectType 및 _Object입니다. 첫 번째는 단순히 IDispatch 인터페이스입니다. 두 번째 멤버에는 ToString, Equals, GetHashCode 및 GetType 멤버가 포함되어 있습니다. 또한 속성보다는 필드를 설정하고 싶습니다. 내 C# 모듈에서, 예를 들어 public double aDoubleField를 선언했습니다. – Ben

관련 문제