Domanda

Ho un progetto gui in C ++ che mostra alcuni comportamenti strani. Sulla mia macchina, il codice si compila e funziona bene. Tuttavia, su un altro computer, il codice viene compilato ma alla fine viene eseguito in MTA in qualche modo. Ovviamente, essere in MTA causa tutti i tipi di problemi di runtime per la GUI. Ecco il mio principale:

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

Posso mettere un breakpoint sulla prima riga di main per controllare lo stato dell'appartamento, e sulle macchine che costruiscono / eseguono correttamente, sarà " STA " ;, come previsto. Tuttavia, sulle macchine problematiche, sarà & Quot; MTA & Quot ;. Posso anche provare a cambiare la modalità appartamento in STA, senza effetto.

Ho provato a rimuovere le directory debug / release e pulire il progetto prima di compilare, eseguendo senza un debugger collegato, il tutto inutilmente. Non riesco a determinare alcun modello su quali macchine funzionano e quali no. Se compilo l'exe su una macchina funzionante e lo trasferisco su una macchina problematica, verrà eseguito correttamente, quindi sospetto che questo sia in qualche modo un problema di ambiente di compilazione. Tutte le macchine coinvolte eseguono Windows XP con Visual Studio 2008 standard. Qualche idea?

È stato utile?

Soluzione

Capito. Il nostro progetto stava effettuando chiamate a una DLL da openCV e quella DLL era stata compilata per più thread. Visual Studio l'ha notato e ha costretto l'app a compilare anche per più thread. Versioni diverse della DLL da una macchina all'altra erano responsabili dell'irregolarità del problema.

Altri suggerimenti

Ho appena finito di correggere un bug simile con OpenCV 1.1 e codice gestito. Per qualche motivo sembra che le librerie OpenCV forzino l'applicazione in MTA (forse un oggetto COM nell'interfaccia Openhow DShow). Comunque ho trovato questa soluzione: http://www.gamedev.net/community/ Forum / mod / rivista / journal.asp? userid = 62708

Se si reinizializza COM nell'applicazione principale, dovrebbe risolvere tutto. Dovrai collegarti a OLE32.lib per usare CoUninitialize (). Ho usato il seguente codice:

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top