- - PR -
サービスでOCXを使用したい
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-08-17 11:58
WinサービスにおいてOCXを使用したいため、OCXを貼り付けたフォームをnewしようとしていますが、
「現在のスレッドはシングル スレッド アパートメントでないため、ActiveX コントロールをインスタンス化できませんでした。」 とのエラーメッセージが出てしまいます。 マイクロソフトのサイト http://support.microsoft.com/default.aspx?scid=kb;ja;841295 にて回避方法が記載されていたので MTA→STAを試したのですが、同じエラーが出てしまいます。 (他の回避方法は該当なしでしたので行ってません) サービスだとこの回避方法は無効なのでしょうか? そもそもできないのでしょうか? 有識者の方ご教授ください。 VisualStudio .NET2003 WinXP OCXはベンダから提供された録音モジュールです。 | ||||
|
投稿日時: 2006-08-17 12:46
具体的に、どの回避方法をとってみたのでしょう? Windows サービスは、非常に簡単に言えばシステムスレッドからコールバックされるような形で動作するのをご存知ですか? サービス起動時にはシステムスレッドは既に起動済みで、その属性を後から(=サービスから)変更するのは不可能です。 記載が無いので From をどのタイミングで new しようとしたのか分かりませんが、サービス起動時等に、そのままのコンテキストで件の OCX を載せた Form を new しようとしたのなら、おそらくは失敗すると思います。 サービス起動時などの適当なタイミングで STA 属性を付加した新たなスレッドを作成し、そのスレッドのコンテキストで件の OCX を載せた Form を new すればうまくいきそうに思います。 | ||||
|
投稿日時: 2006-08-17 14:06
渋木宏明様
待ちに待ったご返答、誠にありがとうございます。 >具体的に、どの回避方法をとってみたのでしょう? 分かりづらい書き方で申し訳ありませんでした。 「ホスト アプリケーションのメイン スレッドが MTA で実行されることを示すために、 MTAThread 属性を使用する場合、代わりに STAThread 属性を使用する」 です。 >Windows サービスは、非常に簡単に言えばシステムスレッドからコールバックされるような形で動作するのをご存知ですか? 存じておりませんでした。(まだまだ初心者ですね・・・) >記載が無いので From をどのタイミングで new しようとしたのか分かりませんが サービスを起動したときに呼ばれるOnStartメソッドにてnewしてました。 →これではダメなのですね。。 ご教授いただいた方法を試してみます。 P.S.コンテキストとおっしゃっているのはスレッドと同義という認識で良いでしょうか?間違っていたらご指摘ください。 | ||||
|
投稿日時: 2006-08-17 19:49
以前、IIS(ASP.NET) で似たようなことで悩んだ記憶があります。(なんでこんなしょうもないことで悩まないといけないのかと、Microsoft を責めたくなったような気がします。パフォーマンスとかはどうでもいいから要は昔風のライブラリーを簡単に呼び出したいだけなのに、と。)
「サービス」のアプリケーションとどこまで類似性があるかは分からないのですが、IIS の時は、一回、間に VB で作った ActiveX EXE を挟み込むと、まがりなりにも動いたような気がします。 すなわち、まず、目的とする OCX を貼ったフォームをロードして動かすような ActiveX EXE を作ります。そしてその ActiveX EXE を サービスから呼び出します(なんで ActiveX EXE にしたのかも良く覚えていません。ActiveX DLL だとダメだったのかな?)。 要は、とにかくラッパー(wrapper)を作って経由する、ということです。 ほんとうにこれで動くか分かりませんし、ややこしすぎてあまりお勧めもしませんが、もしもどうしても、という時にはやってみてください。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} |
1