none
VB 使用 C++ 寫的 ocx RRS feed

  • 問題

  • 各位先進好:

    協力廠商提供了一個 ocx 檔,且附上 c++ Sample Code ,但是因為對 c++ 不熟,所以想用 VB.NET 來使用這個 ocx

    c++ 的 Sample Code 中有一個函數,在 .h 檔的定義如下
    long CAxDvrSdk::Init(long* pOwner, long nMaxCh, long* pCallBackFunc)
    {
    	long result;
    	static BYTE parms[] =
    		VTS_PI4 VTS_I4 VTS_PI4;
    	InvokeHelper(0x2, DISPATCH_METHOD, VT_I4, (void*)&result, parms,
    		pOwner, nMaxCh, pCallBackFunc);
    	return result;
    }
    而在 .cpp 檔案中這樣使用
    m_Dvr.Init( (long*)this, 16, (long*)CallBackFunc);	
    我的 VB.NET 用以下方式使用這個 ocx (已將 ocx 加入參考)
    Public Class Form1
    
        Public Delegate Function CallBack(ByVal hwnd As Integer, ByVal lParam As Integer) As Integer
        Declare Function EnumWindows Lib "user32" (ByVal x As CallBack, ByVal y As Integer) As Integer
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim myDVR As New AXDVRSDKLib.AxDvrSdk
    
            Try
                myDVR.Init(Me.Handle, 16, EnumWindows(AddressOf CallBackFunc, 0))
            Catch ex As Exception
                ' 總是會丟出 Exception
            End Try
    
        End Sub
    
        Public Shared Function CallBackFunc(ByVal hwnd As Integer, ByVal lParam As Integer) As Integer
            Return 1    ' 測試用
        End Function
    
    End Class
    每次只要一執行
    myDVR.Init(Me.Handle, 16, EnumWindows(AddressOf CallBackFunc, 0))
    就會出錯
    出現「災難性的失敗 (發生例外狀況於 HRESULT: 0x8000FFFF (E_UNEXPECTED))」錯誤訊息

    不知道是否是 VB.NET 不能呼叫這個 OCX ,還是我的程式寫錯了

    謝謝
    2010年3月15日 下午 04:40

解答

  • .Net 可以呼叫 OCX ,.Net 會自動對 COM 物件做封裝遞送,但你的問題在於 COM 物件要回呼 .Net 函數,但是 COM 物件並不認識 .Net 介面。

    所以直接問元件廠商最快。


    T.L. Cheng
    • 已標示為解答 saintchou 2010年3月27日 下午 02:01
    2010年3月27日 上午 02:44
    版主
  • 原來是 COM 物件並不認識 .Net 介面
    這樣我大概了解原因了

    請問 要讓 COM 物件認識 .Net 介面 網路上有沒有這類的文章 或是 方向 可以讓我參考

    謝謝您!


    你這樣問之前, 有試著用搜尋引擎找找看嗎 ?

    http://www.dotblogs.com.tw/rolence0515/archive/2010/03/19/14118.aspx


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    • 已標示為解答 saintchou 2010年3月27日 下午 02:01
    2010年3月27日 下午 01:49
    版主

所有回覆

  • .Net 可以呼叫 OCX ,.Net 會自動對 COM 物件做封裝遞送,但你的問題在於 COM 物件要回呼 .Net 函數,但是 COM 物件並不認識 .Net 介面。

    所以直接問元件廠商最快。


    T.L. Cheng
    • 已標示為解答 saintchou 2010年3月27日 下午 02:01
    2010年3月27日 上午 02:44
    版主
  • 原來是 COM 物件並不認識 .Net 介面
    這樣我大概了解原因了

    請問 要讓 COM 物件認識 .Net 介面 網路上有沒有這類的文章 或是 方向 可以讓我參考

    謝謝您!

    2010年3月27日 上午 05:35
  • 原來是 COM 物件並不認識 .Net 介面
    這樣我大概了解原因了

    請問 要讓 COM 物件認識 .Net 介面 網路上有沒有這類的文章 或是 方向 可以讓我參考

    謝謝您!


    你這樣問之前, 有試著用搜尋引擎找找看嗎 ?

    http://www.dotblogs.com.tw/rolence0515/archive/2010/03/19/14118.aspx


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    • 已標示為解答 saintchou 2010年3月27日 下午 02:01
    2010年3月27日 下午 01:49
    版主
  • 感謝您提供的文章
    我大致清楚COM的運作了

    不好意思
    我有上網找過
    只是有時對於不清楚的東西
    連關鍵字要打什麼都不知道
    常常找了一堆不相關的東西

    再次謝謝您提供的這篇
    說明的非常清楚

    謝謝~

    2010年3月27日 下午 02:01