0

これは、nlog C++ API の使用に関連していると思います (nlog フォーラムに関する私の質問はこちら)。ここでこの質問をする目的は、より多くの聴衆に私の問題を知ってもらうことと、私の特定のシナリオで VB6 IDE がビルドに失敗したことの背後にある、より一般的なアイデアを得ることです。

簡単に言えば、私が抱えている問題は、nlog の C\C++ API (NLogC.DLL で定義されている) への呼び出しを持つアンマネージ C++ コンポーネントを参照する VB6 コンポーネントの構築に問題があることです。ビルドの問題はコンパイル時に発生するのではなく、バイナリがビルドされているときに発生します。これは、ある種のリンカー タイプの問題であることを示唆しています。VB6バイナリがどのように生成されるかについて十分に知りません。VB6 バイナリが生成されますが、破損しており、起動後すぐにクラッシュします。

VB6 で同様の経験をした人はいますか (nlog や C++ に関係する必要はありません)。

編集:このややあいまいな問題へのすべての応答に感謝します。残念ながら、まだ前進はありません。これを投稿してからの私の発見:

  1. コンパイル オプションを「微調整」しても、この問題は解決しないようです。
  2. 「空の」VB6 プロジェクトから nlog 対応の C++ コンポーネントへの参照を追加しても、プロジェクトがクラッシュしたり、奇妙なビルドの問題が発生したりすることはありません。したがって、これは「ネイティブ」な VB6 の問題ではなく、nlog とさまざまなコンポーネント、および他の参照コンポーネントで使用されるサードパーティ ライブラリとの相互作用に関する問題である可能性がありますか?
  3. C++ 呼び出し規則については、nlog 対応の C++ コンポーネントは、私が見る限り、これらの規則に準拠しており、nlog API 呼び出しを行わない限り、VB6 によって参照されたときに実際に正常に動作します。nlogc.DLL 自体が VB6 に準拠しているかどうかはわかりませんが、API 呼び出しは C++ コンポーネントから行われているため、それは重要ではないと考えていました。VB6 は、C++ コンポーネントが参照しているものを認識したり気にしたりすべきではありません (これに関する私の理解では...)

edit2: また、ビルド中に表示されるエラー メッセージは次のとおりです。「ロード中にエラーが発生しました。詳細については、"xxx" を参照してください。」ログ ファイルを表示すると、「コントロール xxx を読み込めません」と表示されます。興味深いことに、その特定のコントロールへのすべての参照がその特定のプロジェクトから消え、再度ビルドしようとするとコンパイル エラーが発生します。

4

6 に答える 6

2

アンマネージ C++ コードから NLog の COM インターフェイス (NLog.ComInterop.DLL) を使用して問題を回避しました。C\C++ API ほど簡単ではありませんが、少なくとも私の VB6 コンポーネントをクラッシュさせることはありません。

于 2008-09-30T06:47:08.003 に答える
0

エラーの正確な説明または何が起こっているかのスクリーンショットに役立ちます。

確認すべきことの1つは、作成したNLogC.DLLまたはC++DLLに正しい呼び出し規約が定義されている場所です。基本的に、DLL関数名を壊したり、STDCALL呼び出し規約以外のものを使用したりすることはできません。C ++ DLLがこれら2つのことを念頭に置いて作成されていない場合、VB6では機能しません。

呼び出し規約に関するMSDNの記事。

于 2008-09-26T13:28:32.843 に答える
0

ProjectPropertiesメニュー、CompileパネルにあるCompileオプションのいくつかを微調整して、何が問題なのかについて追加のヒントが得られるかどうかを確認します。

たとえば、実行可能ファイルをネイティブ コードではなくp コードにコンパイルすると、起動時にクラッシュします。

于 2008-09-25T04:06:41.420 に答える
0

リンカーの問題である可能性があると思われる場合、これは同じようにクラッシュするはずです。

  1. 新しい標準プロジェクトを作成する (あらゆる種類の)
  2. 新しいモジュールを追加し、「宣言」ステートメントをそれにコピーします
  3. コンパイル

クラッシュしない場合は、別のものです。

于 2008-09-25T21:17:35.903 に答える
0

コンパイルしたバイナリを実行すると、どのようなエラー メッセージが表示されますか?

コンパイラ/リンカーに問題があるとは思えません。VB6 プロジェクトのプロジェクト参照は、最終的な実行可能ファイルにリンクされていません。VB6 のプロジェクト参照は、実際には COM タイプ ライブラリ (.dll またはその他のバイナリ ファイル タイプに埋め込まれている場合と埋め込まれていない場合があります) への参照です。プロジェクト参照は、主に次の 2 つの目的に役立ちます。

  1. IDE は、参照されたタイプ ライブラリからタイプ情報を抽出し、オブジェクト ブラウザ (および Intellisense ドロップダウン) に表示します。

  2. コンパイル時に、コンパイラは、インスタンス化する各クラスの CLSID など、参照されたライブラリに格納されている型情報を抽出し、このデータを実行可能ファイルに埋め込みます。これにより、実行可能ファイルは、参照したライブラリに含まれるクラスのインスタンスを作成できます。

コンパイルされたバイナリは、参照されているライブラリのコードにリンクされておらず、参照されているライブラリのファイル名も含まれていないことに注意してください。最終的な実行可能ファイルには、実行時に COM オブジェクトをインスタンス化するために必要な CLSID およびその他の型情報のみが含まれます。

問題は、VB6 コンパイル プロセスで問題が発生したというよりも、NLog またはコードからの呼び出し方法にある可能性が高いです。

于 2008-09-25T15:07:46.307 に答える
0

「コントロール xxx を読み込めません」エラーは、現在使用されているものとは異なるバージョンの .ocx から作成された .oca ファイルが原因である可能性があります。その場合は、.oca ファイルを削除すると役立ちます。

于 2008-09-30T17:40:28.667 に答える