delphi不是说的很清楚吗?你没看啊?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.

解决方案 »

  1.   

    所以最好别用string,改用pchar吧,到时候再转换过来。
      

  2.   

    可以用string,但是在你的DLL中,必须uses sharemem单元。
      

  3.   

    程序里也要use,而且必须是第一个,而且分发是还得单独分发,麻烦吧?!
      

  4.   

    pchar('asdfsdf');来转换吧
    我在使用过程发现,它是必须完全  配的,不知对否,总之我使用时,用这种方法解决过
      

  5.   

    要么用pchar,要么就用String加uses sharemem,都可以。
      

  6.   

    //Library
    var
      V_String: string;procedure SetString(mStr: PChar);
    begin
      V_String := string(mStr);
    end;function GetString: PChar;
    begin
      Result := PChar(V_String);
    end;excetps
      SetString,
      GetString;
    end.//Unit or Project
    type
      TSetString = procedure(mStr: PChar); stdcall;
      TGetString = function: PChar; stdcall;var
      vHandle: THandle
      vStr: string;
    begin
      vHandle := LoadLibrary('XXX.dll');
      vStr := '我是一个字符串';
      TSetString(GetProcAddress('SetString'))(PChar(vStr));
      ShowMessage(string(TGetString(GetProcAddress('GetString'))));
      FreeLibrary(vHandle);
    end;
      

  7.   

    如果EXE和DLL都是Delphi编的,你可以用var v: String传递数据。
    如果不是,则一定要用PChar,因为String是Delphi专有的,C/C++不识别,会出乱子的。
      

  8.   

    以前曾经看到过,在声明String参数的时候设置成const就行了,不过我没有试过