0

Microsoft XML Core Services (MSXML) を使用して、Paradox 11.0.0.676 で XML ドキュメントを解析および作成しています。

oleAuto オブジェクトの特定のメソッドを呼び出すと、endMethod ステートメントに到達したときに Paradox がクラッシュします (コードはボタンの pushButton イベントにあります)。その結果、問題は oleAuto 変数の「解放」にある可能性があるという結論に達しました。だから私は変数宣言をフォームに入れました。コードをデバッグすると、GPF はボタンの endMethod に表示されなくなりますが、プログラムを終了するときに引き続き発生します。したがって、問題は変数を解放するところにあるというのは正しいかもしれません。OLE オブジェクトの明示的な close() 命令は、問題を解決しません。誰でもアイデアを得ましたか?私は本当にMSXMLが機能する必要があります.

ここにコードとxmlファイルがあります。コードは、xml-schema に対して xml-file のノードを検証します。(コードと xml ファイルは Microsoft msxml リファレンスからのもので、わずかに変更され、もちろん objectpal に適用されます):

ValidateNode.xml

<?xml version="1.0"?>
<x:books xmlns:x="urn:books">
   <book id="bk001">
      <author>Hightower, Kim</author>
      <title>The First Book</title>
      <genre>Fiction</genre>
      <price>44.95</price>
      <pub_date>2000-10-01</pub_date>
      <review>An amazing story of nothing.</review>
   </book>

   <book id="bk003">
      <author>Nagata, Suanne</author>
      <title>Becoming Somebody</title>
      <genre>Biography</genre>
      <review>A masterpiece of the fine art of gossiping.</review>
   </book>
</x:books>

ValidateNode.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="urn:books"
            xmlns:bks="urn:books">

  <xsd:element name="books" type="bks:BooksForm"/>

  <xsd:complexType name="BooksForm">
    <xsd:sequence>
      <xsd:element name="book"
                  type="bks:BookForm"
                  minOccurs="0"
                  maxOccurs="unbounded"/>
      </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="BookForm">
    <xsd:sequence>
      <xsd:element name="author"   type="xsd:string"/>
      <xsd:element name="title"    type="xsd:string"/>
      <xsd:element name="genre"    type="xsd:string"/>
      <xsd:element name="price"    type="xsd:float" />
      <xsd:element name="pub_date" type="xsd:date" />
      <xsd:element name="review"   type="xsd:string"/>
    </xsd:sequence>
    <xsd:attribute name="id"   type="xsd:string"/>
  </xsd:complexType>
</xsd:schema>

ObjectPal-Code : ボタンが 1 つだけ付いた Paradox-Form。これは、pushButton イベントのコードです (クイック & ダーティー コード :-))。コードは正常に機能します。要素が有効でない理由の詳細を伝えるメッセージボックスに要素が表示されます。コードをデバッグすると、endMethod ステートメントに到達したときに Paradox がクラッシュします。OSはWindows 7 64 Bit、ParadoxはVersion 11.0.0.676です。

method pushButton(var eventInfo Event)
var
 xd, xs, er, nlist, node        oleAuto
 err                            oleAuto
endVar
 if NOT xd.open("Msxml2.DOMDocument.6.0") then
  msgStop("Error", "Error")
  return
 endIf
 if NOT xs.open("Msxml2.XMLSchemaCache.6.0") then
  msgStop("Error", "Error")
  return
 endIf
 xs.add("urn:books", "C:\\LZE\\MSXML\\validateNode.xsd")
 try
  xd^schemas = xs
  xd^async = false
  xd^validateOnParse = false
  xd^load("C:\\LZE\\MSXML\\validateNode.xml")
  err = xd^validate()

  nList = xd^selectNodes("//book")
  node = nList^item(1)
  msgInfo("", node.xml)
  err = xd^validateNode(node)
  msgInfo("", err.reason)

 onFail
  msgStop("!!!", "!!!")
 endTry
 try
  if xd.isAssigned() then
   xd.close()
  endIf
  if xs.isAssigned() then
   xs.close()
  endIf
  if nList.isAssigned() then
   nList.close()
  endIf
  if err.isAssigned() then
   err.close()
  endIf
         onFail
  msgStop("!!!", "!!!")
 endTry
4

1 に答える 1

0

私が抱えていた問題の簡単な要約と、それに対する修正/回避策を提供したいと思います。これは、他の ActiveX および一般的な保護違反の問題に役立つ可能性があるためです。

ActiveXオブジェクトの特定のメソッドを呼び出すと(私の推測では、ポインタが問題である可能性があります)、通常は一般保護違反でパラドックスがクラッシュします。ほとんどの場合、これは endmethod-statement に到達する直前に発生します。問題は変数の「逆参照」である可能性があるという仮定に私を導きました。パラドックス/ウィンドウはそれらをクリアできないか、ウィンドウによって拒否されたメモリの特定のスペースにアクセスしようとします。ボタンの psubutton-event の次のコードは、その良い例です。

method pushButton(var eventInfo Event)
var
    oXD, oXMLElement    oleAuto
endVar

    if NOT oXD.open("Msxml2.DOMDocument.6.0") then
        msgStop("Error", "cant create object")
        return
    endIf

    oXMLElement = oXD.createElement("someElement")
                msgInfo("", oXMLElement.xml)
    oXD.appendChild(oXMLElement)


endMethod

ボタンを初めて押すと、作成された xml 要素を示すメッセージ ボックスが表示されます。ここで実行モードから編集モードに切り替え、フォームを実行してボタンをもう一度押すと、paradox がクラッシュします。oleauto 変数 oXMLElement がまだメモリ内にありました。私はこの問題の修正を探すのに多くの時間を費やしましたが、最終的に回避策を得ました: メソッドの終了前に、oleauto 変数が別のオブジェクト、進行状況バーを参照できるようにします。

if NOT oXMLElement.open("MSComctlLib.ProgCtrl.2") then
    msgStop("Error", "cant create object")
    return
endIf

少なくともこれは、パラドックス11で動作し、win xpとwin 7でテストされています。この歓迎へのコメント。:-)

于 2013-01-28T15:48:56.220 に答える