String型をDLL関数で受け渡すことはできません。また、ABとVBのStringは別物です。
その程度の関数だったらVBAで標準モジュール内に書けば良い気がしますが,敢えてABでやるならば,こうするとどうでしょうか?
Len関数が文字列を長さを返すのはString型の値を使ったときだけで,BytePtr型の値を引数に渡してもうまくいきません。
BytePtr型に対してはlstrlen関数を使います。
ところがVBから渡された文字列はSysStringByteLenを使う方が効率的です。
(lstrlenはABのStringにも使えますが同様にLenの方が効率的です)
そこで結局私ならこうします。
コード: 全て選択
Function LstrfixLen(myData as BytePtr, dataLen As Long, myLen as long) As String
Dim mySpc As long
mySpc = myLen - dataLen
LstrfixLen = myData + Space$(mySpc)
End Function
/*
Function Lstrfix(myData as BytePtr, myLen as long) As String
Lstrfix = LstrfixLen(myData, lstrlen(myData) As Long, myLen)
End Function
*/
Function Export LstrfixVB(ByVal myData As BSTR, ByVal myLen As Long) As BSTR
Dim ret As String
ret = LstrfixLen(myData As BytePtr, SysStringByteLen(myData) As Long, myLen)
LstrfixVB = SysAllocStringByteLen(StrPtr(ret), Len(ret))
End Function
SysAllocStringByteLenの戻り値を返すようにすると,VBでは戻り値をString型で受けることができます。
BSTR = VBのStringと思って差し支えありません。
(ただし文字列引数をDLLで受け取るときだけはこまたさんの元のLstrfixのようにBytePtrで受け取って構いません)
ABからLstrfixを使えるように公開したい場合は,別の方法を使います。(今は省略)
VBでは次のように宣言します。ByRef/Valを省略したときABではByValですが,VBではByRefであることに注意が必要です。
コード: 全て選択
Private Declare Function Lstrfix Lib "DLL名" Alias "LstrfixVB" ( _
ByVal myData As String, _
ByVal myLen As Long _
) As String