[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

microsoft.public.vb.general.discussion

Object interface replicator

mm

6/19/2012 4:57:00 AM

This message is related to the other thread "mimic the Printer and
PictureBox interface, but Print, Circle, PSet?"

I wrote a routine to make the replication of the interface of an object in
an automated way.
The result is copied into the Clipboard.

This project needs a reference to TLBINF32.DLL and a Command button.

The code:

Option Explicit

Private Enum InvokeKinds
INVOKE_UNKNOWN = 0
INVOKE_FUNC = 1
INVOKE_PROPERTYGET = 2
INVOKE_PROPERTYPUT = 4
INVOKE_PROPERTYPUTREF = 8
'Special TLI values
INVOKE_EVENTFUNC = 16
INVOKE_CONST = 32
End Enum

Private Sub Command1_Click()
ReplicateInterface Printer
End Sub

Private Sub ReplicateInterface(nObject As Object)
Dim iTLB As InterfaceInfo
Dim sMemberName As String
Dim sInvokeKind As String
Dim m As Long
Dim p As Long
Dim m2 As Long
Dim iText As String
Dim iStr As String
Dim iMemberName As String

Set iTLB = TLI.InterfaceInfoFromObject(nObject)

' Properties
iText = "' Properties" & vbCrLf & vbCrLf
' Get
For m = 1 To iTLB.Members.Count
If iTLB.Members(m).InvokeKind = INVOKE_PROPERTYGET Then
iMemberName = iTLB.Members(m).Name
iText = iText & "' " & iTLB.Members(m).HelpString & vbCrLf
iText = iText & "Public Property Get " & iMemberName & "("
If iTLB.Members(m).Parameters.Count = 0 Then
iText = iText & ") As " &
VarTypeName(iTLB.Members(m).ReturnType)
Else
For p = 1 To iTLB.Members(m).Parameters.Count
iStr = iTLB.Members(m).Parameters(p).Name
If iTLB.Members(m).Parameters(p).Name = "" Then
iStr = "Index"
End If
iText = iText & iStr & " As " &
VarTypeName(iTLB.Members(m).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m).Parameters.Count Then
iText = iText & ", "
End If
Next p
iText = iText & ") As " &
VarTypeName(iTLB.Members(m).ReturnType)
End If
iText = iText & vbCrLf & vbCrLf
iText = iText & "End Property"
iText = iText & vbCrLf & vbCrLf

' Let
For m2 = 1 To iTLB.Members.Count
If iTLB.Members(m2).InvokeKind = INVOKE_PROPERTYPUT Then
If iTLB.Members(m2).Name = iMemberName Then
iText = iText & "Public Property Let " & iMemberName
& "("
If iTLB.Members(m2).Parameters.Count = 0 Then
iText = iText & "nValue As " &
VarTypeName(iTLB.Members(m2).ReturnType) & ")"
Else
For p = 1 To iTLB.Members(m2).Parameters.Count
iStr = iTLB.Members(m2).Parameters(p).Name
If iTLB.Members(m2).Parameters(p).Name = ""
Then
iStr = "Index"
End If
iText = iText & iStr & " As " &
VarTypeName(iTLB.Members(m2).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m2).Parameters.Count
Then
iText = iText & ", "
End If
Next p
iText = iText & "nValue As " &
VarTypeName(iTLB.Members(m2).ReturnType) & ")"
End If
iText = iText & vbCrLf & vbCrLf
iText = iText & "End Property"
iText = iText & vbCrLf & vbCrLf
End If
End If
Next m2

' Set
For m2 = 1 To iTLB.Members.Count
If iTLB.Members(m2).InvokeKind = INVOKE_PROPERTYPUTREF Then
If iTLB.Members(m2).Name = iMemberName Then
iText = iText & "Public Property Set " & iMemberName
& "("
If iTLB.Members(m2).Parameters.Count = 0 Then
iText = iText & "nValue As " &
VarTypeName(iTLB.Members(m2).ReturnType) & ")"
Else
For p = 1 To iTLB.Members(m2).Parameters.Count
iStr = iTLB.Members(m2).Parameters(p).Name
If iTLB.Members(m2).Parameters(p).Name = ""
Then
iStr = "Index"
End If
iText = iText & iStr & " As " &
VarTypeName(iTLB.Members(m2).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m2).Parameters.Count
Then
iText = iText & ", "
End If
Next p
iText = iText & "nValue As " &
VarTypeName(iTLB.Members(m2).ReturnType) & ")"
End If
iText = iText & vbCrLf & vbCrLf
iText = iText & "End Property"
iText = iText & vbCrLf & vbCrLf
End If
End If
Next m2
iText = iText & vbCrLf
End If
Next

'Let without Get
For m = 1 To iTLB.Members.Count
If iTLB.Members(m).InvokeKind = INVOKE_PROPERTYPUT Then
If InStr(iText, "Public Property Let " & iTLB.Members(m).Name) =
0 Then
iText = iText & "' " & iTLB.Members(m).HelpString & vbCrLf
iText = iText & "Public Property Let " &
iTLB.Members(m).Name & "("
If iTLB.Members(m).Parameters.Count = 0 Then
iText = iText & "nValue As " &
VarTypeName(iTLB.Members(m).ReturnType) & ")"
Else
For p = 1 To iTLB.Members(m).Parameters.Count
iStr = iTLB.Members(m).Parameters(p).Name
If iTLB.Members(m).Parameters(p).Name = "" Then
iStr = "Index"
End If
iText = iText & iStr & " As " &
VarTypeName(iTLB.Members(m).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m).Parameters.Count Then
iText = iText & ", "
End If
Next p
iText = iText & "nValue As " &
VarTypeName(iTLB.Members(m).ReturnType) & ")"
End If
iText = iText & vbCrLf & vbCrLf
iText = iText & "End Property"
iText = iText & vbCrLf & vbCrLf
End If
End If
Next m

' Set without Get
For m = 1 To iTLB.Members.Count
If iTLB.Members(m).InvokeKind = INVOKE_PROPERTYPUTREF Then
If InStr(iText, "Public Property Set " & iTLB.Members(m).Name) =
0 Then
iText = iText & "' " & iTLB.Members(m).HelpString & vbCrLf
iText = iText & "Public Property Set " &
iTLB.Members(m).Name & "("
If iTLB.Members(m).Parameters.Count = 0 Then
iText = iText & "nValue As " &
VarTypeName(iTLB.Members(m).ReturnType) & ")"
Else
For p = 1 To iTLB.Members(m).Parameters.Count
iStr = iTLB.Members(m).Parameters(p).Name
If iTLB.Members(m).Parameters(p).Name = "" Then
iStr = "Index"
End If
iText = iText & iStr & " As " &
VarTypeName(iTLB.Members(m).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m).Parameters.Count Then
iText = iText & ", "
End If
Next p
iText = iText & "nValue As " &
VarTypeName(iTLB.Members(m).ReturnType) & ")"
End If
iText = iText & vbCrLf & vbCrLf
iText = iText & "End Property"
iText = iText & vbCrLf & vbCrLf
End If
End If
Next m
iText = iText & vbCrLf

' Methods
iText = iText & "' Methods" & vbCrLf & vbCrLf

For m = 1 To iTLB.Members.Count
If iTLB.Members(m).InvokeKind = INVOKE_FUNC Then
If iTLB.Members(m).ReturnType = 24 Then
iText = iText & "' " & iTLB.Members(m).HelpString & vbCrLf
iText = iText & "Public Sub " & iTLB.Members(m).Name & "("
If iTLB.Members(m).Parameters.Count = 0 Then
iText = iText & ")"
Else
For p = 1 To iTLB.Members(m).Parameters.Count
iStr = iTLB.Members(m).Parameters(p).Name
If iTLB.Members(m).Parameters(p).Name = "" Then
iStr = "Index"
End If
iText = iText & iStr & " As " &
VarTypeName(iTLB.Members(m).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m).Parameters.Count Then
iText = iText & ", "
End If
Next p
iText = iText & ")"
End If
iText = iText & vbCrLf & vbCrLf
iText = iText & "End Sub"
iText = iText & vbCrLf & vbCrLf & vbCrLf
End If
End If
Next m
iText = iText & vbCrLf & vbCrLf

' Functions
iText = iText & "' Functions" & vbCrLf & vbCrLf

For m = 1 To iTLB.Members.Count
If iTLB.Members(m).InvokeKind = INVOKE_FUNC Then
If iTLB.Members(m).ReturnType <> 24 Then
iText = iText & "' " & iTLB.Members(m).HelpString & vbCrLf
iText = iText & "Public Function " & iTLB.Members(m).Name &
"("
If iTLB.Members(m).Parameters.Count = 0 Then
iText = iText & ") As " &
VarTypeName(iTLB.Members(m).ReturnType)
Else
For p = 1 To iTLB.Members(m).Parameters.Count
iStr = iTLB.Members(m).Parameters(p).Name
If iTLB.Members(m).Parameters(p).Name = "" Then
iStr = "Index"
End If
iText = iText & iStr & " As " &
VarTypeName(iTLB.Members(m).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m).Parameters.Count Then
iText = iText & ", "
End If
Next p
iText = iText & ") As " &
VarTypeName(iTLB.Members(m).ReturnType)
End If
iText = iText & vbCrLf & vbCrLf
iText = iText & "End Function"
iText = iText & vbCrLf & vbCrLf & vbCrLf
End If
End If
Next m
iText = iText & vbCrLf & vbCrLf


Clipboard.Clear
Clipboard.SetText iText
End Sub

Private Function VarTypeName(nVarType As Long) As String
Select Case nVarType
Case 0
VarTypeName = "CustomType"
Case 2
VarTypeName = "Integer"
Case 3, 10
VarTypeName = "Long"
Case 4
VarTypeName = "Single"
Case 5
VarTypeName = "Double"
Case 6
VarTypeName = "Currency"
Case 7
VarTypeName = "Date"
Case 8
VarTypeName = "String"
Case 9, 13
VarTypeName = "Object"
Case 11
VarTypeName = "Boolean"
Case 12, 1, 36
VarTypeName = "Variant"
Case 14
VarTypeName = "Decimal"
Case 17
VarTypeName = "Byte"
Case 8192
VarTypeName = "Array"
Case Else
Stop
End Select
End Function


24 Answers

mm

6/19/2012 4:59:00 AM

0


"Eduardo" <mm@mm.com> escribió en el mensaje
news:jrp0qh$d7h$1@speranza.aioe.org...

Sorry that the lines are wrapped, if someone wants it I can upload the file
to somewhere.


mm

6/19/2012 5:34:00 AM

0

Version 2, I added more functionality:

Option Explicit

Private Enum InvokeKinds
INVOKE_UNKNOWN = 0
INVOKE_FUNC = 1
INVOKE_PROPERTYGET = 2
INVOKE_PROPERTYPUT = 4
INVOKE_PROPERTYPUTREF = 8
'Special TLI values
INVOKE_EVENTFUNC = 16
INVOKE_CONST = 32
End Enum

Private mProperties() As String
Private mPropertiesTypes() As String

Private Sub Command1_Click()
ReplicateInterface Printer
End Sub

Private Sub ReplicateInterface(nObject As Object)
Dim iTLB As InterfaceInfo
Dim sMemberName As String
Dim sInvokeKind As String
Dim m As Long
Dim p As Long
Dim m2 As Long
Dim iText As String
Dim iStr As String
Dim iMemberName As String
Dim iTypeName As String

Set iTLB = TLI.InterfaceInfoFromObject(nObject)
ReDim mProperties(0)

' Properties
iText = "' Properties" & vbCrLf & vbCrLf
' Get
For m = 1 To iTLB.Members.Count
If iTLB.Members(m).InvokeKind = INVOKE_PROPERTYGET Then
iMemberName = iTLB.Members(m).Name
iTypeName = VarTypeName(iTLB.Members(m).ReturnType)
AddProperty iMemberName, iTypeName
iText = iText & "' " & iTLB.Members(m).HelpString & vbCrLf
iText = iText & "Public Property Get " & iMemberName & "("
If iTLB.Members(m).Parameters.Count = 0 Then
iText = iText & ") As " & iTypeName
Else
For p = 1 To iTLB.Members(m).Parameters.Count
iStr = iTLB.Members(m).Parameters(p).Name
If iTLB.Members(m).Parameters(p).Name = "" Then
iStr = "Index"
End If
iText = iText & iStr & " As " & VarTypeName( _
iTLB.Members(m).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m).Parameters.Count Then
iText = iText & ", "
End If
Next p
iText = iText & ") As " & iTypeName
End If
iText = iText & vbCrLf
iText = iText & " " & iMemberName & " = m" & _
iTLB.Members(m).Name & vbCrLf
iText = iText & "End Property"
iText = iText & vbCrLf & vbCrLf

' Let
For m2 = 1 To iTLB.Members.Count
If iTLB.Members(m2).InvokeKind = INVOKE_PROPERTYPUT Then
If iTLB.Members(m2).Name = iMemberName Then
iText = iText & "Public Property Let " & iMemberName
& "("
If iTLB.Members(m2).Parameters.Count = 0 Then
iText = iText & "nValue As " & _
VarTypeName(iTLB.Members(m2).ReturnType) &
")"
Else
For p = 1 To iTLB.Members(m2).Parameters.Count
iStr = iTLB.Members(m2).Parameters(p).Name
If iTLB.Members(m2).Parameters(p).Name = ""
Then
iStr = "Index"
End If
iText = iText & iStr & " As " &
VarTypeName( _
iTLB.Members(m2).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m2).Parameters.Count
Then
iText = iText & ", "
End If
Next p
iText = iText & "nValue As " & VarTypeName( _
iTLB.Members(m2).ReturnType) & ")"
End If
iText = iText & vbCrLf
iText = iText & " m" & iMemberName & _
" = nValue" & vbCrLf & vbCrLf
iText = iText & "End Property"
iText = iText & vbCrLf & vbCrLf
End If
End If
Next m2

' Set
For m2 = 1 To iTLB.Members.Count
If iTLB.Members(m2).InvokeKind = INVOKE_PROPERTYPUTREF Then
If iTLB.Members(m2).Name = iMemberName Then
iText = iText & "Public Property Set " & iMemberName
& "("
If iTLB.Members(m2).Parameters.Count = 0 Then
iText = iText & "nValue As " & VarTypeName( _
iTLB.Members(m2).ReturnType) & ")"
Else
For p = 1 To iTLB.Members(m2).Parameters.Count
iStr = iTLB.Members(m2).Parameters(p).Name
If iTLB.Members(m2).Parameters(p).Name = ""
Then
iStr = "Index"
End If
iText = iText & iStr & " As " &
VarTypeName( _
iTLB.Members(m2).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m2).Parameters.Count
Then
iText = iText & ", "
End If
Next p
iText = iText & "nValue As " & VarTypeName( _
iTLB.Members(m2).ReturnType) & ")"
End If
iText = iText & vbCrLf
iText = iText & " Set m" & iMemberName & _
" = nValue" & vbCrLf & vbCrLf
iText = iText & "End Property"
iText = iText & vbCrLf & vbCrLf
End If
End If
Next m2
iText = iText & vbCrLf
End If
Next

'Let without Get
For m = 1 To iTLB.Members.Count
If iTLB.Members(m).InvokeKind = INVOKE_PROPERTYPUT Then
If InStr(iText, "Public Property Let " & iTLB.Members(m).Name) =
0 Then
iTypeName = VarTypeName(iTLB.Members(m).ReturnType)
AddProperty iTLB.Members(m).Name, iTypeName
iText = iText & "' " & iTLB.Members(m).HelpString & vbCrLf
iText = iText & "Public Property Let " &
iTLB.Members(m).Name & "("
If iTLB.Members(m).Parameters.Count = 0 Then
iText = iText & "nValue As " & iTypeName & ")"
Else
For p = 1 To iTLB.Members(m).Parameters.Count
iStr = iTLB.Members(m).Parameters(p).Name
If iTLB.Members(m).Parameters(p).Name = "" Then
iStr = "Index"
End If
iText = iText & iStr & " As " & VarTypeName( _
iTLB.Members(m).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m).Parameters.Count Then
iText = iText & ", "
End If
Next p
iText = iText & "nValue As " & iTypeName & ")"
End If
iText = iText & vbCrLf
iText = iText & " m" & iMemberName & _
" = nValue" & vbCrLf & vbCrLf
iText = iText & "End Property"
iText = iText & vbCrLf & vbCrLf
End If
End If
Next m

' Set without Get
For m = 1 To iTLB.Members.Count
If iTLB.Members(m).InvokeKind = INVOKE_PROPERTYPUTREF Then
If InStr(iText, "Public Property Set " & iTLB.Members(m).Name) =
0 Then
iTypeName = VarTypeName(iTLB.Members(m).ReturnType)
AddProperty iTLB.Members(m).Name, iTypeName
iText = iText & "' " & iTLB.Members(m).HelpString & vbCrLf
iText = iText & "Public Property Set " &
iTLB.Members(m).Name & "("
If iTLB.Members(m).Parameters.Count = 0 Then
iText = iText & "nValue As " & iTypeName & ")"
Else
For p = 1 To iTLB.Members(m).Parameters.Count
iStr = iTLB.Members(m).Parameters(p).Name
If iTLB.Members(m).Parameters(p).Name = "" Then
iStr = "Index"
End If
iText = iText & iStr & " As " & VarTypeName( _
iTLB.Members(m).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m).Parameters.Count Then
iText = iText & ", "
End If
Next p
iText = iText & "nValue As " & iTypeName & ")"
End If
iText = iText & vbCrLf
iText = iText & " Set m" & iMemberName & _
" = nValue" & vbCrLf & vbCrLf
iText = iText & "End Property"
iText = iText & vbCrLf & vbCrLf
End If
End If
Next m
iText = iText & vbCrLf

' Methods
iText = iText & "' Methods" & vbCrLf & vbCrLf

For m = 1 To iTLB.Members.Count
If iTLB.Members(m).InvokeKind = INVOKE_FUNC Then
If iTLB.Members(m).ReturnType = 24 Then
iText = iText & "' " & iTLB.Members(m).HelpString & vbCrLf
iText = iText & "Public Sub " & iTLB.Members(m).Name & "("
If iTLB.Members(m).Parameters.Count = 0 Then
iText = iText & ")"
Else
For p = 1 To iTLB.Members(m).Parameters.Count
iStr = iTLB.Members(m).Parameters(p).Name
If iTLB.Members(m).Parameters(p).Name = "" Then
iStr = "Index"
End If
iText = iText & iStr & " As " & VarTypeName( _
iTLB.Members(m).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m).Parameters.Count Then
iText = iText & ", "
End If
Next p
iText = iText & ")"
End If
iText = iText & vbCrLf & vbCrLf
iText = iText & "End Sub"
iText = iText & vbCrLf & vbCrLf & vbCrLf
End If
End If
Next m
iText = iText & vbCrLf & vbCrLf

' Functions
iText = iText & "' Functions" & vbCrLf & vbCrLf

For m = 1 To iTLB.Members.Count
If iTLB.Members(m).InvokeKind = INVOKE_FUNC Then
If iTLB.Members(m).ReturnType <> 24 Then
iText = iText & "' " & iTLB.Members(m).HelpString & vbCrLf
iText = iText & "Public Function " & iTLB.Members(m).Name &
"("
If iTLB.Members(m).Parameters.Count = 0 Then
iText = iText & ") As " & _
VarTypeName(iTLB.Members(m).ReturnType)
Else
For p = 1 To iTLB.Members(m).Parameters.Count
iStr = iTLB.Members(m).Parameters(p).Name
If iTLB.Members(m).Parameters(p).Name = "" Then
iStr = "Index"
End If
iText = iText & iStr & " As " & VarTypeName( _
iTLB.Members(m).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m).Parameters.Count Then
iText = iText & ", "
End If
Next p
iText = iText & ") As " & VarTypeName( _
iTLB.Members(m).ReturnType)
End If
iText = iText & vbCrLf & vbCrLf
iText = iText & "End Function"
iText = iText & vbCrLf & vbCrLf & vbCrLf
End If
End If
Next m
iText = iText & vbCrLf & vbCrLf

iStr = "Option Explicit" & vbCrLf & vbCrLf
For m = 1 To UBound(mProperties)
iStr = iStr & "Private m" & mProperties(m) & " As " & _
mPropertiesTypes(m) & vbCrLf
Next m
iStr = iStr & vbCrLf & vbCrLf

Clipboard.Clear
Clipboard.SetText iStr & iText
End Sub

Private Function VarTypeName(nVarType As Long) As String
Select Case nVarType
Case 0
VarTypeName = "CustomType"
Case 2
VarTypeName = "Integer"
Case 3, 10
VarTypeName = "Long"
Case 4
VarTypeName = "Single"
Case 5
VarTypeName = "Double"
Case 6
VarTypeName = "Currency"
Case 7
VarTypeName = "Date"
Case 8
VarTypeName = "String"
Case 9, 13
VarTypeName = "Object"
Case 11
VarTypeName = "Boolean"
Case 12, 1, 36
VarTypeName = "Variant"
Case 14
VarTypeName = "Decimal"
Case 17
VarTypeName = "Byte"
Case 8192
VarTypeName = "Array"
Case Else
Stop
End Select
End Function

Private Sub AddProperty(nName As String, nTypeName As String)
ReDim Preserve mProperties(UBound(mProperties) + 1)
mProperties(UBound(mProperties)) = nName

ReDim Preserve mPropertiesTypes(UBound(mProperties))
mPropertiesTypes(UBound(mProperties)) = nTypeName
End Sub


Larry Serflaten

6/19/2012 11:41:00 AM

0

Eduardo wrote:
>
> Sorry that the lines are wrapped, if someone wants it I can upload the file
> to somewhere.

Here's a place you can share your code....

http://www.planet-source...

LFS

Mayayana

6/19/2012 12:56:00 PM

0

I have a version here that doesn't require tlbinf32:

http://www.jsware.net/jsware/vbcode...

It's code for a typelib reader/object browser that uses
oleaut32.dll directly. Tlbinf32.dll is an unnecessary wrapper
around oleaut32.dll functionality. It's handy in that it can
be used by VBScript, but it's not a default system file, so
one can't depend on its presence.

Also, tlbinf32.dll distorts the original functions. (Explained
in the readme file in the download linked above.) There's
a pretty good help file for tlbinf32.dll but Matthew Curland,
and/or the other authors, took the liberty of reusing terms
used in the Windows typelib APIs in their creation of a
simple object model. It can get confusing if you then want to
refer to the actual API and you're used to the tlbinf32 object
model.

For what it's worth, I did a lot of searching on this because
I wanted to embed an object browser into an editor program.
The Microsoft MSDN docs, unsurprisingly, were of little help.
By far the most complete and clearly written information I
found was from one Sean Baxter, here:

http://spec.winprog.org...


mm

6/19/2012 5:35:00 PM

0


"Mayayana" <mayayana@invalid.nospam> escribió en el mensaje
news:jrpsp5$qhe$1@dont-email.me...
>I have a version here that doesn't require tlbinf32:
>
> http://www.jsware.net/jsware/vbcode...
>
> It's code for a typelib reader/object browser that uses
> oleaut32.dll directly. Tlbinf32.dll is an unnecessary wrapper
> around oleaut32.dll functionality. It's handy in that it can
> be used by VBScript, but it's not a default system file, so
> one can't depend on its presence.
>
> Also, tlbinf32.dll distorts the original functions. (Explained
> in the readme file in the download linked above.) There's
> a pretty good help file for tlbinf32.dll but Matthew Curland,
> and/or the other authors, took the liberty of reusing terms
> used in the Windows typelib APIs in their creation of a
> simple object model. It can get confusing if you then want to
> refer to the actual API and you're used to the tlbinf32 object
> model.
>
> For what it's worth, I did a lot of searching on this because
> I wanted to embed an object browser into an editor program.
> The Microsoft MSDN docs, unsurprisingly, were of little help.
> By far the most complete and clearly written information I
> found was from one Sean Baxter, here:
>
> http://spec.winprog.org...


Thanks Mayayana.

I see that the Optional parameter information doesn't work with the code I'm
using.
It's not coded in what I posted, but I realized that I forgot to add that
(to add the optional information and the default value to parameters), then
I tried to add that to the code, but it seems that TLBINF32.DLL fails with
the Optional information (it always returns False), at least with the call
to InterfaceInfoFromObject as I'm doing.


mm

6/19/2012 6:03:00 PM

0


"Eduardo" <mm@mm.com> escribió en el mensaje
news:jrqd8d$t6a$1@speranza.aioe.org...

> Thanks Mayayana.
>
> I see that the Optional parameter information doesn't work with the code
> I'm using.
> It's not coded in what I posted, but I realized that I forgot to add that
> (to add the optional information and the default value to parameters),
> then I tried to add that to the code, but it seems that TLBINF32.DLL fails
> with the Optional information (it always returns False), at least with the
> call to InterfaceInfoFromObject as I'm doing.

I'm trying your code but the Optional information for parameters seems to be
missing also.


mm

6/19/2012 6:16:00 PM

0


"Eduardo" <mm@mm.com> escribió en el mensaje
news:jrqesp$1eh$1@speranza.aioe.org...

> I'm trying your code but the Optional information for parameters seems to
> be missing also.

But the VB' Object Browser retrieves it just fine, for example the
definition it states for PaintPicture:

Sub PaintPicture(Picture As IPictureDisp, X1 As Single, Y1 As Single,
[Width1], [Height1], [X2], [Y2], [Width2], [Height2], [Opcode])

With the brackets.

With my code I also have problems retrieving custom types (as "stdFont" or
"IPictureDisp") or user defined enums.

I don't know if I'll ever use this code, but it's good to have a replicator
that automatically provides the code to mimic another object interface.


Mayayana

6/19/2012 10:30:00 PM

0

| > I'm trying your code but the Optional information for parameters seems
to
| > be missing also.
|
| But the VB' Object Browser retrieves it just fine, for example the
| definition it states for PaintPicture:
|
| Sub PaintPicture(Picture As IPictureDisp, X1 As Single, Y1 As Single,
| [Width1], [Height1], [X2], [Y2], [Width2], [Height2], [Opcode])
|
| With the brackets.

It works fine for me. I didn't track down the Picture
object, but a quick check of scrrun.dll shows optional
parameters.


mm

6/19/2012 10:30:00 PM

0


"Mayayana" <mayayana@invalid.nospam> escribió en el mensaje
news:jrquci$q35$1@dont-email.me...
>| > I'm trying your code but the Optional information for parameters seems
> to
> | > be missing also.
> |
> | But the VB' Object Browser retrieves it just fine, for example the
> | definition it states for PaintPicture:
> |
> | Sub PaintPicture(Picture As IPictureDisp, X1 As Single, Y1 As Single,
> | [Width1], [Height1], [X2], [Y2], [Width2], [Height2], [Opcode])
> |
> | With the brackets.
>
> It works fine for me. I didn't track down the Picture
> object, but a quick check of scrrun.dll shows optional
> parameters.

Yes, it shows optional parameters but doesn't specify that they are
optional.


Mayayana

6/19/2012 10:38:00 PM

0

| Yes, it shows optional parameters but doesn't specify that they are
| optional.
|
I see. I tried vb6.olb and you're right about that one.
I don't have time to check it now to see what's different.
I've never noticed a typelib that did that before.