題名通りですが、
VC側のDLLにてmallocで構造体の領域を確保しています。
この領域をVB側で使用したいのですが、やり方がわかりません。
イメージは
Public Declare Function GetData Lib "xxx.dll"
(ByRef datas As KOUZOUTAI, ByRef dataCnt As Long) As Boolean
みたいな形で、datasに構造体のデータ、及び
dataCntに領域確保したデータ数を取得出来ればなと思っております。
VB側では、これもイメージですが、
dim datas() as KOUZOUTAI
dim dataCnt as long
GetData(datas, dataCnt)
for cnt=0 to dataCnt - 1
msgbox datas(cnt).a
msgbox datas(cnt).b
msgbox datas(cnt).c
next
みたいな感じで処理をしたいと思っております。
お聞きしたい事は
1)そもそも可能なのか?
2)declare宣言のdatasのところが???です。
3)dim datas() as KOUZOUTAIのところも宣言が???です。
4)datas(cnt).a等としているところも配列?として処理出来るのかが???です。
以上、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
>1)そもそも可能なのか?
VC側でVB配列を扱える人が作ったDLLなんでしょうか?
できるようならmallocは使わずSafeArray系APIを使うと思います。
最低でもVB側で解放できるようにGlobalAllocを使うはずです。
無理すれば可能だとは思いますが、一時的に成功してもガベージ
コレクションが起きた後で動作が不安定になるでしょう。
>2)declare宣言のdatasのところが???です。
VC側で SAFEARRAY **datas となっていれば datas() As KOUZOUTAIと
なります。そうすると、mallocではなく、SafeArrayCreateで確保
された領域のポインタが入らなくてはなりません。
VC側が struct xxx *p となっているならdatas As KOUZOUTAIです。
>3)dim datas() as KOUZOUTAIのところも宣言が???です。
Declarationの所では配列要素数を省略した定義は可能です。
後でReDim文で配列領域を確保します。配列要素数を定義すると
固定配列になるので、VC側でメモリを削除したり、確保したり
できません。
>4)datas(cnt).a等としているところも配列?として処理出来るのかが???です。
構造体の配列は使用可能です。書式も合っています。
どうしてもVC側で作ったものを使いたいならGlobalAllocでメモリを
確保し、これを戻り値(Long型)とします。VB側では必要な領域を
確保した後、RtlMoveMemoryで内容をコピーして使えば良いでしょう。
尚、VBの変数のポインタはVarPtr関数で求められます。
この回答への補足
詳細な回答ありがとうございます。
3)がちょっと気になります。
dim datas() as KOUZOUTAI
という宣言がOKなのはわかるのですが、
このあと、redimをしなければならないというところが引っ掛かります。
VC側でHeapAllocでメモリ確保しているのですが、その先頭ポインタ(この考えはVBには無いとは思いますが。)をVB側で受け取っているのに、更に、redimしなければならないのでしょうか?
もしかしたら、VB側ではRtlMoveMemoryで上記redimした領域にコピーを行った上で使用しなければならないという意味でしょうか?
であれば納得です。
以上、再度、ご回答頂けると幸いです。
No.4
- 回答日時:
VBの配列は複雑な管理になっており、先頭ポインタに構造体サイズを
加えれば次の要素のポインタになると言うものではありません。
先ず、管理情報として定義済み(Eraseされていない)フラグが
あります。ReDimしていないとこれがFalseですし、LBound、Uboundの
定義も未設定になっています。当然、データ用の領域もありません。
VC側のHeapAllocで取得した領域に上記のような管理情報とデータを
仕込み、更にVB側のメモリ管理に登録する方法をご存知ならば、
何も申し上げることはございません。ReDimするしないも自由です。
3度にわたるご回答、大変感謝しております。
VB6はそれなりにやってきたつもりでしたが、
今回は全く知らなかった事ばかりで知識が増えました。
ありがとうございました。
No.1
- 回答日時:
その構造体の内容(メンバー)を提示しましょう
たとえば
struct tagData{
int a;
short b;
byte c;
};
といった構造体なら
VB6以前であれば
Type tagData
dim a as Long
dim b as Integer
dim c as Byte
End type
といった具合になります
構造体の配列となると SafeArrayタイプでC++側でデータを構築しないとうまくわたらなかったりしますよ
VC付属のMSDNで
Visual Basic 5.0 から呼び出し可能な DLL の作成例
取った題目のサポート技術を参照してみましょう
参考URL:http://support.microsoft.com/kb/410837/ja
この回答への補足
このURL大変参考になりました。ありがとうございます。
ところで、当方の環境はVB6なのですが、VB6用のこの様な記事が見当たりません。VB5と同じと考えていいんですよね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 配列の勉強をしています。使用する変数の意味、検索条件の書き方が難しいです。 2 2022/09/15 14:06
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) Dateserialで データ抽出 2 2022/06/26 21:07
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) excel vba 参照渡しと値渡し 2 2022/04/27 10:45
- Excel(エクセル) マクロ(データ取得と転記)について教えてください 3 2022/12/24 12:18
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) VBA Bookの表示、非表示 1 2022/09/16 20:44
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
Dir関数で読み取り順を操作でき...
-
構造体配列の一部初期化!!!
-
VB6で、一次元配列と二次元配列...
-
VBAでMODE関数をつくる
-
VB.NETの配列とArrayListについ...
-
Excel2010のinputboxで複数デー...
-
C#でbyte配列から画像を表示さ...
-
定数配列の書き方
-
配列数とメモリの使用率
-
C#,繰り返し処理での最大値の取...
-
母親の血液中の胎盤遺伝
-
配列の要素がすべてカラかどう...
-
VB6でやると構造体の配列になる...
-
2次元配列の初期値
-
現在コピーされているものによ...
-
VBA Dowhile 判断条件に動的配...
-
VBA ReDim と ReDim Preserve ...
-
ACCESSであえてデータを配列形...
-
レコードセットの中身を配列に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
Excel2010のinputboxで複数デー...
-
エクセルでXY座標に並べられた...
-
構造体配列の特定のメンバーをF...
-
定数配列の書き方
-
コンボボックスのインデックス...
-
OutOfMemoryExceptionの回避策...
-
Dir関数で読み取り順を操作でき...
-
CheckBoxの配列化
-
構造体配列内の文字列検索のよ...
-
COBOLの基本的な事なので...
-
Redim とEraseの違いは?
-
VBAで配列引数を値渡しできない...
-
2次元配列の初期値
-
配列の中の最大値とそのインデ...
-
大量の変数を定義するにはどう...
-
VB6からの移行したいけど、VB.N...
-
VB6のメモリ解放に関して
おすすめ情報