この質問は、「VS バージョン間で一貫性のある dll バイナリを作成する方法」に関連しています。
- VC6 で構築されたアプリケーションと DLL と、VC9 で構築された新しいアプリケーションがあります。VC9 アプリは VC6 でコンパイルされた DLL を使用する必要があり、そのほとんどは C で記述され、1 つが C++ で記述されています。
- C++ ライブラリは、名前の装飾/マングリングの問題により問題があります。
- いくつかの副作用があるように見えるため、VC9 ですべてをコンパイルすることは現在のオプションではありません。これらを解決するには、かなりの時間がかかります。
- C++ ライブラリを変更できますが、VC6 でコンパイルする必要があります。
- C++ ライブラリは、本質的に別の C ライブラリの OO ラッパーです。VC9-app は、いくつかの非静的関数だけでなく、いくつかの静的関数も使用します。
静的関数は次のようなもので処理できますが
// Header file
class DLL_API Foo
{
int init();
}
extern "C"
{
int DLL_API Foo_init();
}
// Implementation file
int Foo_init()
{
return Foo::init();
}
非静的メソッドではそれほど簡単ではありません。
私が理解しているように、COM のようなインターフェイスを使用するというChris Becke の提案は役に立ちません。なぜなら、インターフェイス メンバー名はまだ修飾されているため、別のコンパイラで作成されたバイナリからはアクセスできないからです。私はそこにいますか?
唯一の解決策は、オブジェクトへのハンドラーを使用して C スタイルの DLL インターフェイスを作成することですか、それとも何か不足していますか? その場合、おそらく、ラップされた C ライブラリを直接使用する方が労力がかからないでしょう。