Все это является продолжением из предыдущего вопроса здесь: C# formatting external Dll function parametersКак преобразовать IntPtr обратно в объект
Вот конкретно это код, который я пытаюсь преобразовать в 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» вызывается дважды, я предполагаю, что первый раз получить размер структуры, а второй - заполнить ее.
«pMapping» - это указатель на структуру на C++. В моем коде C# у меня есть pMapping как тип IntPtr. Следующая строка I может быть преобразована в:
pMapping = Marshal.AllocHGlobal(Marshal.SizeOf(new UM0516.Mapping()));
С (UM0516.Mapping) является структурой. Круто, поэтому я просто выделил некоторое пространство, на которое указывает IntPtr. Теперь для следующей строки ... "pMapping-> NbSectors = 0;"
Как я могу предположить, что в настоящее время выделенное неуправляемое пространство памяти, введите его как структуру (UM0516.Mapping) и установите один из его членов? Затем убедитесь, что я не слишком сильно вкрутил его, так что во второй раз я называю «FILES_GetMemoryMapping», теперь он может использовать эту структуру ??
- Хорошо, я взял несколько советов и теперь это:
Я попытался это и я получаю «AccessViolationException было необработанное» исключение на первом «FILES_GetMemoryMapping» называют
Вот что У меня есть:
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»? Может ли это исходить из всего, что я прошел?