【问题标题】:Resetting a PChar variable重置 PChar 变量
【发布时间】:2010-03-22 03:32:09
【问题描述】:

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

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

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

给定:

(剪掉了多余的代码)

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 中的值是否会为每一行重置??

【问题讨论】:

  • 重复项是实际的唯一 ID 还是空字符串?
  • 使用相同的 m_APISessionID 调用两次 getUniqueID 会返回什么?

标签: delphi winapi


【解决方案1】:

AllocMem 实现如下

function AllocMem(Size: Cardinal): Pointer;
begin
  GetMem(Result, Size);
  FillChar(Result^, Size, 0);
end;

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

调试

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;

【讨论】:

  • 您好 Lieven,感谢您的回复。重复项是以 WEB201171a5f498869529300 形式存储在数据库中的实际 id,但是保存到 l_sAuthorisationContent (和数据库)中的实际 xml 是不同的。在处理 while 循环之外的所有行之前,只设置一次会话: l_returnCode := createSessionEasyclaim( m_APISessionId, PChar( l_crypto_path ), PChar( l_location_pwd ) );我想理论上它可以逐行完成,但我认为会话需要的其他元素禁止这样做。
  • 也许字符串转换与它有关? dmAccomClaim.ADOQuAddContent.Parameters.ParamByName('pUniqueId').Value := string(l_sGetUniqueIdBuffer);
  • 就个人而言,我会责怪 getUniqueID 方法。出于调试目的,我将创建一个字符串列表并将每个 l_sGetUniqueIdBuffer 添加到其中,并检查它是否已经存在。如果已经存在,可以设置断点。
猜你喜欢
  • 2019-08-18
  • 1970-01-01
  • 2014-01-07
  • 2015-01-27
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
相关资源
最近更新 更多