eg 
  Function ReturnaPchar(res : Pchar):Boolean;
  Begin
    strpCopy(res,'返回给VB的字符串');
    Result := True;
  End; 在VB中我使用ByVal方式传值(资料上说对string要使用ByVal的方式进行传递),我的返回数据也成功返回,但是在VB应用程序关闭时(在卸载Dll的时候,出现内存错误)。请大家给点意见。

解决方案 »

  1.   

    >>在VB中我使用ByVal方式传值基本上应该没错,你要参考一些VB调用windows api 的经验,
    传入参数前,要先给那个 string 参数填充一定长度的字符一般我用 strcpy 或 copymemory
      

  2.   

    在调用前我使用了
    Dim res as string
    res = string(255,vbNullChar)我再看看,对了我是使用的stdcall调用约定
      

  3.   


    Function ReturnaPchar(res : Pchar):Boolean;stdcall;....Function ReturnaPchar(res : Pchar):Boolean;
      Begin
        strpCopy(res,'返回给VB的字符串');
        Result := True;
      End; 
    -------------------------------------
    在VB中使用ByVal方式传数据,在传之前分配空间是不会出错的。
    ----------------------------------------------------
    我的问题已经解决,但我不知道原因还望大侠们指点。在DLL中其他函数中使用string的返回类型如 Function a(...):string;在工程中引用了sharamem??后改为 Function a (...;res:Pchar):WordBool; 去除工程中的sharamem单元,编译,运行,通过
    .
    .
    .
    ..
    .
    .
    .
      

  4.   

    上面的Boolean 应为 WordBool
      

  5.   

    我回过一个VB调BCB的,供参考:
    http://community.csdn.net/Expert/topic/4403/4403416.xml?temp=.2674372
      

  6.   

    解决就好,呵呵:)
    如果动态库要给别的语言开发的程序调用,最好不要有string的参数,还是用pchar吧,sharamem这个单元要在dll和调用程序里面都引用,你在vb那端没有引用所以造成错误(也许是这样)。
      

  7.   

    一定要用stdcall;
    Directive Parameter order Clean-up Passes parameters in registers?
    register Left-to-right Routine Yes
    pascal Left-to-right Routine No
    cdecl Right-to-left Caller No
    stdcall Right-to-left Routine No
    safecall Right-to-left Routine No
      

  8.   

    使用ByVal是正确的,因为如果使用ByRef会导致内存问题.
    其实由于你的参数只有一个因此参数的传递顺序不是问题,而问题出在不同的调用方式对参数传递
    的堆栈管理不同,为了保证动态库的通用性,使用统一的调用约定是必要的,比如使用safecall就是
    一个较好的选择.如果要让Delphi输出函数给别的工具使用,数据类型的匹配是很重要的,要掌握这
    些可以参考Windos单元对API的引入,这样准没问题,前一段写了个功能包(配合硬件),使用者可以使
    用VC,BCB,PB,VB等调用,经测试,只要严格遵守约定,是不会出现任何问题的.