Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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
Api 如何调试对象调用中的访问冲突?_Api_Delphi_Debugging_Soap_Access Violation - Fatal编程技术网

Api 如何调试对象调用中的访问冲突?

Api 如何调试对象调用中的访问冲突?,api,delphi,debugging,soap,access-violation,Api,Delphi,Debugging,Soap,Access Violation,当我调用SOAP API方法时,我得到以下消息: First chance exception at $74EDB9BC. Exception class EAccessViolation with message 'Access violation at address 007004F6 in module 'DB2.exe'. Read of address 00000005'. Process DB2.exe (3768) 以下是我从堆栈跟踪中得到的信息: 74EDB9AF 8945

当我调用SOAP API方法时,我得到以下消息:

First chance exception at $74EDB9BC. Exception class EAccessViolation with 
message 'Access violation at address 007004F6 in module 'DB2.exe'. 
Read of address 00000005'. Process DB2.exe (3768)
以下是我从堆栈跟踪中得到的信息:

74EDB9AF 8945C0        mov [epb-$40],eax
74EDB9B2 8D45B0        lea eax,[edp-$50]
74EDB9B5 50            push eax
74EDB9B6 FF155C11ED74  call dword ptr [$74ed115c]
74EDB9BC C9            leave
我不太熟悉Delphi(只是维护一个旧程序)。有人能告诉我如何调试这里发生的事情吗?我使用的是Delphi2005

下面是失败的代码。调用
UpdateContact
时出错,我知道
aContact
FCompanyID
的数据是否存在且正确:

function TScheduleCenterBeta.AccountUpdate(aContact: c_ScheduleCenterBetaAPI.Contact): boolean;
begin
  try
    SendAuthHeader();
    FContact := FSoapService.UpdateContact(aContact, FCompanyID);
  except
    on e:Exception do begin
      MessageDlg(e.Message,mtWarning,[mbOK],0);
    end;
  end;
  result := true;
end;
对象
FContact
在创建主对象时创建:

constructor TScheduleCenterBeta.Create(aOwner: TComponent; aCallID: integer = -1);
begin
  inherited Create(aOwner);

  FCallID := aCallID;
  FCompanyID := c_ScheduleCenterBetaAPI.CompanyID.Create();
  FCompanyID.ServiceCompanyID := StrToInt(TfrmCall(Screen.ActiveForm).Company.IP_CompanyID);
  FProperty_ := c_ScheduleCenterBetaAPI.Property_.Create();
  FContact := c_ScheduleCenterBetaAPI.Contact.Create();
  FContact.ContactID := -1;
  FContact.Address := c_ScheduleCenterBetaAPI.Address.Create();
  FAppointmentSlot := c_ScheduleCenterBetaAPI.AppointmentSlot.Create();
end;

另一个奇怪之处是错误时有发生。如果我停止程序,然后再次启动它(使用Delphi调试模式),我可能会或可能不会遇到错误。我还重新启动了Delphi,以确保它与Delphi本身无关,但似乎没有改变任何东西。

请围绕API方法调用提供您的Delphi代码。您可以从提供实际代码开始。异常消息(00000005)中的地址表示您可能正在使用nil指针或未初始化的变量,但如果没有更多信息,很难告诉您更多信息。如果您有链接到生成该exe的确切DCU,您可能可以使用第一个地址尝试并定位它。通常这是因为您需要一个指向字符串的指针,但在尝试填充它之前没有设置它。我建议您添加调试信息和异常堆栈跟踪。所以您最好看看异常发生的确切位置。有很多工具,免费的和商业的,有些是在和中提到的。若程序严重消耗内存,则会使故障更严重。但通常情况下,它们工作正常,可以为您提供更多的崩溃细节。调试你的应用程序,找出哪个指针是零。