2012-01-26 8 views
2

VC++ 2010クライアントおよび古いVC++バージョンクライアントで使用できるVisual C++ 2010を使用してSDKを作成したいと思います。 2005年版と2008年版に互換性を持たせたいとしましょう。 SDKには、h、lib、およびdllファイルがいくつか含まれています。ライブラリはC++クラスとグローバル関数をエクスポートしています。公開SDKインターフェイス(hファイル)には、以前のVC++バージョンではサポートされていない機能は含まれていません。内部SDKの実装には、そのような機能(ラムダ式、右辺値参照など)が含まれている場合があります。VC++ 2008、2005クライアントのVC++ 2010 SDK

一部の公開SDKメソッドには、コールバックインターフェイスパラメータがあります。コールバックインターフェイスは私のhファイルで定義され、クライアントコードで実装され、私のメソッドに渡されます。これは問題になりますか?

私はいくつかの小さなテストを行い、それが動作することを発見しました。誰もが古いVC++のバージョンで書かれた、C++クライアントによるVC++ 2010 SDKの使用に関する問題を知っていますか?

+3

実行時ライブラリの互換性の問題がある可能性があります。それは推測ですが、有効なものだと思います。実際、推測ではありません。[リンク](http://msdn.microsoft.com/en-us/library/ms235460%28v=vs.100% 29.aspx)。 – lapk

+0

@AzzA - 良い点。私のSDKはそのようなオブジェクトをそのインターフェイスに渡しません。ありがとう。 –

答えて

2

主要な原則:

  • あなたは、標準C++ライブラリ(のstd ::文字列など)から任意のオブジェクトを公開することはできません、彼らのレイアウトは、あなたが例外を使用することはできません
  • 互換性がありません、SEHは
  • 大丈夫ですクライアントコードでポインティング先のリソースを解放する必要のあるポインタを返すことはできません
  • /MTを使用してビルドして、必要なCRTバージョンを掘り下げないようにしてください。
  • /Zp以外のコンパイラ設定の影響を受けないことが保証されていれば、2003年から2010年の間にオブジェクトのレイアウトは一般的に問題ありません。仮想継承は面倒です。選択された構成にかかわらず、sizeofが同じサイズを生成することを確認します。

COMは、互換性を最大限にするための良い方法です。

+0

SDKは、内部的にもSDKインターフェイスの一部としても例外を使用します。他のエクスポートされたクラスメソッドによってスローされる、自分自身のエクスポートされた例外クラス(std :: exceptionから派生したものではありません)があります。だから、これは失敗するでしょうか? –

+0

別の質問:VC++ 2005で書かれたSDKとVC++ 2010クライアントの互換性など、この問題は同じですか?ありがとう。 –

+0

例外は使用できません。唯一の安全な方法は、スローするコードと、同じモジュール内に生きるコードが存在する場合です。明らかにAPIの場合はそうではありません。アロケータは問題であり、例外オブジェクトを安全に破棄することはできません。 HRESULTのようなSEH(実用的でない)コードやエラーコードを使用する必要があります。また、VS2005で構築したVS2010では、安全なAPIも同様に機能します。 –

関連する問題