Delphi作的.dll用于处理字符(String)数据给VB, VB调用此.dll时出错, 怎么解决?
Delphi处理了上MB的字符数据然后用PChar返回给VB, VB就支持不了,
数据小于1MB可以, 但是大了VB就不行了, 所以我用delphi分配了块空间, 然后返回PChar, 这样VB就可以了,但是问题在于内存释放非常慢, 有时还不释放了, 功能执行很慢. 代码如下:
.dll :
var
  Src : PChar;
  Len: Cardinal;
begin
  Src := xxx();//产生大量字符;
  GetMem(Result, Len);
  Move(Src^, Result^, Len);  
end;vb :
调用.dll的函数是静态的, 并使用了ByVal是否要我释放掉Result的那块内存, VB的.dll是否是VB程序结束了才释放 

解决方案 »

  1.   

    FE_Create Tx_Buffer(0), Rx_Buffer(0), AddressOf Rx_Proc'创建FE_Free'释放FE_Comm Port, Tel, Count'通讯
      

  2.   

    2楼的是什么意思?是要我写一个函数去释放?
    1楼问的是VB端?
    VB声明:
    Private Declare Function xxx Lib "mydll.dll" (ByVal str As String) As StringDelphi声明:
    Function xxx(str : PChar):PChar;stdcall;export;.dll是Delphi写的, VB传一个地址给Delphi的dll, 此dll处理完数据后返回给VB, VB要接收那些数据. 数据少可以,多了就有问题,所以我用delphi的dll去创建了块空间, 这样VB就可以使用大量数据了,但是问题在于内存释放非常慢, 有时还不释放了, 功能执行很慢. 就是问怎么解决,是要我去释放空间? 因为我不清楚VB调用.DLL后是怎样释放的.
      

  3.   

    补充Len是用StrLen(大量字符串)计算出来的.我开始代码忘帖了,不好意思
      

  4.   

    内存使用最好遵循原则:谁申请,谁释放。
    你在Delphi代码里申请的内存空间,让VB代码去释放,不好。
      

  5.   

    5楼说得不错, VB那中静态调用十分垃圾, 要VB程序退出了才能释放他使用过的.dll.
    数据量大了VB的栈就暴了, 所以建议你使用一个全局的变量先记录那块空间, 等VB使用完了再由VB主动调用.dll提供的新方法释放掉就可以了