すべて、これは前の質問からのフォローアップです: 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」パラメーターから来ていると思いますか? これは、私が渡した他の何かに由来する可能性がありますか?