質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

1525閲覧

C++DLLからVBへ配列の取得

elephant

総合スコア11

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/05/20 03:11

前提・実現したいこと

C++で作成したDLLからVBへ配列のデータを渡したい。

C++DLL:ファイルを読み込んで読み込んだデータを配列にセット
VB:C++のデータを読み出して、データを引き継ぐ

発生している問題・エラーメッセージ

VB側で取得した配列のデータが全て0になってしまう。

該当のソースコード

C++
コード

typedef struct _DATA_KAKEIBO { long syokuhi; // 食費 long nichiyohin; // 日用品 } DATA_KAKEIBO; //ファイルからデータを読み出す KAKEIBO_DLL_API int WINAPI ReadData(int BufCnt, DATA_KAKEIBO* pDataKakeibo); // BufCnt:読み出すデータの数 // pDataKakeibo:読み出したデータ

VB
コード

<StructLayout(LayoutKind.Sequential)> Structure DATA_KAKEIBO Dim Syokuhi As Integer ' 食費 Dim Nichiyohin As Integer ' 日用品 End Structure Declare Function ReadData Lib "KAKEIBO_DLL.dll" (ByVal BufCnt As Integer, ByVal DataKakeibo() As DATA_KAKEIBO) As Integer ' ファイルからデータを読み出す '読み出し時ソース Dim Cnt As Integer '読み出すデータの数 Dim BufDataKakeibo(Cnt - 1) As DATA_KAKEIBO ’読み出したデータ Dif Ref As Integer '読み出した結果 For i = 0 To (Cnt - 1) BufDataKakeibo(i).Syokuhi = 0 BufDataKakeibo(i).Nichiyohin = 0 Next i Ref = ReadData(Cnt, BufDataKakeibo)  ’BufDataKakeiboにセットされたデータが全て0になってしまう
### 試したこと ReadData Lib "KAKEIBO_DLL.dll" (ByVal BufCnt As Integer, ByVal DataKakeibo() As DATA_KAKEIBO) As Integer のByVal DataKakeiboをByRefに変更するとシステムエラーになってしまい実行できませんでした。 ReadData Lib "KAKEIBO_DLL.dll" (ByVal BufCnt As Integer, ByVal DataKakeibo() As DATA_KAKEIBO) As Integer に変更する方法も試したのですが、今のところ成功しておりません。 ### 補足情報(FW/ツールのバージョンなど) Visual studio2013

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vann_2921

2021/05/20 05:04 編集

Declare のDATA_KAKEIBOに<In,Out>の属性を追加してはどうでしょうか?
elephant

2021/05/21 02:07

アドバイスをどうもありがとうございました。 <Out>属性を追加して、無事取得することができました。 本当にありがとうございました。
guest

回答1

0

ベストアンサー

  • 出力パラメータに<Out>が付いてません。
  • 値型のポインタ、ポインタのポインタが必要なケース以外は、ByVal・ByRefは基本的に書かなくていいです。(値型は値、参照型はポインタを渡してくれるので)

基本的には下記を遵守するようにしてください。(宣言等はC#の記述なので、適時VB.NETに読み替えてください)
ネイティブ相互運用性のベスト プラクティス
また、今回のケースでは特に問題になりませんが、VB.NETではDeclare Functionより細かいオプション指定の可能なDllImportの使用をお勧めします。

投稿2021/05/20 05:12

編集2021/05/20 05:37
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

elephant

2021/05/21 02:18

ご指摘頂いた通り、<Out>を付けたところ、無事取得することができました。 ByVal、ByRefについては、弊社の慣習でつけていたのですが、改めて見直してみようと思います。 ネイティブ相互運用性のベストプラクティスについて、DllImportの使用についてもとても参考になりました。 いつもはC++での開発が殆どなので、今回はとても参考になりました。社内でも情報を共有したいと思っています。本当にありがとうとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問