4

Media Foundation Transformの一部である私の C++ コードは、Windows ストア アプリ (Metro) で実行できる傾向があります。

を変更しC++ GrayscaleTransformて、次のコードを含めます。

ただし、私の C++ コードは namespace を見つけることができませんWindows::Storage

LPCWSTR zPath = Windows::Storage::ApplicationData::Current->TemporaryFolder->Path->Data();

必要な追加設定はありますか?

Consume Windows Runtime Extensionをオンにすることで、コンパイルすることができます。

ここに画像の説明を入力

しかし、これを行うと、追加のリンク エラーと警告が表示されます。

warning LNK4197: export 'DllGetActivationFactory' specified multiple times; using first specification 
warning LNK4197: export 'DllCanUnloadNow' specified multiple times; using first specification
warning LNK4197: export 'DllGetActivationFactory' specified multiple times; using first specification 
warning LNK4197: export 'DllCanUnloadNow' specified multiple times; using first specification
error LNK2005: _DllCanUnloadNow@0 already defined in dllmain.obj 
error LNK1169: one or more multiply defined symbols found

コメントアウトするDllCanUnloadNowと実行時エラーが発生します。

私はでランタイムブレークを取得します

// GrayscaleTransform.dll!Microsoft::WRL::Details::ModuleBase::ModuleBase()  Line 155 + 0x46 bytes  C++

    ModuleBase() throw()
    {
#ifdef _DEBUG
        // This indicates that there were two instances of the module created or race conditon during module creation
        // If you are creating object with new/delete please make sure that you haven't created more than one module 
        // and you disabled static initalization with __WRL_DISABLE_STATIC_INITIALIZE__
        // otherwise please initialize/create module in main()
        __WRL_ASSERT__(::InterlockedCompareExchangePointer(reinterpret_cast<void* volatile*>(&module_), this, nullptr) == nullptr &&
            "The module was already instantiated");

        SRWLOCK initSRWLOCK = SRWLOCK_INIT;
        __WRL_ASSERT__(reinterpret_cast<SRWLOCK*>(&moduleLock_)->Ptr == initSRWLOCK.Ptr && "Different value for moduleLock_ than SRWLOCK_INIT");
        (initSRWLOCK);
#else
        module_ = this;
#endif
    }
4

1 に答える 1

8

GrayscaleTransform プロジェクトで C++/CX を有効にしたため、リンカー エラーが発生します。プロジェクトは、dllmain.cpp にリストされているエントリ ポイントを定義します。C++/CX を有効にすると、vccorlib がモジュールにリンクされ、これらのエントリ ポイントも定義されます。

ランタイム エラーは、vccorlib の C++/CX インフラストラクチャがモジュールを作成し、エントリ ポイントが別の種類のモジュールを作成しようとするために発生します。モジュールには 1 つのモジュールしか存在できません。

C++/CX を使用できるようにするには、GrayscaleTransform プロジェクトにさらにいくつかの変更を加える必要があります。

  • dllmain.cpp から 4 つの Dll*() 関数を削除します。代わりに、vccorlib からリンクされた定義に依存します。クラス登録 ( ActivatableClass(CGrayscale)) は引き続き必要であることに注意してください。

  • C++ プリプロセッサ オプション_WINRT_DLLで、「プリプロセッサ定義」で が定義されていることを確認します。

  • リンカーの入力オプションで、「モジュール定義ファイル」を削除します。

WRL を使用して C++/CX と「低レベル」の C++ を混在させる場合は、十分に注意する必要があることに注意してください。C++/CX 型を含むほとんどの式は例外をスローする可能性があるため、例外が ABI の境界を超えることは絶対に許可されないようにする必要があります。

または、C++/CX を使用せず、代わりにプロジェクト全体で WRL を使用することを検討してください。より冗長になりますが、プロジェクトの他の部分ですでに WRL を使用している場合は、より理にかなっている可能性があります。

于 2012-10-16T17:32:17.623 に答える