2011-09-01 65 views
1

所以我有這個SDK由第三方提供,用於查看來自遠程源流式視頻。遠程源運行由捕獲和存儲視頻的第三方提供的服務器,並且我可以連接到該服務器並通過SDK獲取視頻。我通過COM引用SDK,並且像連接到服務器,選擇視頻源等基本的非圖形操作都工作得很好。給託管控制句柄非託管代碼 - 訪問衝突

問題是,使用此SDK實際向用戶顯示視頻的主要(唯一)方法是將hWnd(作爲int)傳遞到方法,然後將該視頻異步地繪製到該客戶端區域窗口。據我所知,這裏的「窗口」具有GUI窗口的含義,在.NET中,窗口將是帶窗口句柄的任何WinForms控件。就我而言,我正在使用PictureBox控件(用戶希望看到的每個Feed都有一個控件)。

問題是,我顯然不能將託管的PictureBox控件的句柄放到這個SDK方法中,因爲當我這樣做時,我從非託管線程接收到一個AccessViolationException。我正在使用VB 6編寫的一個示例程序(它在我的計算機上對測試服務器工作),它使用VB PictureBox執行相同的操作,而且工作得很好,但顯然無論SDK試圖做什麼我們不錯的安全.NET沙箱對象不會與CLR一起飛行。

幫助?我希望我可以提供更多信息或代碼示例,但我無法提供足夠的消毒功能,以至於無法在一般情況下使用,而且我也無法透露正在使用的SDK。我認爲我需要的僅僅是告訴.NET,我的引用代碼應該被信任,以便在窗口上做它想做的事情,或者以某種方式將窗口移動到我的程序的舒適沙箱之外的管理較少的內存空間。

編輯:好的,取得了一些進展。我現在正在驗證該控件的句柄是否在使用方法的句柄之前使用IsHandleCreated創建的。但是,正如Hans Passant所說,IntPtr不是一個整數。那麼,我該如何將這個方形釘放入圓孔?我已經嘗試了ToInt32()函數和顯式轉換爲(int)。即使編譯我的庫爲32位體系結構,也不行。我是否會回到第三方,並說他們的SDK是不讓我傳遞指針的POS?

+1

應該工作。 hWnd不是int,不要試圖在64位操作系統上運行。沒有你的幫助,本地代碼有很多方法可以用AV炸彈。 –

+0

你知道嗎?那可能就是這樣;我在Win7 64位開發,互操作需要一個int,我不能直接傳遞IntPtr Control.Handle。 – KeithS

回答

5

這應該很好。對於Windows窗體控件,一個Control.Handle只是Windows API的一個標準HWND。許多DirectX示例使用這種精確的技術。

這就是說,確保在創建控件之後才能將其傳遞到本機代碼中。例如,如果您在窗體的構造函數中(加載之前)傳遞句柄,則該句柄在該點處將無效。

+0

謝謝。包含相關PictureBox的整個UserControl將嘗試在其Load事件中設置最初的一組視頻源。這太快了嗎? – KeithS

+0

這是問題;該控件的IsHandleCreated屬性爲false,因此我不能依賴此時的句柄值。我添加了一個將跳過此電話的支票,但現在視頻永遠不會顯示,因爲顯然沒有處理。更多幫助? – KeithS

+0

@KeithS:請參閱:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.handlecreated.aspx它可能會有所幫助:) –