dポイントプレゼントキャンペーン実施中!

vb6.0のstring型の配列をvc6.0で作ったdllに渡したいのですが
どうすればいいのでしょうか?
VB側の宣言で
Private Declare Function test Lib "strr.dll" (ByRef a() As String, ByVal b As String) As Long
Byrefで渡すとそのアドレスが入ってるらしいですが
C側でうけとるときこの場合
char ***aという形でうけとるのでしょうか?
実際***aでうけとると、最初の1文字目はdll側で受け取れます。
ただその場合どのようにしてポインタを動かせばいいのかわかりません。
普通に1文字ずらすのは(**a)++というのでは駄目なのでしょうか?
(*a)++でもa++でも
コンパイルはできるのですが、実行するとフリーズします。
(***a)++だと当然のごとくアスキーコードの値が1増えるだけでした。

例えば
vbのa(0)="abcd",a(1)="efgh"をvcで作ったdllを使ってb="abcdefgh"にする場合どのようにすればいいのでしょうか?

A 回答 (2件)

VBでは文字列の配列は、他の数値配列等とは扱いが


異なっていて、VCに渡すには多分COMにして
SafeArrayとゆうモンを使わないとできません。
で、VBの文字列のString型はVCでは BSTR に該当し
ます。
ByValで値渡しにすると丁度良くVCのLPSTR型(char*型)
に該当し、うまい具合になる という仕組みです。
なので、VCで作ったDLLのDeclare 宣言が
>Private Declare Function test Lib "strr.dll"
>(ByRef a() As String, ByVal b As String) As
> Long
になる?のは元々ムリがあるような気がします。

どうしても1つの引数で複数の文字列を渡す必要が
あるのなら

--------VB側---------------------------
Private Declare Function testnew Lib "strr.dll"
(ByVal a As String, ByVal b As String) As Long

Dim str As String
Dim dlmt As String
Dim b As String * 255
dlmt = ","
str = "abcd" & dlmt & "efgh" & dlmt & "ijklmnopqrstu~"
testnew str, b

--------VC側---------------------------
extern"C"__declspec(dllexport)
long testnew(char* a, char* b)
{
char buf[256];
char* param[16];
char* p;
char dlmt[] = ",";
int i;
strcpy(buf, a);
p = strtok(buf, dlmt);
for(i = 0; p != NULL; i++) {
param[i] = p;
p = strtok(NULL, dlmt);
}
// 結果
// param[0] ・・・ "abcd"
// param[1] ・・・ "efgh"
// param[2] ・・・ "ijklmnopqrstu~"

// 戻り値 "abcd" + "efgh"
strcpy(b, param[0]);
strcat(b, param[1]);

return 0;
}


とゆーふーにしたらどうかと思われます(打ちミスは勘弁で)
『そんなことはねー、文字列配列をまるごと渡せるぞ、』
という方は容赦無く否定して下さい。自信は無しなので

参考URL:http://www1.ocn.ne.jp/~ajinoya/VisualBasic/UseAP …
    • good
    • 0
この回答へのお礼

ありがとうございます。やはり固定長でくくって送るしかないんでしょうか。参考になりました。

お礼日時:2002/06/05 06:55

VBの文字列型の配列をCのDLLに渡すのは、試したけども無理そうです。



案として、VB側で、SJISにしてから渡すのはどうでしょうか?

Private Declare Function test Lib "strr.dll" (ByRef a As Long, ByVal b As String) As Long

Dim a(0 To 1) As Long
Dim s1() As Byte
Dim s2() As Byte

s1 = StrConv("abcd", vbFromUnicode)
s2 = StrConv("efgh", vbFromUnicode)
a(0) = VarPtr(s1) 'もしかしたらVarPtr(s1(0))かも
a(1) = VarPtr(s2)

Call test(a(0), "文字列")

ってな感じで。
C側のプロトタイプはLPSTR* で平気です。

なお、VarPtr()はVBの隠し関数で、変数のアドレスを取得できます。
    • good
    • 0
この回答へのお礼

隠し関数なんてあるんですか。
とりあえずバイト型に直して色々やってみたいと思います。
大変参考になりました。ありがとうございました。

お礼日時:2002/06/05 06:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!