none
C++/CLI のinterface class の質問です。 RRS feed

  • 質問

  • [ComImport]
    [Guid(L"a3d8cec0-7e5a-11cf-bbc5-00805f6cef20")]
    public interface class IAMovieSetup: IUnknown 
    {
    
    public:
    
        virtual HRESULT CLRMETHODCALLTYPE Register( void) ;
    
    
        virtual HRESULT CLRMETHODCALLTYPE Unregister( void) ;
    
    };
    public struct Win32Api
    {
    public:
    
    	
    	[DllImport("ole32.dll")]
    	static HRESULT CoCreateInstance([In] Guid^% rclsid, [In] IUnknown^ pUnkOuter,[In] DWORD dwClsContext, [In] Guid% riid, [Out] void** ppv);
    };
    int main(array<System::String ^> ^args)
    {
    	Attribute^ IAMovieSetupAttribute = 	Attribute::GetCustomAttribute( IAMovieSetup::typeid, GuidAttribute::typeid );
    	Guid g = Guid(dynamic_cast<GuidAttribute^>(IAMovieSetupAttribute)->Value);
    	Type^ IAMtype =Type::GetTypeFromCLSID(g);
    	if(IAMtype->IsCOMObject){
    		Console::WriteLine("IsCOMObject == true");
    	}
    /*
    Win32Api::CoCreateInstance(gcnew Guid("CDA42200-BD88-11d0-BD4E-00A0C911CE86"),
    				nullptr,
    				(DWORD)CLSCTX::CLSCTX_INPROC_SERVER,
    				IFMtype->GUID,
    				(void*)&pIFM);*/
    
    
    }
    

    上記のようなコードで、CoCreateInstanceを使ってインスタンスを作成したいのですが、戻り値を見ると マイナスの値が返ってきて(要は失敗)しまいます。どのようにしたらインスタンス化できますか。 どなたかご教示くださいください。
    2011年7月4日 23:47

回答

すべての返信

  • C++/CLIなら、通常のC++のコードも書けます。interface classを定義する必要もなく、

    #include <Windows.h>

    をして、普通にCoCreateInstance()を呼べばいいでしょう。

    • 回答としてマーク 山本春海 2011年8月1日 8:16
    2011年7月5日 0:31
  • なお、マネージ上で、マネージオブジェクトを、COM オブジェクトとして作成することはできなかったはずです。
    • 回答としてマーク 山本春海 2011年8月1日 8:16
    2011年7月5日 1:36
  • >戻り値を見ると マイナスの値が返ってきて(要は失敗)しまいます。
    Error Codeを記述してください。
    また、環境も記述してください。

     

    そもそもCLSID_FilterMapper2はIAMovieSetupをSupportしていません。
    また、COM InteropではCoCreateInstanceを呼ばなくてよいです。

    COM Interopについては、以下を参考にしてください。
    C#で記述されていますので、C++/CLIに置き換えてください。
    或いは、C++ Interopを利用してください。

    [COM 相互運用性 - 第 1 部 : C# クライアント チュートリアル]
      http://msdn.microsoft.com/ja-jp/library/aa288455(VS.71).aspx

    ところで、IAMovieSetupはFilter実装側のInterfaceで、しかもdeprecatedですが、何をしたいのでしょうか?
    また、Vista以降Direct ShowはMedia Foundationに置き換わりつつあります。

    • 回答としてマーク 山本春海 2011年8月1日 8:16
    • 回答としてマークされていない Brahaman 2011年9月6日 18:59
    2011年7月5日 9:40