C# + DirectShow.NETで困ったエラー

以下のようなエラーが出た。


System.InvalidCastException: 型 'DirectShowLib.SampleGrabber' の COM オブジェクトをインターフェイス型 'DirectShowLib.ISampleGrabber' にキャストできません。IID '{6B652FFF-11FE-4FCE-92AD-0266B5D7C78F}' が指定されたインターフェイスの COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、この操作に失敗しました: インターフェイスがサポートされていません (HRESULT からの例外: 0x80004002 (E_NOINTERFACE))。

場所 DirectShowLib.ISampleGrabber.SetCallback(ISampleGrabberCB pCallback, Int32 WhichMethodToCallback)

場所 hmdautotranslate.Capture.OnCaptureDone() 場所 D:DevelopmenthmdautotranslatehmdautotranslatehmdautotranslateCapture.cs:行 166

SampleGrabberからキャプチャするためにコールバック関数が呼び出されて、その中でSampleGrabberを参照すると上のようなエラーが出た。
おそらく、マルチスレッド周りが原因だろうなぁ、と思ったら、かなり予想外なところに原因があった。
C#でフォーム用のプロジェクトを作成すると、Main関数が以下のように生成される。

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace hmd_autotranslate
{
static class Program
{
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}

この中の、「[STAThread]」を「[MTAThread]」に変更すれば問題なく動くようになる。

なんか、今までまったく目を触れてなくて、言われれば「そんなところあったねー」程度でしか考えてなかったけど、
こういう形でつまずくとは・・・。
詳しい意味については、後から調べてみようと思う。

Posted at : 2009-03-04 20:12:13 / Category : none

Comments

ありがとうございます!!
何日も悩んでいましたが解決しました。
本当に助かりました。

がっちぇ - 2020-04-24 17:12:22

Send comment


Name


Mail-address (empty is OK. If you want to notify update, please fill mail-address.)


Bot check code (240329 と入力してください / Please input 240329.)