質問

これは、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++ コンポーネントが何を参照しているのかを知りませんし、気にする必要もありません (これについては私の理解の範囲内です...)

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

役に立ちましたか?

解決

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

他のヒント

いくつか調整してみます コンパイル にあるオプション プロジェクト, プロパティ メニュー、 コンパイル パネルを参照して、何が問題になっているのかについて追加のヒントが得られるかどうかを確認します。

たとえば、実行可能ファイルを次のようにコンパイルすると、 Pコード それよりも ネイティブコード まだ起動時にクラッシュしますか?

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

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

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

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

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

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

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

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

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

エラーの正確な説明や、何が起こっているかのスクリーンショットが役立つでしょう。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top