none
VB2005 UserControl中使用WebBrowser與存取Client電腦資料的問題 RRS feed

  • 問題

  •  

    各位好,

    小弟最近以VS2005, 開發VB2005的UserControl,

    打算完成後編譯DLL, 以Object嵌入網頁中.

    目前來說都很順利, 但是遇到了兩個問題.

     

    就是當我在UserControl中嵌入一個WebBrowser後,

    build出來的DLL無法被load, 也就是出現一個小方塊.

    但是把WebBrowser元件拿掉後, 又可以正常load.

    請問這個問題該如何解決?

     

    又, 我在此UserControl中, 會存取到瀏覽此網頁的電腦drive資料,

    會出現.net framework的設定不允許的錯誤

    我找到的solution有個是去修改.net framework的設定,

    請問除此之外, 有更好的方法嗎?

     

    感謝各位的解答

    mezi

    2007年8月8日 上午 07:28

解答

  •  

    經過這幾天的嘗試,

    確定應該是微軟對IE中使用WebBrowser的安全性設定

     

    在我的UserControl被嵌入網頁時, 就會將Webbrowser Dispose掉了

    如果單純在IE中嵌入WebBrowser這個元件

    使用Script去控制它, 一樣是出現沒有權限.

     

    我是有試過新增一個windows form,

    然後將WebBrowser放在那個windows form上面

    透過UserControl去控制該windows form上的WebBrowser

    不幸的是.. 測試容器跑是OK

    但是放上Server一樣掛掉, 會跑出not support的Exception. OTZ

     

    不知道有沒有其他變通的方法(除了做成Windows AP XD),

    可以做到類WebBrowser做瀏覽的功能

    2007年8月29日 上午 09:10

所有回覆

  •  

    其實應該說是
    我開了一個windows control library專案,
    裡面就會產生一個usercontrol
    我在這個usercontrol上加上webbrowser元件後
    build成DLL檔
    然後將這DLL檔嵌進網頁中

    網頁會load這個DLL失敗
    但是當我將WebBrowser這元件移除後再bulid成DLL檔
    此時就可以使用了

     

    所以我想請問在windows control library中使用WebBrowser此元件

    是不是要特別設定某些東西,

    感謝.

    2007年8月28日 上午 02:50
  • 不確定,沒特別鑽研這方面,提供一點資訊,看看是否有幫助。

     

    先前的經驗:

    1. 在 Script 可以直接創建 WebBrowser Control ,但是在 2005/7 IE 安全性更新中,基於風險考量,在 Script 中建立 WebControl 將會導致出現上方的安全警告條,若設定為信任的網站,則可直接執行,但目前在 Vista 中測試無效,WinXP/2003 + IE7 仍可直接執行。

     

    2. WebBrowser Control 是伴隨 IE 更新的 COM 元件,且須型態程式庫,故當你在 client 用時,認 IE 版本,亦即你的開發環境 IE 版本應低於使用者的 IE 版本,且你的 DLL 檔散佈時,應確認型態程式庫有一同散布(註:由於 IE 屬於系統的一部份,實際上可省略,這部份有點混亂),而 .Net 要給 IE 用的 ActiveX DLL 是要選擇 COM 相容的 DLL ,又有另外一個型態程式庫。

     

    3. 由於 Script 安全控管的因素,一般非顯示的環境,通常叫用 xmlhttp 物件 (AJAX 的基礎) ,.Net 在 ActiveX DLL 被限定僅能使用物件庫,所以通常可以使用 xmlhttp 取代。

     

    4. 通常在 .Net 會使用 .Net 的方法,例如說 WebClient / httpResquest 等,非必要不使用 COM 減少散布困擾。

     

    你真正的使用方式沒有描述的很清楚,以上四個要點僅供參考。

    2007年8月28日 上午 03:04
    版主
  • 首先感謝您抽空回答 Smile

     

    我這個案子主要是想利用VB, 去控制WebBrowser去瀏覽的網頁,

    例如我按Button A, 就會去瀏覽google, 然後按B, 可以執行某Script等

    以上部份, 我用VS2005的使用者控制項測試容器去使用都沒問題

     

    但是當我將DLL放上Server, 卻無法正常load,

    有趣的是我將WebBrowser移除後, 重新build放上Server, 便可正常load.

    (Server的IIS有灌.net framework 2.0, 我client為IE7)

     

    我也是想過是否為安全性的問題, 例如簽署方面, 但是這邊還在試, 所以還沒個定論

    也請您在這邊給個參考,

    十分感謝.

     

    2007年8月28日 上午 03:19
  • 剛剛試了一下, 發現是我自己搞笑,

    因為我把server加入信任網站, 但是存取層級並非是"完全存取"

    所以此未簽署的DLL一直無法load, 修正後便可以了.

     

    但是卻衍伸另一個問題, WebBrowser在此DLL載入後

    會被自動移除, click控制該WebBrower元件的button

    會出現該元件已被Dispose...

    問題是我根本沒Dispose它啊...

    2007年8月28日 上午 09:02
  •  

    經過這幾天的嘗試,

    確定應該是微軟對IE中使用WebBrowser的安全性設定

     

    在我的UserControl被嵌入網頁時, 就會將Webbrowser Dispose掉了

    如果單純在IE中嵌入WebBrowser這個元件

    使用Script去控制它, 一樣是出現沒有權限.

     

    我是有試過新增一個windows form,

    然後將WebBrowser放在那個windows form上面

    透過UserControl去控制該windows form上的WebBrowser

    不幸的是.. 測試容器跑是OK

    但是放上Server一樣掛掉, 會跑出not support的Exception. OTZ

     

    不知道有沒有其他變通的方法(除了做成Windows AP XD),

    可以做到類WebBrowser做瀏覽的功能

    2007年8月29日 上午 09:10
  • 希望你可以看得到這個訊息
    如果你要把userControl放在Webbrowser上 run 請在你的usercontrol 程式中加入幾行code

    Private DocVal As mshtml.IHTMLDocument2 = New mshtml.HTMLDocument
        Public Property Doc() As mshtml.HTMLDocument
            Get
                Return DocVal
            End Get
            Set(ByVal Value As mshtml.HTMLDocument)
                DocVal = Value
            End Set
        End Property

    然後.... 在你的HTML 加入
    <script>
    function loadDoc()
    {
     //passing the document as a parameter to our UserControl
     autoIE2.doc = document;
    }
    </script>


    <BODY onload=loadDoc() topmargin="0"   leftmargin="0">  <- 網頁開始載入
    <OBJECT id=autoIE2 classid="http:MyuserControl.dll#NameSpace.name">   <- 編譯完的DLL檔 # 你的命名空間
    </OBJECT>


    這樣應該就可以run 了,不過如果你要連結後端資料庫,可能要還再做其他設定,有興趣再討論.......

    ps. 這樣做不是好方法,因為程式在intranet頻寬大時還很OK ,若由InterNet 連VPN 來 RUN 可能你會等到吐血.....
    2009年3月24日 上午 05:34