Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 重置PChar变量_Delphi_Winapi - Fatal编程技术网

Delphi 重置PChar变量

Delphi 重置PChar变量,delphi,winapi,Delphi,Winapi,我对delphi win 32编程了解不多,但我希望有人能回答我的问题 我将重复的l_sGetUniqueIdBuffer保存到我想要避免的数据库中 行之间的l_sGetUniqueIdBuffer实际上是不同的(l_sauthoritioncontent的值是xml,我可以看到通过调用getUniqueId生成的不同值)。此问题是间歇性的(重复项很少…),行之间的更新日期之间只有毫秒的差异 鉴于: (不必要的代码删除) 我想我需要知道,l_sGetUniqueIdBuffer中的值是否为每行重

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

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

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

鉴于:

(不必要的代码删除)


我想我需要知道,l_sGetUniqueIdBuffer中的值是否为每行重置???

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;
var
l_sGetUniqueIdBuffer:PChar;
FOutputBufferSize:整数;
列表:TStringList;
开始
FOutputBufferSize:=1024;
...
列表:=TStringList.Create;
尝试
list.Sorted:=True;
而(不是dmacomclaim.adoqclaimidentification.Eof)可以
开始
//获取请求的唯一id
l_sGetUniqueIdBuffer:=AllocMem(FOutputBufferSize);
l_returnCode:=getUniqueId(m_APISessionId^,l_sGetUniqueIdBuffer,FOutputBufferSize);
dmAccomClaim.ADOQuAddContent.Active:=False;
dmAccomClaim.ADOQuAddContent.Parameters.ParamByName('pContent')。值:=(宽字符串(l_SauthoritionContent));
dmAccomClaim.ADOQuAddContent.ParamByName('pClaimId')。值:=dmAccomClaim.AdoqClaimIdentification.FieldByName('SB_索赔ID')。AsString;
dmAccomClaim.ADOQuAddContent.Parameters.ParamByName('pUniqueId')。值:=字符串(l_sGetUniqueIdBuffer);
如果list.IndexOf(l_sGetUniqueIdBuffer)-1,则
写;//****在此处放置断点。
列表.添加(l_sGetUniqueIdBuffer);
dmacomclaim.ADOQuAddContent.ExecSQL;
FreeMem(l_Sauthoritorisationcontent,l_Iauthoritorisecontsize);
FreeMem(l_sGetUniqueIdBuffer,FOutputBufferSize);
结束;
最后
列表。免费;
结束;
结束;

重复的是实际的唯一ID还是空字符串?当使用相同的m_APISessionID调用两次时,getUniqueID返回什么?你好,Lieven,谢谢回复。重复项是数据库中存储的WEB201171a5f498869529300形式的实际id,但是保存到l_SauthoritionContent(和数据库)中的实际xml是不同的。在处理while循环之外的所有行之前,会话只设置一次:l_returnCode:=createSessionEasyclaim(m_APISessionId,PChar(l_crypto_path),PChar(l_location_pwd));我想理论上可以逐行进行,但我认为会话所需的额外元素禁止了这一点。也许字符串类型与此有关??dmAccomClaim.ADOQuAddContent.Parameters.ParamByName('pUniqueId')。值:=字符串(l_sGetUniqueIdBuffer);就个人而言,我会责怪getUniqueID方法。出于调试目的,我将创建一个stringlist并将每个LsgetUniqueIDBuffer添加到其中,并检查它是否已经存在。如果它已经存在,则可以设置断点。
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;