DllImport работает 32-битный, сбой 64-битный (AccessViolationException) - PullRequest
1 голос
/ 21 июня 2019

Я построил расширение для MapInfo Pro, используя .Net в C #.Старые версии MapInfo - 32-битные приложения, новейшие - 64-битные.Я хочу, чтобы мое расширение работало с обоими.Хотя многие функции MapInfo можно вызвать с помощью .Net, некоторые из них работают только с неуправляемыми библиотеками.Один из тех dll называется migrid.dll, который у меня есть в 32-битной и 64-битной версии.Однако у меня нет исходного кода, поэтому я не могу получить точные определения функций в этом файле.

Одной из функций, которые я хочу использовать, является GE_WriteContinuousValue.Единственная документация, которая у меня есть об этой функции - это как объявить ее с помощью MapBasic (язык программирования по умолчанию для MapInfo):

Объявить функцию GE_WriteContinuousValue Lib "Migrid.dll" (

ByValhGrid As Integer, 'дескриптор сетки

ByVal lCol As Integer, номер столбца

ByVal lRow As Integer, номер строки

ByVal dValue As Float' значение z

) As Logical 'FALSE, если есть ошибка

' TRUE при успехе

В моем коде c # я использую эту функцию с DllImport:

[DllImport("migrid.dll", CallingConvention = CallingConvention.StdCall)]
public static extern bool GE_WriteContinuousValue(int hGrid, int lCol, int lRow, double dValue);

, а затем вызвать его, например:Когда я использую то же самое для 64-битной dll, я получаю «System.AccessViolationException 'Попытка чтения или записи защищенной памяти» в этой строке:

GE_WriteContinuousValue(iGridID, c, r, value);

Другие функции в той же dll работают без проблемкак для 32-битных, так и для 64-битных.Так что это должно быть что-то конкретное для этой функции.

Надеясь, что есть способ получить точное определение этой функции, я искал в Интернете и нашел инструмент под названием снеговик.Который дал мне некоторую информацию, но ничего полезного для меня.Может быть, вам это поможет?

Результат от 32-битной DLL:

struct s43 {
signed char[4] pad4;
int32_t f4;
};

struct s44 {
signed char[4] pad4;
int32_t f4;
};

/* migridu.dll:222 */
int32_t migridu_dll_222 = 0x800000de;

void GE_WriteContinuousValue(int32_t a1, int32_t a2, int32_t a3) {
int32_t* edi4;
int32_t* esi5;
struct s43* edi6;
struct s44* esi7;

*edi4 = *esi5;
edi6->f4 = esi7->f4;
migridu_dll_222();
goto a2;
}

Результат от 64-битной DLL:

void fun_180001b50() {
goto GE_WriteContinuousValue;
}

int64_t GE_WriteContinuousValue = 0x577c;

void GE_WriteContinuousValue() {
goto GE_WriteContinuousValue;
}

Может кто-нибудь помочь мне получитьизбавиться от System.AccessViolationException или указать мне немного в правильном направлении?

...