Я построил расширение для 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 или указать мне немного в правильном направлении?