1

奇妙な動作を示す 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 に切り替えても効果はありません。

デバッグ/リリースディレクトリを削除して、コンパイルする前にプロジェクトをクリーンアップしようとしましたが、デバッガーを接続せずに実行しましたが、すべて役に立ちませんでした。どのマシンが動作し、どのマシンが動作しないかのパターンを特定できません。実行中のマシンで exe をコンパイルし、問題のあるマシンに実行すると、正しく実行されるため、ビルド環境の問題であると思われます。関連するすべてのマシンは、Visual Studio 2008 標準で Windows XP を実行しています。何か案は?

4

2 に答える 2

1

理解した。私たちのプロジェクトはopenCVからdllを呼び出していましたが、そのdllは複数のスレッド用にコンパイルされていました。Visual Studio はこれに気付き、複数のスレッドに対してもアプリを強制的にコンパイルしました。マシンごとに dll のバージョンが異なることが、問題の不規則性の原因でした。

于 2009-02-05T21:43:00.057 に答える
0

OpenCV 1.1 とマネージ コードで同様のバグを修正しました。何らかの理由で、OpenCV ライブラリがアプリケーションを MTA (おそらく OpenCV DShow インターフェイスの COM オブジェクト) に強制するようです。とにかく、私はこの解決策を見つけました: http://www.gamedev.net/community/forums/mod/journal/journal.asp?userid=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;
}
于 2009-10-01T20:01:43.000 に答える