我有一个C ++图形用户界面项目表现出一些奇怪的行为。在我的机器,代码编译和运行就好了。然而,另一台机器上,该代码编译,但最终在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文件,并把它交给一个有问题的机器,它会正确地执行,所以我怀疑这是某种编译环境的问题。所有相关计算机运行的是Windows XP与Visual Studio 2008标准。任何想法?

有帮助吗?

解决方案

了它。我们的项目是从OpenCV的拨打电话到一个DLL,该DLL已经被编译为多线程。 Visual Studio中注意到了这一点,并迫使应用程序编写多线程以及。不同的dll版本从一台机器到另一被负责问题的不规则性。

其他提示

我只得到了做固定用的OpenCV 1.1类似的bug和托管代码。出于某种原因,似乎OpenCV的库强制应用程序到MTA(也许在OpenCV的DSHOW接口的COM对象)。无论如何,我发现这个解决方案: http://www.gamedev.net/community/论坛/ MOD /日记/ journal.asp?用户ID = 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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top