|
分類:[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();
したいだけなのですが・・・。
|