Pregunta

Tengo un proyecto de interfaz gráfica de usuario de C ++ que muestra un comportamiento extraño. En mi máquina, el código se compila y funciona bien. Sin embargo, en otra máquina, el código se compila pero termina de alguna manera en MTA. Obviamente, estar en MTA causa todo tipo de problemas de tiempo de ejecución para la GUI. Aquí está mi principal:

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

Puedo poner un punto de interrupción en la primera línea de main para verificar el estado del departamento, y en las máquinas que compilan / ejecutan correctamente, será " STA " ;, como se esperaba. Sin embargo, en las máquinas problemáticas, será & Quot; MTA & Quot ;. Incluso puedo intentar cambiar el modo apartamento a STA, sin efecto.

He intentado eliminar los directorios de depuración / liberación y limpiar el proyecto antes de compilar, ejecutándolo sin un depurador conectado, todo en vano. No puedo determinar ningún patrón para qué máquinas funcionan y cuáles no. Si compilo el exe en una máquina que funciona y lo llevo a una máquina problemática, se ejecutará correctamente, por lo que sospecho que esto es de alguna manera un problema del entorno de compilación. Todas las máquinas involucradas están ejecutando Windows XP con Visual Studio 2008 estándar. ¿Alguna idea?

¿Fue útil?

Solución

Lo descubrí. Nuestro proyecto estaba haciendo llamadas a un dll desde openCV, y ese dll había sido compilado para múltiples hilos. Visual Studio se dio cuenta de esto y forzó a la aplicación a compilar para múltiples hilos también. Las diferentes versiones de la dll de una máquina a otra fueron responsables de la irregularidad del problema.

Otros consejos

Acabo de arreglar un error similar con OpenCV 1.1 y el código administrado. Por alguna razón, parece que las bibliotecas de OpenCV fuerzan la aplicación a MTA (quizás un objeto COM en la interfaz OpenCV DShow). De todos modos encontré esta solución: http://www.gamedev.net/community/ foros / mod / journal / journal.asp? userid = 62708

Si reinicia COM en su aplicación principal, debería solucionarlo todo. Deberá vincular a OLE32.lib para usar CoUninitialize (). Usé el siguiente código:

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top