分類:[C#]
2017/08/30(Wed) 21:54:39 編集(投稿者)
2017/08/30(Wed) 21:54:09 編集(投稿者)
2017/08/30(Wed) 21:54:03 編集(投稿者)
<pre><pre>C言語のDLLでエクスポートされているポインタ型構造体のグローバル変数を
C#から参照し、メンバに値を設定することは可能でしょうか。
WEB参考に、構造体変数(a1)に値を設定することはできたのですが、
ポインタ型構造体の取得、値設定方法がどのようにしていいのかわかりません。
下記C側ソースの*a1_refをC#から参照しメンバーを更新したいです。
ご存知の方がいましたら、ご掲示いただけると幸いです。
よろしくお願いいたします。
開発環境はVisual Studio 2013 .NET 4.0です。
【C側ソース(DLL)】
typedef struct {
unsigned char mode;
unsigned char status;
short ct;
short current;
} A_STRUCT;
A_STRUCT a1;
A_STRUCT *a1_ref;
※C側ソースで、a1_refには実体のアドレスを設定済み
【C#側ソース】
※実体構造体に対して設定を行ったソースを一部抜粋
[StructLayout(LayoutKind.Sequential)]
public struct A_STRUCT
{
public byte mode;
public byte status;
public short ct;
public short current;
}
A_STRUCT a1 = new A_STRUCT();
// DLLより構造体データコピー
var p = GetProcAddress(this.ModuleHandle, "a1");
a1 = (A_STRUCT)Marshal.PtrToStructure(p, typeof(A_STRUCT));
a1.mode = 1;
a1.status = 0;
a1.ct = 100;
// DLLの構造体にC#で設定したデータを設定
var p = GetProcAddress(this.ModuleHandle, "a1");
Marshal.StructureToPtr(a1, p, false);
</pre></pre>