所以我有這個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?
應該工作。 hWnd不是int,不要試圖在64位操作系統上運行。沒有你的幫助,本地代碼有很多方法可以用AV炸彈。 –
你知道嗎?那可能就是這樣;我在Win7 64位開發,互操作需要一個int,我不能直接傳遞IntPtr Control.Handle。 – KeithS