just for those who have to deal with legacy application that supports COM,
OCX, and WINAPI(_stadcall),
I worked out the COM interface fro function out array parametns.
For example
' Caller proto:
' Int32 lSz, lsz2
' String lstrOut[]
' Int32 lPos[]
' lSz = objClass.Parse(sIn, ref lsz2, ref lstrOut, ref lPos)
' the result lsz2 and lSz are same of course due to adj made here
Public Function Parse(ByVal sIn As String, <Out()> ByRef iCnt As Integer, _
<Out()> <MarshalAs(UnmanagedType.LPArray, ArraySubType:=UnmanagedType.LPStr,
SizeParamIndex:=1)> ByRef sOut As String(), _
<Out()> <MarshalAs(UnmanagedType.LPArray, ArraySubType:=UnmanagedType.LPStr,
SizeParamIndex:=1)> ByRef lPos As Integer()) As Integer
sOut = Split(sIn, vbTab)
Dim sdebugMsg As String = "0, >>", s As String
Dim i As Integer = 0
iCnt = 0
iCnt = sOut.GetUpperBound(0)
Dim pos(iCnt) As Integer
If iCnt > 0 Then
pos(0) = 1
i = 1
For Each s In sOut
sdebugMsg &= s
If i < iCnt Then
pos(i) = s.Length + 1
sdebugMsg &= vbCrLf & pos(i) & vbTab
End If
Next
lPos = pos
iCnt += 1
Else
End If
' MsgBox("sOut.GetUpperBound()=" & sOut.GetUpperBound(0) & vbCrLf & "values
are" & vbCrLf & sdebugMsg, MsgBoxStyle.OKOnly, "IeStringClass.Parse")
'MsgBox(sOut)
Return iCnt
End Function
|