1

私はこのように宣言する関数を持っています:

function execProc(ProcName,InValues:PChar;out OutValues:PChar):integer; //The "OutValues" is a out parameter.

そして、私はこの関数を次のように呼び出します。

procedure TForm1.Button6Click(Sender: TObject);
var
 v:integer;
 s:pchar;
begin
 Memo1.Clear;
 v := execProc(pchar('PROC_TEST'),pchar('aaa'),s);
 showmessage(inttostr(v)); //mark line
 Memo1.Lines.Add(strpas(s));
end;

マークライン(showmessage(inttostr(v)))を削除すると、Memo1に正しい結果が表示されますが、showmessage()を使い続けると、memo1はエラー文字列 "Messag"を表示します。なぜですか? ?助けてくれてありがとう!

function execProc(ProcName,InValues:PChar;out OutValues:PChar):integer;
var
  str: TStrings;
  InValue,OutValue: string;
  i,j,scount: integer;
begin
Result := -100;
i := 0;
j := 0;
str := TStringList.Create;
try
  sCount := ExtractStrings(['|'], [], InValues, str);
  with kbmMWClientStoredProc1 do
  begin
    Close;
    Params.Clear;
    StoredProcName := StrPas(ProcName);
    FieldDefs.Updated := False;
    FieldDefs.Update;
    for i := 0 to Params.Count - 1 do
    begin
      if (Params[i].ParamType = ptUnknown) or
       (Params[i].ParamType = ptInput) or
       (Params[i].ParamType = ptInputOutput) then
      begin
        inc(j);
        InValue := str[j-1];
        Params[i].Value := InValue;
      end;
    end;
    try
      ExecProc;
      for i := 0 to Params.Count - 1 do
      begin
        if  (Params[i].ParamType = ptOutput) or
       (Params[i].ParamType = ptInputOutput) then
         OutValue := OutValue + '|' + Params[i].AsString;
      end;
      OutValues := PChar(Copy(OutValue,2,Length(OutValue)-1));
      Result := 0;
    except
      on E:Exception do
      begin
        if E.Message = 'Connection lost.' then Result := -101;//服务器连接失败
        if E.Message = 'Authorization failed.' then Result := -102;//身份验证失败
        Writelog(E.Message);
      end;
    end;
  end;
finally
  str.Free;
end;
end;
4

1 に答える 1

2

問題は、インターフェースの設計との使用にありPCharます。

OutValues := PChar(Copy(OutValue,2,Length(OutValue)-1));

これは、値を保持する暗黙の非表示のローカル文字列変数を作成することによって実装されます

Copy(OutValue,2,Length(OutValue)-1)

関数が戻ると、その文字列変数は破棄されるためOutValues、割り当てが解除されたメモリを指します。プログラムが機能しているように見えることもありますが、それは偶然です。あなたが観察したように、どんな小さな変化でもそれを妨げる可能性があります。

問題は簡単に修正できます。ではなく文字列パラメータを使用するだけですPChar。これにより、コードが読みやすくなり、正しく機能するようになります。

function execProc(ProcName, InValues: string; out OutValues: string): integer;
于 2012-05-21T06:12:38.860 に答える