Нарушение доступа в NTDLL с использованием IXMLDocument

Я постоянно получаю сообщение о нарушении прав доступа при чтении адреса 0xfeeefeee, где отладчик останавливается на исключении Ntdll.NtRaiseException. Я не могу продолжить отладку, так как получаю условие цикла, сообщающее, что в приложении произошла ошибка... Используйте шаг или выполнить... и это возвращает меня к началу. Это, очевидно, происходит только в 32-битной среде IDE (Delphi XE2). Мое приложение использует следующие биты кода

Var
  XMLDoc: IXMLDocument;

Begin

  If FOD.Execute Then //File Open Dialog

  Begin
    Try

      Try

        XMLdoc := NewXMLDocument(); //TXMLDocument.Create(Nil);

        Result := FOD.FileName;

        XMLDoc.FileName := XMLFilename;

        XMLDoc.Active := True;

Когда файл открывается, я вызываю функции, загруженные из мастера связывания данных XML (File New Other XML), чтобы проанализировать файл XML, открытый в процедуре выше. Я собираюсь создать CSV-файл, а затем использовать sqlldr для экспорта данных в базу данных Oracle. За пределами IDE все работы находят, и я могу оставить приложение работающим, просто показывая данные в сетке sring в одночасье, но в то же время оно вылетает через несколько минут. Стек вызовов не показывает мне ничего полезного. Как вы видите, я пробовал TXMDocument.create, а также NewXML, но безрезультатно. Я попытался поместить объект в форму и использовать этот экземпляр безрезультатно. Кто-нибудь, пожалуйста, есть какие-либо идеи. (Windows 7 64 битная, но я компилирую в 32 битную из-за зависимостей оракула)

Редактировать, стек вызовов даже при включенной отладке dcus не показывает ничего полезного, только ссылки на ole32.dll и другие связанные с NT библиотеки

Код для приложения показан ниже (некоторые из них)

Function TXMLForm.OpenFile: String;
Var
  XMLDoc: IXMLDocument;
Begin
  If FOD.Execute Then
  Begin
    Try
      Try
        XMLdoc := NewXMLDocument(); //TXMLDocument.Create(Nil);
        Result := FOD.FileName;
        XMLDoc.FileName := XMLFilename;
        XMLDoc.Active := True;
        SB1.Panels[1].Text := FOD.Filename;
      Finally
        // xmldoc := nil;
      End;
    Except
      On E: Exception Do
        ShowMessage('Excpetion in Opening or creating XML Document. ' + E.Message);
    End;
  End
  Else
    Result := '';
End;

Openfile вызывается этим типом процедуры

Procedure TXMLForm.StandardProfile1Click(Sender: TObject);
Var
  Stand: Standard.IXMLProfileData;
  I, X: Integer;
Begin
  XMLFileName := Openfile;
  If Xmlfilename <> '' Then
  Begin
    Stand := Standard.LoadProfileData(XMLFileName);
    SG1.RowCount := Stand.Count;
    Sg1.ColCount := Stand.Device[Stand.Count - 1].Count + 7;
    // SG1.ColCount := 55;
    SG1.Cells[0, 0] := 'SERIALNO';
    SG1.Cells[1, 0] := 'MFGSERIALNO';
    SG1.Cells[2, 0] := 'SUPPLYTYPE';
    SG1.Cells[3, 0] := 'SERVICEPOINTNO';
    SG1.Cells[4, 0] := 'PARAMETERCODE';
    SG1.Cells[5, 0] := 'INTERVALPERIOD';
    SG1.Cells[6, 0] := 'STARTTIME';
    // For X := 0 To 47 Do
    // SG1.Cells[7 + X, 0] := 'INTERVAL' + Inttostr(X);
    For X := 0 To Stand.Device[Stand.Count - 1].Count - 1 Do
      SG1.Cells[7 + X, 0] := 'INTERVAL' + Inttostr(X);

    For I := 0 To Stand.Count - 1 Do
    Begin
      SG1.Cells[0, I + 1] := Stand.Device[I].SerialNo;
      SG1.Cells[1, I + 1] := Stand.Device[I].MfgSerialNo;
      SG1.Cells[2, I + 1] := Stand.Device[I].SupplyType;
      SG1.Cells[3, I + 1] := Stand.Device[I].ServicePointNo;
      SG1.Cells[4, I + 1] := Stand.Device[I].ParameterCode;
      SG1.Cells[5, I + 1] := Stand.Device[I].IntervalPeriod;
      SG1.Cells[6, I + 1] := Stand.Device[I].StartTime;
      // For X := 0 To 47 Do
      For X := 0 To Stand.Device[Stand.Count - 1].Count - 1 Do // 47
       Begin
        If Stand.Device[I].Interval[X] = '' Then
          SG1.Cells[7 + X, I + 1] := 'TRUE'
        Else
          SG1.Cells[7 + X, I + 1] := Stand.Device[I].Interval[X];
      End;
    End;
  End;
End;

Как указывалось ранее, я пытался использовать TXMDocument, IXMLDocument и использовать Create и NewXMDocument, но это все равно дает ошибки. DEbug dcus'не имеет значения. Я устал использовать FastMM4 в заголовке проекта и MadExcept, но они не улавливают ошибку.

2 ответа

Благодаря Реми проблема решена. Это действительно был случай, когда CoInitialize не вызывали. Я полностью забыл об этом.

Вы не показываете весь код, обрабатывающий XMLDoc; может ты это освобождаешь?

"Когда TXMLDocument создается без владельца, он ведет себя как интерфейсный объект. То есть, когда все ссылки на его интерфейс освобождаются, экземпляр TXMLDocument автоматически освобождается. Однако, когда TXMLDocument создается с владельцем, он ведет себя как любой другой компонент, и освобождается его владельцем." См. Delphi - TXMLDocument, созданный во время выполнения, генерирует AV, с компонентом в форме работает

Также, когда закончите, установите XMLDoc:= nil;

Другие вопросы по тегам