Frage

Ich habe ein C ++ gui Projekt ausstellenden ein seltsames Verhalten bekommt. Auf meinem Rechner kompiliert den Code und läuft gut. Jedoch auf einem anderen Rechner, kompiliert der Code aber landet irgendwie in MTA ausgeführt wird. Offensichtlich in MTA wird bewirkt, dass alle Arten von Laufzeitproblemen für die GUI. Hier ist meine Haupt:

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

kann ich einen Haltepunkt in der ersten Zeile des Haupt setzen die Wohnung Zustand zu überprüfen und auf den Maschinen, die korrekt bauen / ausführen, wird es „STA“, wie zu erwarten sein. Doch auf den problematischen Maschinen, es wird „MTA“ sein. Ich kann sogar versuchen, die Wohnung Modus STA Schalten ohne Wirkung.

Ich habe versucht, das Entfernen der Debug / Release dirs und das Projekt Reinigung vor dem Kompilieren ohne Debugger ausgeführt wird angebracht, alles ohne Erfolg. Ich kann kein Muster bestimmt, an die Maschinen arbeiten und welche nicht. Wenn ich die exe auf einer Arbeitsmaschine zusammenstellen und bringen Sie zu einer problematischen Maschine über, wird es korrekt ausführen, so dass ich vermute, das ist irgendwie ein Build-Umgebung Problem. Alle Maschinen beteiligt sind, unter Windows XP mit Visual Studio 2008 Standard. Irgendwelche Ideen?

War es hilfreich?

Lösung

es herausgefunden. Unser Projekt wurde Anrufe an eine DLL-Datei von OpenCV, und dass dll für mehrere Threads erstellt worden war. Visual Studio bemerkte dies und gezwungen, die App für mehrere Threads als auch zu kompilieren. Unterschiedliche Versionen der DLL-Datei von einem Rechner zum anderen für die Unregelmäßigkeit des Problems verantwortlich waren.

Andere Tipps

Ich habe gerade einen ähnlichen Fehler mit OpenCV Festsetzung getan 1.1 und verwalteten Code. Aus irgendeinem Grund scheint es, dass die OpenCV-Bibliotheken, die Anwendung in MTA erzwingen (vielleicht ein COM-Objekt in der OpenCV DShow Schnittstelle). Auf jeden Fall fand ich diese Lösung: http://www.gamedev.net/community/ Foren / mod / Zeitschrift / journal.asp? userid = 62708

Wenn Sie COM in der Hauptanwendung neu initialisieren sollte es alles reparieren. Sie müssen Ole32.lib verknüpfen CoUninitialize () zu verwenden. Ich habe den folgenden Code:

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top