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

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

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

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

6613閲覧

C#→C++ で定義したdllを呼ぶ(構造体のポインタ含む)

Yamatomura

総合スコア14

DLL

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/10/25 05:41

C#側からC++で書いたdllの関数を呼び出したいのですが、C++側のその呼び出す関数の引数がポインタの構造体で、またその構造体の中にはさらにポインタの構造体が定義されているなどしてうまくいきません。
自分である程度やってみたのですが関数は呼び出せるものの値が正しく入っていません(渡された変数がNullになっている)、助言の方いただきたいです

C++

1//C++側の呼びたい関数(dllの公開関数) 2int __stdcall FunctionA(StructA *value) 3 4//構造体StructAの中身 5struct StructA { 6 unsigned short aaa; 7 StructB* bbb; 8 }; 9 10//構造体StructBの中身 11struct StructB { 12 unsigned short* Buffer; 13 unsigned int iWidth; 14 };

C#

1//うまくいっていないが試したコード 2//定義部分 3[StructLayout(LayoutKind.Sequential)] 4public struct StructA 5{ 6 public ushort aaa; 7 public StructB bbb; 8} 9 10[StructLayout(LayoutKind.Sequential)] 11public struct StructB 12{ 13 public Intptr Buffer; 14 public int iWidth; 15} 16 17//関数 18[DllImport("○○.dll")] 19public extern static int FunctionA(ref StructA value); 20 21 22//C#で呼び出す部分 23 StructA value = new StructA(); 24 value.bbb = new StructB(); 25 value.aaa = 100; 26 value.bbb.Buffer = Marshal.AllocCoTaskMem((Marshal.SizeOf(typeof(byte)) * ○○(必要なサイズ分確保)); 27 value.bbb.iWidth = 1000; 28 Marshal.Copy(data, 0, value.bbb.Buffer, data.Length); //(dataはC++側に渡したいデータ) 29 FunctionA(ref value); 30

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

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

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

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

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

guest

回答1

0

自己解決

Marshal.StructureToPtrを使って構造体をポインタにするようにしたら、うまく動きました

投稿2018/10/25 08:28

Yamatomura

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問