8

従来の c++ COM アプリケーションに単体テストを追加しようとしています。また、各ビルドでエラーが発生していないことを確認するために、ユニット テストを実行できるビルド マシンも必要です。ただし、1 つのビルド マシンで複数のバージョンを並行してビルドできるように、ビルド マシンで com dll を登録する必要はありません。マニフェスト ファイルを使用して登録無料の com を使用するように変更できると想定していましたが、それを機能させるのに非常に苦労しています。まだコードベースではなく、Microsoft が提供する基本的な例だけです。
私はこのページhttp://msdn.microsoft.com/en-us/library/ms973913.aspx#rfacomwalk_topic8を使用してきましたが 、マニフェストファイルを使用するために登録されていないdllで実行しようとすると、単に機能しません、「クラスが登録されていません」というエラーが表示されます

彼らが提供するサンプルは (c++ com サーバーと c++ クライアントを使用して) 正常に動作しますが、再構築すると動作しません。

私たちは Visual Studio 2013 を使用しているため、登録無料の com が機能する方法に大きな変更があったように見えます。これにより、このチュートリアルは新しいコンパイラと互換性がなくなります。

Visual Studio の最新バージョンで登録無料の com を使用するためのリソースを教えてもらえますか? VS 2013 を使用していますが、2010 コンパイラをターゲットにしているため、大きな違いはありません。

また、マニフェスト ファイルよりも登録せずに com コンポーネントで C++ 単体テストを実行するより良い方法がある場合は、それらについても聞きたいです。

ご協力いただきありがとうございます。

4

2 に答える 2

2

追加の DLL パス パラメータを使用する独自のバージョンの CoCreateInstance を実装できます。コードは次のようになります (簡潔にするために、エラー処理とその他の詳細は省略されています)。

HRESULT CoCreateInstanceForTest(dllPath, rclsid, riid, ppv)
{
    HINSTANCE hinst = LoadLibrary(dllPath); // TODO: Maybe it is already loaded
    dllGetClassObject = GetProcAddress(hinst, "DllGetClassObject");
    return dllGetClassObject(rclsid, riid, ppv);
}

エラー処理に加えて、既にロードした DLL を追跡する必要もあります。これを追跡するには、各要素がタプルを持つリストまたは配列を使用します。ある時点で、それらのすべてまたは一部をアンロードしたい場合があります。

もちろん、これらはインプロセス COM サーバーであると想定しています。

于 2014-09-25T16:45:10.123 に答える