none
如何再度使用已經Remove的COM(ActiveX)控制項? RRS feed

  • 問題

  • 抱歉請問一下
     
    由於某些原因,有時需要移除COM(ActiveX)控制項,如下
    this.Controls.Remove(axtemp1);
    axtemp1.Dispose();
     
    之後要再加入,用
    AxtempLib.axtemp axtemp1 = new AxtempLib.axtemp();
    axtemp1.Location=new Point(123,45);
    this.Controls.Add(axtemp1);
     
    然後續呼叫axtemp1裡的方法時
    會出現COM object that has been separated from its underlying RCW cannot be used的錯誤訊息
    查了一下,似乎是因為ComObject被銷毀?
     
    那請問在這種狀況下,該如何正確的新增(ActiveX)控制項?
    (但裡面的金鑰我不知道該輸入什麼,用他上面的金鑰試,似乎會讓UI無回應 )
     
    由於對於這個懂得不多,還請大家幫忙解惑
    感謝~


    2011年5月23日 下午 09:06

所有回覆

  • 1. 開個測試專案

    2. 將 Axtemp1 拖拉到 Form1 畫面上。

    3. 關閉測試專案

    4. 打開記事本。

    5. 用記事本開啟 Form1.designer.cs。

    6. 找出 Axtemp1 建立敘述並拿來用。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年5月24日 下午 02:41
  • 建議移除ActiveX控制項的時候, 只從Controls集合中移除就好, 不要呼叫Dispose方法, 需要時再加回來使用即可
    2011年5月24日 下午 02:59
  • 感謝兩位

    關於tihs說的不要呼叫Dispose方法,經過測試後一樣會出現問題

    而且會造成程式錯亂的感覺

     

    至於套用designer.cs的範例

    我試了之後會有兩種現象 (不同code導致,但我抓不到邏輯)

    1.在this.Controls.Add(this.axtemp1)時造成UI無回應

    2.呼叫axtemp1的方法時產生Exception of type 'System.Windows.Forms.AxHost+InvalidActiveXStateException' was thrown.的錯誤

    網路上我能找到的類似解決方法卻也都不能套用在這個例子中

    只知道可能是OcxState的因素!?  (這是猜測..)

     

    真是頭痛..




    2011年5月24日 下午 04:50
  • 我有一個 COM 的非技術問題。

    就是你們的公司引用 COM 時, 有沒有考慮版權問題?

    或者這樣問, 引用 COM 在一個程式上, 是否版權合法? 你們的公司的做法是怎樣的呢?

    2011年5月24日 下午 05:29
  • 我有一個 COM 的非技術問題。

    就是你們的公司引用 COM 時, 有沒有考慮版權問題?

    或者這樣問, 引用 COM 在一個程式上, 是否版權合法? 你們的公司的做法是怎樣的呢?

    在我的Case中,應該是沒有牽扯到版權問題

    1.該OCX是某公司開放給用戶下載回去使用的,甚至還有幾種常用語言的範例檔案供參考

    2.我不是公司,軟體寫出來也純粹自用

     

    不過以往確實沒想過這個問題,正確與否也不知道

    可能要請其他高手代答了..

    2011年5月25日 上午 07:57
  • 什麼是程式錯亂的感覺?
    2011年5月25日 上午 10:07
  • 錯亂的感覺...老實講我不太會形容

    舉個我有印象的例子

    Remove後,會執行倒數計時(如15秒)的迴圈,並顯示於UI上(每秒/次)

    但若未呼叫Dispose方法,有幾次發現秒數的遞減是跳躍式的,如12--停頓一下子--5

    可是倒數期間理論上不會有其他原因造成UI凍結

    而且只在拿掉Dispose才發生..



    2011年5月25日 下午 02:31
  • 這個現象應該和Dispose與否沒有關係才對
    2011年5月26日 上午 12:00
  • 在我的Case中,應該是沒有牽扯到版權問題

    1.該OCX是某公司開放給用戶下載回去使用的,甚至還有幾種常用語言的範例檔案供參考


    開放給用戶下載並不等於可免費應用在商業上, 例如壓縮資料庫的 Msjro.dll, 很多人會用, 但你的軟件是收費的, 但引用別人的 dll / ocx, 可能有問題。
    2011年5月26日 下午 12:34
  • 感謝告知,不過由於程式寫出來是純粹自用

    無任何商業行為

    (收費? 小弟的ID與某人很像??? )

    2011年5月26日 下午 02:24
  • 報告一下總結,現在將程式改為執行後才(套用designer.cs的範例)動態加載COM(ActiveX)控制項

    第一次也能順利的使用

     

    但由於某些狀況下該控制項會產生UI凍結現象(這也就是要Remove的原因)

    所以上面提及未呼叫Dispose方法造成的UI凍結,其實是此控制項導致的 (在此跟tihs說聲抱歉,前兩天誤判因果)

     

    但是問題還是卡在Remove後..

    若用相同的方法加載控制項,調用其方法時

    會出現Exception of type 'System.Windows.Forms.AxHost+InvalidActiveXStateException' was thrown.的錯誤

    而且,第二次加載控制項時

    若沒有先加上this.axtemp1.Visible = false; ,也會在執行Controls.Add指令時造成UI無回應

     

    且,由於該控制項加載後,會自動產生log檔,並且維持在使用中(所以無法刪除)

    Remove+Dispose後,該log就能刪除了

    小弟比較不能理解的是,既然該控制項似乎已經被完全卸載

    為什麼不能再重新加載?? (如同程式第一次加載時)

    好比用水龍頭接了一杯水,洗毛筆弄髒後,便將水到掉,再接一杯乾淨的水來用...

     

     困惑中..Orz



    2011年5月27日 上午 06:56