首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重置PChar变量

重置PChar变量
EN

Stack Overflow用户
提问于 2010-03-22 11:32:10
回答 1查看 277关注 0票数 3

我对delphi win 32编程不太了解,但我希望有人能回答我的问题。

我将重复的l_sGetUniqueIdBuffer保存到数据库中,这是我想要避免的。

行之间的l_sGetUniqueIdBuffer实际上是不同的( l_sAuthorisationContent的值是xml,我可以看到调用getUniqueId生成了一个不同的值)。这个问题是间歇性的(重复的很少...)行之间的更新日期仅相差毫秒。

给定:

(不需要的代码被剪掉)

代码语言:javascript
复制
var
    l_sGetUniqueIdBuffer: PChar;
    FOutputBufferSize : integer;

begin
    FOutputBufferSize := 1024;
    ...
    while( not   dmAccomClaim.ADOQuClaimIdentification.Eof ) do
    begin

        // Get a unique id for the request
        l_sGetUniqueIdBuffer := AllocMem (FOutputBufferSize);

        l_returnCode := getUniqueId (m_APISessionId^, l_sGetUniqueIdBuffer, FOutputBufferSize);

        dmAccomClaim.ADOQuAddContent.Active := False;
        dmAccomClaim.ADOQuAddContent.Parameters.ParamByName('pContent').Value := (WideString(l_sAuthorisationContent));
        dmAccomClaim.ADOQuAddContent.Parameters.ParamByName('pClaimId').Value := dmAccomClaim.ADOQuClaimIdentification.FieldByName('SB_CLAIM_ID').AsString;
        dmAccomClaim.ADOQuAddContent.Parameters.ParamByName('pUniqueId').Value := string(l_sGetUniqueIdBuffer);
        dmAccomClaim.ADOQuAddContent.ExecSQL;

        FreeMem( l_sAuthorisationContent, l_iAuthoriseContentSize );

        FreeMem( l_sGetUniqueIdBuffer, FOutputBufferSize );
    end;
end;

我想我需要知道,l_sGetUniqueIdBuffer中的值是不是每一行都被重置了?

EN

回答 1

Stack Overflow用户

发布于 2010-03-22 16:52:37

AllocMem的实现方式如下

代码语言:javascript
复制
function AllocMem(Size: Cardinal): Pointer;
begin
  GetMem(Result, Size);
  FillChar(Result^, Size, 0);
end;

所以,是的,l_sGetUniqueBuffer指向的值将始终重置为空字符串。

调试

代码语言:javascript
复制
var
    l_sGetUniqueIdBuffer: PChar;
    FOutputBufferSize : integer;
    list: TStringList;
begin
    FOutputBufferSize := 1024;
    ...

    list := TStringList.Create;
    try
      list.Sorted := True;
      while( not   dmAccomClaim.ADOQuClaimIdentification.Eof ) do
      begin

          // Get a unique id for the request
          l_sGetUniqueIdBuffer := AllocMem (FOutputBufferSize);

          l_returnCode := getUniqueId (m_APISessionId^, l_sGetUniqueIdBuffer, FOutputBufferSize);

          dmAccomClaim.ADOQuAddContent.Active := False;
          dmAccomClaim.ADOQuAddContent.Parameters.ParamByName('pContent').Value := (WideString(l_sAuthorisationContent));
          dmAccomClaim.ADOQuAddContent.Parameters.ParamByName('pClaimId').Value := dmAccomClaim.ADOQuClaimIdentification.FieldByName('SB_CLAIM_ID').AsString;
          dmAccomClaim.ADOQuAddContent.Parameters.ParamByName('pUniqueId').Value := string(l_sGetUniqueIdBuffer);

          if list.IndexOf(l_sGetUniqueIdBuffer) <> - 1 then
            write; //***** Place a breakpoint here.
          list.Add(l_sGetUniqueIdBuffer);

          dmAccomClaim.ADOQuAddContent.ExecSQL;

          FreeMem( l_sAuthorisationContent, l_iAuthoriseContentSize );

          FreeMem( l_sGetUniqueIdBuffer, FOutputBufferSize );
      end;
    finally
      list.Free;
    end;
end;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2489891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档