0

デバッガーが Ntdll.NtRaiseException で停止するアドレス 0xfeeefeee の読み取りでアクセス違反が継続的に発生します。これ以上デバッグすることはできません。アプリに障害が発生したことを示すループ状態が発生するためです。ステップを使用するか、実行します...これは私を最初に戻します。これは明らかに IDE (Delphi XE2) 32 ビットでのみ発生します。私のアプリケーションは、次のコードを使用しています

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 グリッドにデータを表示するだけでアプリケーションを実行したままにすることができますが、ide では数分以内にクラッシュします。コール スタックには、有用なものは何も表示されません。ご覧のとおり、TXMDocument.create と NewXML を試しましたが、役に立ちませんでした。オブジェクトをフォームに配置して、そのインスタンスを無駄に使用しようとしました。どなたかアイデアをお願いします。(Windows 7 64 ビットですが、オラクルの依存関係のために 32 ビットに準拠しています)

編集、debug dcus がオンになっている場合でも、コール スタックは、ole32.dll およびその他の nt 関連の dll への参照だけで何も役に立たないことを示します

アプリのコードを以下に示します (一部)。

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' は違いはありません。プロジェクトヘッダーと MadExcept で FastMM4 を使用するのにうんざりしていますが、エラーをキャッチしません。

4

2 に答える 2

0

XMLDoc を処理するすべてのコードを示しているわけではありません。もしかして解放してる?

「TXMLDocument が所有者なしで作成されると、インターフェース化されたオブジェクトのように動作します。つまり、そのインターフェースへのすべての参照が解放されると、TXMLDocument インスタンスは自動的に解放されます。ただし、TXMLDocument が所有者で作成されると、他のオブジェクトと同様に動作します。コンポーネントであり、その所有者によって解放されます。」Delphi - 実行時に作成された TXMLDocument が AV を生成し、フォーム上のコンポーネントが機能していることを確認してください。

また、完了したら、XMLDoc := nil; を設定します。

于 2013-04-18T09:04:41.253 に答える