• ベストアンサー

ポインターのポインターについて教えてください。

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"にする場合どのようにすればいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#2009
noname#2009
回答No.1

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/UseAPI_FunctionsBasic/
sha-girl
質問者

お礼

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

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

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の隠し関数で、変数のアドレスを取得できます。

sha-girl
質問者

お礼

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