窗口DLL,不能用动态数组 ( 积分: 50 )

  • 主题发起人 主题发起人 jlyin
  • 开始时间 开始时间
J

jlyin

Unregistered / Unconfirmed
GUEST, unregistred user!
有窗口DLL,用于数据通讯
unit RDCMDef;
interface
//const ChnoSum=5610;//(132 div 6)*255;
type
TOneDL=Record //µçÁ¿Ã¿¸öµãµÄÖµ
SerialNo:Word;
ArmID:Word;
ChnoID:Byte;
ZX:Integer; //ÕûÊý
XS:Word; //СÊý
ErrState:Byte;//¹ÊÕÏ״̬
end;
TDL=Record
PackCount:Byte;
AllDL:array[0..255*22-1] of TOneDL;
end;
implementation
end.
如果ALLDL用动态数组,第一次调用没问题
多次调用就出异常了;改用定长数组就不会;

加上ShareMem单元 {in Borlndmm.dll}也不行
 
有窗口DLL,用于数据通讯
unit RDCMDef;
interface
//const ChnoSum=5610;//(132 div 6)*255;
type
TOneDL=Record //µçÁ¿Ã¿¸öµãµÄÖµ
SerialNo:Word;
ArmID:Word;
ChnoID:Byte;
ZX:Integer; //ÕûÊý
XS:Word; //СÊý
ErrState:Byte;//¹ÊÕÏ״̬
end;
TDL=Record
PackCount:Byte;
AllDL:array[0..255*22-1] of TOneDL;
end;
implementation
end.
如果ALLDL用动态数组,第一次调用没问题
多次调用就出异常了;改用定长数组就不会;

加上ShareMem单元 {in Borlndmm.dll}也不行
 
定长数组传递生命周期是手动管理或基于栈管理的
不定长数组是基于堆的,引用计数管理的.传递的时候传递的是地址.
例如你传递不定长数组给DLL,而EXE里面有自己MemoryManager,在计数为0的时候就会回收.而DLL也有一套自己的MemoryManager,所以如果EXE和DLL都不是带运行时包运行的话,传递引用计数管理生命周期的类型的时候会有危险.例如AnsiString,不定长数组等等.
 
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
这是D5的,D7的说的更详细。
 
to AK_2005:

我在DLL项目单元,以及宣口单元加上ShareMem单元也不行;
并且加在USES子句之第一个;

实际上本贴的最后一句已有说明,
不过不用动态也无多大问题;原只想数组可以开得小些。
 
把ShareMem加在窗口单元没用,必须加在项目单元,对DLL是如此,对包含窗体的主程序也一样。
 
多人接受答案了。
 
后退
顶部