MTAモードでスタックのVisual C ++ GUIアプリ
質問
私はいくつかの奇妙な挙動を示すC ++ GUIプロジェクトを持っています。私のマシンでは、コードをコンパイルし、うまく動作します。しかし、別のマシン上で、コードはコンパイル何とかMTAで実行してしまいます。明らかに、MTAであることはGUI用のランタイムあらゆる種類の問題を引き起こします。ここに私のメインです。
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
Application::Run(gcnew Form1());
return 0;
}
私はアパートの状態を確認するために、メインの最初の行にブレークポイントを置くことができ、かつ期待通りに正しく実行/ビルドマシン上で、それは、「STA」となります。しかし、問題のマシン上で、それは「MTA」となります。私も影響を与えることなく、STAアパートモードを切り替えてみてくださいすることができます。
私は、デバッグ/リリースのdirsを削除し、すべて無駄に、付属のデバッガなしで実行する、コンパイルする前にプロジェクトを掃除しようとしました。私はマシンがない仕事をしているに任意のパターンを決定することはできません。私が働いてマシン上でexeファイルをコンパイルして、問題のマシンにそれを上に持っている場合、それが正しく実行されますので、私は、これは何とかビルド環境の問題であると思います。関係するすべてのマシンは、Visual Studio 2008の標準を使用してWindows XPを実行しています。任意のアイデア?
解決
それを考え出しました。私たちのプロジェクトでは、OpenCVのからDLLへの呼び出しを作っていた、そしてそのDLLは、複数のスレッド用にコンパイルされていました。 Visual Studioは、このことに気づいと同様に、複数のスレッドのためにコンパイルするアプリを余儀なくされました。マシンから別のマシンに問題の凹凸を担当するDLLのバージョンをされた異なります。
他のヒント
私はOpenCVの1.1と同様のバグを修正行われ、マネージコードしまいました。何らかの理由で、OpenCVのライブラリが(おそらくOpenCVのDShowインターフェイスでCOMオブジェクト)MTAにアプリケーションを強制するようです。とにかく私はこの解決策を見つけました: http://www.gamedev.net/community/フォーラム/ MOD /雑誌/ journal.asp?ユーザーID = 62708 の
あなたのメインアプリケーションでCOMを再初期化する場合は、それはすべてを修正する必要があります。あなたはCoUninitializeの()を使用することOLE32.libにリンクする必要があります。私は、次のコードを使用します:
int main(array<System::String ^> ^args)
{
System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
if (Thread::CurrentThread->GetApartmentState() != ApartmentState::STA)
{
CoUninitialize();
CoInitialize(NULL);
}
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
// Create the main window and run it
Application::Run(gcnew Form1());
return 0;
}