Нарушение доступа в 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;