Visual C ++ GUI应用程序陷入MTA模式

时间:2009-01-29 22:18:22

标签: .net c++-cli sta mta

我有一个C ++ gui项目表现出一些奇怪的行为。在我的机器上,代码编译并运行得很好。但是,在另一台机器上,代码编译但最终以某种方式在MTA中运行。显然,在MTA中导致GUI的各种运行时问题。这是我的主要内容:

        [STAThreadAttribute]
        int main(array<System::String ^> ^args)
        {
            Application::EnableVisualStyles();
            Application::SetCompatibleTextRenderingDefault(false); 
            Application::Run(gcnew Form1());
            return 0;
        }

我可以在main的第一行放置一个断点来检查单元状态,在正确构建/执行的机器上,它将是“STA”,如预期的那样。但是,在有问题的机器上,它将是“MTA”。我甚至可以尝试将公寓模式切换到STA,没有效果。

我已经尝试删除调试/发布目录并在编译之前清理项目,在没有附加调试器的情况下运行,但都无济于事。我无法确定机器工作的哪种模式,哪种模式不工作。如果我在一台工作机器上编译exe并将它带到有问题的机器上,它将正确执行,所以我怀疑这是一个构建环境问题。所有涉及的机器都运行带有visual studio 2008标准的Windows XP。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

想出来。我们的项目是从openCV调用dll,并且已经为多个线程编译了dll。 Visual Studio注意到这一点,并强迫应用程序编译多个线程。从一台机器到另一台机器的不同版本的dll导致了问题的不规则性。

答案 1 :(得分:0)

我刚刚完成了修复OpenCV 1.1和托管代码的类似错误。出于某种原因,似乎OpenCV库强制应用程序进入MTA(可能是OpenCV DShow接口中的COM对象)。无论如何我发现了这个解决方案 http://www.gamedev.net/community/forums/mod/journal/journal.asp?userid=62708

如果您在主应用程序中重新初始化COM,它应该修复所有内容。您将需要链接到OLE32.lib以使用CoUninitialize()。我使用了以下代码:

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;
}
相关问题