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

わんくま同盟

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

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


(過去ログ 48 を表示中)
■26510 / )  C++/CLRのpin_ptrについて
□投稿者/ tom (1回)-(2008/10/12(Sun) 18:51:15)

分類:[C++/CLI] 

初めまして。
C/CLIにて解決出来ない問題があり質問させて頂きます。

現在、メモリを管理するC言語APIを
C#のフォームから操作できるようにするものを構築しています。

具体的には
C言語APIは初期化時にメインメモリを渡し操作する関数群です。
それをCLRでラップし、C#から参照して操作したいと考えています。

その為、CLRクラスの中にC言語APIに渡すメモリを確保して保持したいので
pin_ptrを使おうと考えたのですが適切な使用方法が分かりません。
(どのサイトを見てもローカル変数としてしか使用していない)

下記のように

★ C言語
void  Initialize( void* pAddress, u32 uiSize )
{
}

があり、

★ CLR
ref struct STATE
{
  UInt32  state;
  UInt32  size;
};
// ----------------------------------------------------------------

// ----------------------------------------------------------------
ref struct MEM_INFO
{
  array<BYTE>^  Address;
  array<STATE>^ State; // エラー:トップレベルの '^' なしに、この型をここに使用することはできません。
  UInt32        StateCount;
};
// ----------------------------------------------------------------

// ----------------------------------------------------------------
public ref class MemoryManager
{
  public:
     MemoryManager();
    ~MemoryManager();
    !MemoryManager();
     
  public:
     Xu32   Initialize( UInt32 size );
     Xvoid  Finalize();
     
  public:
     ・
     ・
     ・
     
  private:
    pin_ptr<MEM_INFO>^	pMemoryInfo_; // エラー:pin_ptr の無効なターゲット型です。
//  MEM_INFO*  pMemoryInfo_;
};

といった感じでラップしようと考えたのですが

STATE、MEM_INFO、pin_ptr<MEM_INFO>^でエラーとなってしまいます。



C#のフォーム起動時に
MemoryMan_ = new MemoryManager();
MemoryMan_.Initialize( 1024 * 1024 * 64 ); // 指定された分のメモリを確保してCのAPIを呼び出す。

MemoryMan_を操作して色々とメモリ内を書き換えて

フォーム終了時に
MemoryMan_.Finalize();

したいだけなのですが・・・。


返信 編集キー/


管理者用

- Child Tree -