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"にする場合どのようにすればいいのでしょうか?
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/UseAP …
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の隠し関数で、変数のアドレスを取得できます。
隠し関数なんてあるんですか。
とりあえずバイト型に直して色々やってみたいと思います。
大変参考になりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Excel(エクセル) エクセルVBA、ファイル名をセルの値で保存の方法を教えてください。 おそれいります。こちらで数々のエ 6 2023/06/30 22:17
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCL言語で文字列検索方法を教え...
-
nullと""、\\0とEOFの違いにつ...
-
プログラムによく出てくるst...
-
C++で入力した文字列から数字を...
-
シリアル通信で0x00を送信した...
-
16進数を2文字ずつ配列に格納し...
-
文字コードによる表記
-
C#でstringをポインタとして渡す
-
WSH(VBS)でJSONの文字列を読み...
-
%dなどの違い
-
Perlでの文字列操作について
-
バイナリファイル中の日本語文...
-
char型配列の最大要素数
-
C言語の勉強しています。すみま...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
[Excel VBA]デフォルトプロパティ
-
エクセルVBAで部分検索でのアラ...
-
関数に文字列を渡すことについて
-
VBA-DLLの引数受け渡しについて
-
Integer変数をカラにしたいので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
nullと""、\\0とEOFの違いにつ...
-
C++で入力した文字列から数字を...
-
%dなどの違い
-
C#でstringをポインタとして渡す
-
16進数を2文字ずつ配列に格納し...
-
TCL言語で文字列検索方法を教え...
-
プログラムによく出てくるst...
-
WSH(VBS)でJSONの文字列を読み...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
数字の入った配列をファイルへ...
-
構造体→文字列→構造体 をする方法
-
VB6.0でのバイナリデータの扱い...
-
char型配列の最大要素数
-
[C++]WCHARの1文字目しか表示で...
-
アルファベットをカウント、
-
C言語の勉強しています。すみま...
-
VBA-DLLの引数受け渡しについて
-
c#で他のアプリの文字入力フォ...
-
Shift_JIS(16進)を文字に変換す...
-
バイナリファイル中の日本語文...
おすすめ情報