DllImport工作于32位,失败于64位(AccessViolationException)

时间:2019-06-21 11:09:55

标签: c# .net dllimport mapinfo

我已经在C#中使用.Net构建了MapInfo Pro的扩展名。 MapInfo的旧版本是32位应用程序,最新版本是64位。我希望我的扩展程序可以同时使用。 虽然可以使用.Net调用MapInfo的许多功能,但其中某些功能仅适用于非托管dll。 这些dll之一称为migrid.dll,我拥有32位和64位版本。 但是我没有源代码,因此无法在该文件中获得功能的确切定义。

我要使用的功能之一是GE_WriteContinuousValue。 我唯一拥有该功能的文档是如何使用MapBasic(MapInfo的默认编程语言)对其进行声明:

  

声明函数GE_WriteContinuousValue Lib“ Migrid.dll”(

     

ByVal hGrid作为整数,“网格句柄”

     

ByVal lCol作为整数,“列号”

     

ByVal lRow作为整数,行号

     

ByVal dValue作为Float'z值

     

)作为逻辑'如果有错误则为假

     

'成功成功

在我的C#代码中,我将此功能与DllImport一起使用:

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

,然后使用以下命令进行调用:

GE_WriteContinuousValue(iGridID, c, r, value);

使用32位dll可以正常工作。 当我对64位dll使用相同的命令时,在以下行中会收到“'System.AccessViolationException'尝试读取或写入受保护的内存”的消息:

GE_WriteContinuousValue(iGridID, c, r, value);

同一dll中的其他功能对于32位和64位都没有问题。因此,该功能必须是特定于此功能的。

希望有一种方法可以获取此功能的确切定义。我已经在互联网上搜索了一个名为snowman的工具。这给了我一些信息,但对我没有任何帮助。也许对您有帮助?

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或向我指出正确的方向吗?

0 个答案:

没有答案