问题是这样的:
比如我在DLL中定义的函数为:
function StrAdd(InputStr,OutPutStr:PChar):Boolean;
begin
  try 
    OutPutStr:=InputStr+'sadf';
    Result:=True;
  except
    Result:=False;
  end;
end;
InputStr为输入的值,而OutPutStr为输出值,也就是当StrAdd为TRUE的时候,要得到OutPutStr的值,这个OutPutStr应该怎么定义呢?用var可以吗?
function StrAdd(InputStr,var OutPutStr:PChar):Boolean;

解决方案 »

  1.   

    function StrAdd(InputStr,OutPutStr:PChar;aParms:Olevariant):Boolean;
    其中aParms在dll调用之前,可以将你想用的参数放进去。
    aParms:=VarArrayCreate([0,n],varVariant);
    n是参数的个数。
    以下赋值:
    aParms[0]:=...
    aParms[1]:=...
    aParms[2]:=...
    aParms[n]:=...Dll调用时:
    Value0:=aParms[0];
    Value1:=aParms[1];
    Value2:=aParms[2];
    ...
    Valuen:=aParms[n];
      

  2.   

    try 
        OutPutStr:=InputStr+'sadf';//OutPutStr/InputStr是指针,不能相加的!!!
        Result:=True;
      except
        Result:=False;
      end>>用var可以吗?
    >>function StrAdd(InputStr,var OutPutStr:PChar):Boolean;
    也不行!如果确实要实现InputStr+'sadf',必须在调用这个函数前为OutPutStr分配足够的内存
    OutPutStr:=allocmem(1000);function StrAdd(InputStr,var OutPutStr:PChar):Boolean;
    try    
        move(InputStr^, OutPutStr^,strlen(InputStr));
        strcopy(OutPutStr,'sadf');
        OutPutStr:=InputStr+'sadf';//OutPutStr/InputStr是指针,不能相加的!!!
        Result:=True;
      except
        Result:=False;
      end
    end;最后释放内存freemem(OutPutStr);
      

  3.   

    function StrAdd(InputStr,var OutPutStr:PChar):Boolean;
    try    
        move(InputStr^, OutPutStr^,strlen(InputStr));
        strcopy(OutPutStr,'sadf');
        
        Result:=True;
      except
        Result:=False;
      end
    end;最后释放内存freemem(OutPutStr);
      

  4.   

    不好意思啊,那里说错了
    如果不用var其它还有什么方法吗?
    我看到有些软件里的调用里面没有var、也没有外加什么参数就实现了类似的功能了。
      

  5.   

    procedure StrAdd(lpInBuffer:PChar; length:Integer);
    var
      StrAdd: function(lpInBuffer:PChar; lpOutBuffer:PChar; length:Integer): Boolean;  stdcall;
      OutputStr: array [0..32] of Char;
    begin
      FillChar(OutputStr, SizeOf(OutputStr), #0);
      Initialize;
      if hlib <> 0 then begin
        @StrAdd := GetProcAddress(hlib, 'StrAdd');
        if @StrAdd <> nil then begin
          if StrAdd(lpInBuffer, OutputStr, length) then
            Return := OutputStr
          else
            Return := '函数调用错误!'
        end
        else
          ShowMessage('加载功能模块出错!');    FreeLibrary(hlib);
      end
      else
        ShowMessage('无法加载DLL!');
    end;这是我看到的人家的调用。怎么使用呢?
      

  6.   

    人家的调用都贴出来了对的啊!照着用就可以了!不同的是它在栈上分配内存,我在堆上
    OutputStr: array [0..32] of Char; FillChar(OutputStr, SizeOf(OutputStr), #0);
    OutPutStr:=allocmem(1000);效果是一样的
      

  7.   

    to:flyinwuhan我帖出来的是人家调用DLL的代码,那么lpOutBuffer在DLL应该怎么定义,这样才可以在主程序中得到一个值?
      

  8.   

    >>那么lpOutBuffer在DLL应该怎么定义
    这是外部传入的参数,在DLL不需要定义。谁调用你的dll,谁负责定义它,你不用管它
      

  9.   

    但是我按照人家的调用得不到OutputStr值。
    应该要做什么处理吧?
      

  10.   

    晕倒俺到现在还不明白这个DLL到底是你写的还是别人写的?
    如果是你写的那把你的代码贴出来。当然不管是谁写的,在调用这个函数之前必须先给OutputStr分配内存,然后才能调用这个函数
      

  11.   

    DLL是自己写,然后调用也是我自己,我只是在调用的时候让参数得到DLL处理后的值,而不是通过返回。
      

  12.   

    >>但是我按照人家的调用得不到OutputStr值。
    那是你的dll写的有错误。也许你的dll忘了加stdcall把你的DLL 代码贴出来。
      

  13.   

    这是DLL代码:
    library AppDll;uses
      SysUtils,Windows,Classes,Dialogs;{$R *.res}function AddStr(lpInputStr:PChar;lpOutputStr:PChar):Boolean;stdcall;
    begin
      try
        lpOutputStr:=PChar(StrPas(lpInputStr)+'abcdef');
        Result:=True;
      except
        Result:=False;
      end;  
    end;exports
      AddStr;
      
    begin
    end.主程序代码:
    var
      hlib: HMODULE;implementation{$R *.dfm}procedure Initialize;
    begin
      hlib:= LoadLibrary('AppDLL.dll');
    end;Procedure Str(lpInputStr:PChar);
    var
      AddStr: function(lpInputStr:PChar;lpOutputStr:PChar): Boolean;  stdcall;
      DllStr:array[0..30] of Char;
    begin
      FillChar(DllStr, SizeOf(DllStr), #0);
      Initialize;
      if hlib <> 0 then begin
        @AddStr := GetProcAddress(hLib, 'AddStr');
        if @AddStr <> nil then begin
          if AddStr(lpInputStr, DllStr) then
            Form1.Edit1.Text:= DLLStr
          else
            Form1.Edit1.Text:= '函数调用错误!'
        end
        else
          ShowMessage('加载功能模块出错!');    FreeLibrary(hLib);
      end
      else
        ShowMessage('无法加载DLL!');
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Str(PChar('123456'));
    end;