C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: DLLのポインタ型構造体外部変数


(過去ログ 145 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■84972 / inTopicNo.1)  DLLのポインタ型構造体外部変数の参照と値設定について
  
□投稿者/ たかじ (1回)-(2017/08/30(Wed) 21:52:15)

分類:[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>

引用返信 編集キー/
■84973 / inTopicNo.2)  Re[1]: DLLのポインタ型構造体外部変数
□投稿者/ Azulean (855回)-(2017/08/30(Wed) 22:19:56)
2017/08/30(Wed) 22:23:50 編集(投稿者)

No84972 (たかじ さん) に返信
> 下記C側ソースの*a1_refをC#から参照しメンバーを更新したいです。

a1_ref はアドレスが入っているわけですから、GetProcAddress で得られた「アドレスへのポインター」からアドレスを得て、そこから PtrToStructure すればよいでしょう。


var ptr = GetProcAddress(this.ModuleHandle, "a1_ref"); // &a1_ref 相当の戻り値
IntPtr addr = Marshal.ReadIntPtr(ptr); // *(&a1_ref) → a1_ref
A_STRUCT a2 = (A_STRUCT)Marshal.PtrToStructure(addr, typeof(A_STRUCT)); // *a1_ref をコピー
a2.mode = 2;
Marshal.StructureToPtr(a2, addr, false);

// GetProcAddress("a1") は A_STRUCT* が、
// GetProcAddress("a1_ref") は A_STRUCT** が返ってくると考えれば良い。
引用返信 編集キー/
■84977 / inTopicNo.3)  Re[2]: DLLのポインタ型構造体外部変数
□投稿者/ たかじ (2回)-(2017/08/31(Thu) 10:04:50)
No84973 (Azulean さん) に返信
Azuleanさん
ご回答ありがとうございます。

ご掲示のとおりに試したところ、期待通りの動作になり問題が解決できました。
また、わかりやすいご説明ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -