1

我有一个 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。有任何想法吗?

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,它应该可以解决所有问题。您需要链接到 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;
}
于 2009-10-01T20:01:43.000 回答