none
如何將 CComPtr 轉換到C#中 RRS feed

  • 問題

  • 從網路上找到用DirectShow 可以開雙攝影機的程式碼
    開發平台是用C++

    小弟就自行想辦法編譯成了DLL檔
    想要轉移給 C# 使用
    於是又學習寫 C# 的 Wrapper

    轉換函式的地方在陷入好幾天的GOOGLE查詢循環中後都獲得了解決
    但是 typedef struct 裡面 還有 CComPtr<> 的東西存在
    很直接的轉換成了 IntPtr 試試看
    Compiler會過
    但是當需要開結構所製造出的變數時就會慘成 assert畫面
    出現的訊息是 p!=0
    C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\atlcomcli.h

    我想問的是我要如何將 C++ 中的 CComPtr 轉換成 C# 可以用的類別物件

    ==================================================================
    原始碼(C++)

    DLL中的 typedef
     typedef struct TagMember
     {
      IplImage * m_pFrame;
      bool m_bConnected;
      int m_nWidth;
      int m_nHeight;
      bool m_bLock;
      bool m_bChanged;
      long m_nBufferSize;

      CComPtr<IGraphBuilder> m_pGraph;
      CComPtr<IBaseFilter> m_pDeviceFilter;
      CComPtr<IMediaControl> m_pMediaControl;
      CComPtr<IBaseFilter> m_pSampleGrabberFilter;
      CComPtr<ISampleGrabber> m_pSampleGrabber;
      CComPtr<IPin> m_pGrabberInput;
      CComPtr<IPin> m_pGrabberOutput;
      CComPtr<IPin> m_pCameraOutput;
      CComPtr<IMediaEvent> m_pMediaEvent;
      CComPtr<IBaseFilter> m_pNullFilter;
      CComPtr<IPin> m_pNullInputPin;
     };


    ////////////////////////////////////////////
    mainProject (C#)

        public static class ActionFunction
        {
            [DllImport("TEST2.dll", EntryPoint = "#6")]
            public static extern void CloseCamera(TagMember in_Member);

            [DllImport("TEST2.dll", EntryPoint = "#7")]
            public static extern bool OpenCamera(TagMember in_Member, int nCamID, bool bDisplayProperties);

            [DllImport("TEST2.dll", EntryPoint = "#8")]
            public static extern MIplImage QueryFrame(TagMember in_Member);

        }

        public struct TagMember
        {
            public IntPtr m_pFrame;
            public bool m_bConnected;
            public int m_nWidth;
            public int m_nHeight;
            public bool m_bLock;
            public bool m_bChanged;
            public long m_nBufferSize;
            
            public IntPtr m_pGraph;
            public IntPtr m_pDeviceFilter;
            public IntPtr m_pMediaControl;
            public IntPtr m_pSampleGrabberFilter;
            public IntPtr m_pSampleGrabber;
            public IntPtr m_pGrabberInput;
            public IntPtr m_pGrabberOutput;
            public IntPtr m_pCameraOutput;
            public IntPtr m_pMediaEvent;
            public IntPtr m_pNullFilter;
            public IntPtr m_pNullInputPin;
        }

    2009年9月12日 下午 04:49

解答

所有回覆