使用DataExplorer.exe连接到本地DBX4驱动程序时遇到错误

Cha*_*ang 23 delphi dllimport

我在Delphi 2010 for Firebird数据库中编写了自己的DBX 4.驱动程序是一个dynalink驱动程序,它可以与TSQLConnection一起使用.

最近,我尝试使用Delphi 2010发布的DataExplorer.exe并遇到错误:

"Attempted to read or write protected memory.
 This is often an indication that other memory is corrupt".
Run Code Online (Sandbox Code Playgroud)

跟踪源代码后,我发现以下导出方法可能是导致问题的原因:

function DBXLoader_GetDriver(Count: TInt32; Names, Values: TWideStringArray;
  ErrorMessage: TDBXWideStringBuilder; out pDriver: TDBXDriverHandle):
  TDBXErrorCode; stdcall;
Run Code Online (Sandbox Code Playgroud)

调试此方法时,"名称和值"参数包含损坏的值.我不知道是什么原因造成的.也许DataExplorer.exe存在一些内存管理器问题(.net问题?)

经过一些试验和错误后,我尝试将方法更改为:

type
  TWideStringArray2 = array of PChar;

function DBXLoader_GetDriver(Count: TInt32; Names, Values: TWideStringArray2;
  ErrorMessage: TDBXWideStringBuilder; out pDriver: TDBXDriverHandle):
  TDBXErrorCode; stdcall;
Run Code Online (Sandbox Code Playgroud)

这一次,错误消失了,在退出此方法后不久,同样的错误再次引发

"Attempted to read or write protected memory.
This is often an indication that other memory is corrupt".
Run Code Online (Sandbox Code Playgroud)

你有什么想法可能导致问题的原因吗?

SPD*_*ver 1

看起来你有一些内存分配问题。您最终会使用 SimpleShareMem 吗?

http://docwiki.embarcadero.com/CodeExamples/en/SimpleShareMem_Sample - 描述如何使用它。

http://www.codexterity.com/memmgr.htm - 还包含一些有关内存分配的见解,但使用的是使用 FastSharemem 模块的旧方法。