以下のようなエラーが出た。
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)
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]」に変更すれば問題なく動くようになる。
なんか、今までまったく目を触れてなくて、言われれば「そんなところあったねー」程度でしか考えてなかったけど、
こういう形でつまずくとは・・・。
詳しい意味については、後から調べてみようと思う。
ありがとうございます!!
何日も悩んでいましたが解決しました。
本当に助かりました。
がっちぇ - 2020-04-24 17:12:22