none
在Service上使用Active X RRS feed

  • 問題

  • Dear All:

          小弟最近用VS2003,語言是C#,開發一個系統,用到了一個關於影象的OCX。過程當中發現光是實體化這個ActiveX, 是沒辦法運作的。聽前輩們說必需有個容器裝載這個ActiveX才能運作, 所以小弟新增了一個Windows 應用程式的專案, 將這個ocx貼在一個表單上就能運作了。

    但因開發的系統是Service的關係, 將這個含有OCX的表單加入到一個Windows 服務的專案,Service的執行帳號是LocalSystem。在On_Start中實體化這個表單,

    protected override void OnStart(string[] args)
    {
       // TODO: 在此加入啟動服務的程式碼。
       try
       {
            this.fmCtrl = new FormControler();
       }
       catch(Exception e)
       {
            throw e;
       }
    }

    卻發生了錯誤:錯誤如下:

    無法產生 ActiveX 控制項 ,因為目前的執行緒不是在單一執行緒 Apartment

    因小不懂Service 和 Active X的執行緒如何運作, 想請教各位大哥為何一個含有

    OCX的表單可以在Windows 應用程式中運作,而無法在Windows 服務中運作。

    謝謝

     

    2006年10月18日 上午 01:14

所有回覆

  • 請檢查一下您的 Main() 函式,確定有加上 [STAThread] attribute,像這樣:

    [STAThread]
    static void Main()
    {
      Application.Run(new Form1());
    }

    2006年10月18日 上午 01:51
  • 小弟有試著在main前加入[STAThread],但仍然會發生這樣的錯誤

    之後想到獨立產生一個Thread,再用這個Thread產生表單,就可以

    運作了, 但是Active X本身會引發的事件卻無法Fire, 不知是否

    是因為Thread的關係與否所造成的。

    2006年10月20日 上午 07:32
  • 你好,
    我遇到跟你幾乎一模一樣的問題,請問你後來是如何解決的?
    如何另外獨立產生一個Thread??

    thanks
    Joe
    2009年3月19日 上午 07:19
  • HI,

    您可以利用以下的做法試看看:
    ThreadStart ts = new ThreadStart(test); 
    Thread t = new Thread(ts); 
    t.ApartmentState = 
    System.Threading.ApartmentState.STA; 
    t.Start(); 
     
    ... 
     
    Public void test() 
    MyActiveXControl c = new MyActiveXControl() 
    //do stuff. . . 

    • 已提議為解答 Joe chiu 2009年3月20日 上午 01:47
    2009年3月19日 上午 09:54
  • 感謝!!
    問題已解決.
    2009年3月20日 上午 01:48
  • 我也有遇到事件無法 Fire 的問題,不過是在 console 上面,不確定在 Service 下是否能這樣做。

    我的作法是把 ActiveX 包在 Form 裡面,然後在 STA Thread 後面加上 Application.Run();

    var t = new Thread(CreateActiveX);
    t.SetApartmentState(AparmentState.STA);
    t.Start();
    
    private void CreateActiveX()
    {
        var form = new MyActiveXForm();
        Application.Run();
    }
    • 已編輯 騙人布 2018年6月7日 上午 02:35
    2018年6月7日 上午 02:35