6

すべて、これは前の質問からのフォローアップです: C# フォーマットの外部 Dll 関数パラメーター

具体的には、C# に変換しようとしているコードです。

FILES_GetMemoryMapping((LPSTR)(LPCTSTR)MapFile, &Size, (LPSTR)MapName, &PacketSize, pMapping, &PagePerSector);
// Allocate the mapping structure memory
pMapping = (PMAPPING)malloc(sizeof(MAPPING));
pMapping->NbSectors = 0;
pMapping->pSectors = (PMAPPINGSECTOR) malloc((Size) * sizeof(MAPPINGSECTOR));

// Get the mapping info
FILES_GetMemoryMapping((LPSTR)(LPCTSTR)MapFile, &Size, (LPSTR)(LPCTSTR)MapName, &PacketSize, pMapping, &PagePerSector);

関数「FILES_GetMemoryMapping」は2回呼び出されます.1回目は構造体のサイズを取得し、2回目は実際にそれを埋めるためだと思います.

「pMapping」は C++ の構造体へのポインターです。私の C# コードでは、pMapping を IntPtr 型として持っています。次の行に変換できます:

pMapping = Marshal.AllocHGlobal(Marshal.SizeOf(new UM0516.Mapping()));

(UM0516.Mapping) が構造体です。かっこいいので、IntPtr が指しているスペースを割り当てました。次の行は... "pMapping->NbSectors = 0;"

現在割り当てられているアンマネージ メモリ空間に移動し、それを (UM0516.Mapping) 構造体として型キャストし、そのメンバーの 1 つを設定するにはどうすればよいでしょうか? 次に、「FILES_GetMemoryMapping」を2回目に呼び出したときに、この構造体を使用できるように、あまりうまくいっていないことを確認してください??

-- わかりました、私はいくつかのアドバイスを受けて、今これを持っています:

これを試してみたところ、最初の「FILES_GetMemoryMapping」呼び出しで「AccessViolationException was unhandled」例外が発生しました

ここに私が持っているものがあります:

string filepath = @"C:\blah.blah";
string MapFile = @"D:\blah.blah";
UM0516.Mapping myMapping = new UM0516.Mapping();
IntPtr pMapping = Marshal.AllocHGlobal(Marshal.SizeOf(myMapping));
Marshal.StructureToPtr(myMapping, pMapping, false);
ushort PacketSize = 0;
ushort size = 0;
string MapName = String.Empty;
byte PagePerSector = 0;

uint b7 = UM0516.FILES_GetMemoryMapping(MapFile, out size, MapName, out PacketSize, pMapping, out PagePerSector);

この例外は「pMapping」パラメーターから来ていると思いますか? これは、私が渡した他の何かに由来する可能性がありますか?

4

2 に答える 2

12

IntPtr を取得するには、構造体を作成し、必要なオプションを設定し、既にあるようにメモリを割り当ててから、..

System.Runtime.InteropServices.Marshal.StructureToPtr(yourStructVariable, pMapping, false);

これにより、移入された構造から割り当てられたメモリにデータがコピーされます。

メモリから ' mapping' という名前の新しい構造体にデータをコピーするには、次を呼び出します...

UM0516.Mapping mapping = (UM0516.Mapping)System.Runtime.InteropServices.Marshal.PtrToStructure(pMapping, typeof(UM0516.Mapping))
于 2009-04-08T00:45:31.220 に答える