0

私たちが使用しているサードパーティの.DLLファイルにバグがあり、私はそれを修正するように割り当てられています。ライブラリは、コードを維持するために最後に雇われた会社によって作成されたものであり、ソースコードの一部しかありません。処理に使用されるオブジェクトが私たちが持っているコードにあるときはいつでも、それらはOleVariantsの形式になっています。私の解決策は、バグのあるサブクラスを作成し、メソッドをオーバーライドしてバグを修正することでした。問題は、親クラスからメソッドを呼び出そうとすると、別の.DLLファイルからメモリアクセス違反エラーが発生することです。

私は完全なDelphiの初心者であり、これで3週目になります。どんな助けでもいただければ幸いです。

ありがとうございました。

編集:私はおそらくもう少し詳しく説明する必要があります。元のオブジェクトを、修正が含まれている新しいクラスのインスタンスに置き換えています。元のオブジェクトをOleVariantから新しいクラスにキャストして再キャストするか、オブジェクトのデータを維持できるように新しいオブジェクトのコンストラクターに渡そうとしています。継承された関数またはオブジェクトが元の型にキャストされた後にオブジェクトから関数を呼び出すときに、これを行う方法があり、エラーが発生しないかどうか疑問に思っています。ありがとうございました。

編集2:1つの質問に答えるために、OleVariantから元のクラスまたは作成したサブクラスにキャストしようとしています。

2番目の質問に答えるために:私は関係するライブラリをインポートしてから、次のように書きました。

Subclass = class(SuperclassFromDll)

ここで、「Subclass」と「SuperclassFromDll」は実際のクラス名です。これが正しい方法ではない場合は、問題の関数を置き換える方法を教えてください(おそらく、DllName_TLBユニットに修正を書き込むことによって?)。明確になっていないことをお詫び申し上げます。私はすぐに質問をしようとしているので、それを理解することに戻ることができます。

編集3:DLLファイルは前の会社によって作成されたDelphiプロジェクトから作成されたことにも注意する必要があります。

4

1 に答える 1

2

あなたはこれを行うことはできません。David Heffernanが言うように、それは「自明ではない」ということです。これは、それを成功させるには天才でなければならないと言う良い方法です。したがって、それを試みる場合は、Delphiの初心者である必要はありません。(OTOH、あなたがデルファイ初心者でなければ、あなたはそれを考えさえしないでしょう)。

1つには、COMオブジェクトがDelphiで実装され、動的にリンクされ、同じバージョンのDelphiでコンパイルされている場合にのみ、COMオブジェクトをDelphiオブジェクトにキャストできます。

クラスでメソッドを呼び出すと問題が発生すると報告されているため、より適切で簡単な解決策は、問題の原因となる状況を分離し、そのような状況でメソッドを呼び出さないようにすることです。

ラッパークラスでそれを行うことができます。したがって、OleVariant(内部ではCOMオブジェクトを想定)をキャストしてそれをdelphiラッパークラスにキャストするのではなくCProblemObjectShim、問題のあるクラスをメンバーとして持つ独自のクラスを作成します。次に、含まれているオブジェクトを呼び出し、問題を回避するために必要な追加のチェックまたは手順を追加して、すべてのメソッドを実装します。

于 2011-03-15T12:58:48.503 に答える