不知你有没有注意Delphi的Dll调用需对String类型的特别处理,如果忽略了这点,试试这两种方法:
方法1:在Dll程序及调用该Dll的程序的项目文件的use子句的最前面加入ShareMem,发布程序时加上BORLNDMM.DLL;
方法2:改用Pchar处理,自己调用GetMem,FreeMem等函数执行相关的内存管理工作;
本人倾向于第2种方法,方便发布管理,也方便其它开发工具的调用; 

解决方案 »

  1.   


    一般在DLL中的字符串都是用PChar形式。
      

  2.   

    不知如何改变pchar,如我上页的那个,应该如何更改呢?
    pchar返回的只有一个字符,现在要是返回一个字符串呢?谢
      

  3.   

    uses
      { OtherUnit, }ShareMem;{ 如果你的String可能包括#0字符,你必须使用Len参数 }
    function MidString(S: PChar; Len: PInteger): PChar; stdcall;
    var
      I: Integer;
      newLen: Integer;
    begin
      NewLen := 0;
      for I := 0 to Len^-1 do
      begin
        if S^ = 'A' then
          Inc(NewLen);
        Inc(S);
      end;
      Len^ := NewLen;
      if NewLen = 0 then
        Result := nil
      else
      begin
        GetMem(Result, NewLen);
        FillMemory(Result, NewLen, 'A');
      end;
    end;Exports
      MidString;
      

  4.   

    chills():有点错误。请看一下
       1.  参数是len:Pinteger,没有这个类型。我改为integer后,将程序中len^改变len
       2. FillMemory函数,,使用时会出没有声明的情况。  我改为用freemem(result,newlen)后,再程序中调用,还是会出错。
      

  5.   


    FillMemory在Windows单元中。
      

  6.   

    把参数Len: PInteger变成var Len: Integer
      

  7.   

    我以前做的时候用string也是可以的,可以尝试一下用这个方法
    s:string;
    处理s;
    result:=s;
    另外可以把string 改成AnsiString 这样用C也可以调用
      

  8.   

    对不起,我搞错了,可以在DLL中返回string和以string来作为参数。
    noall()的代码只是有一点错误,我改正后能正确执行:在Dll函数定义
      function Midstring(S:string):string;stdcall;
      var i:integer;
      begin
        for i:=0 to length(s)-1 do
        begin
          if s[i]='A' then
            result:=result+s[i];
        end;
      end;
      
      exports
        midstring name 'MidString';
    在应用程序中如下调用
      在implementation中声明
        function Midstring(S:string):string;stdcall;external 'project1.dll' name 'MidString';procedure TForm1.Button2Click(Sender: TObject);
    begin
      edit1.text:="CAB";
      edit2.text:=midstring(edit1.text);
    end;
      
      

  9.   

    chills():还是有点问题: 试着输入edit1.text的值为一个A,二个AA,三个AAA,四个,五个,只有三个AAA时才没有问题。