Pergunta

Eu tenho um projeto gui C ++ exibindo um comportamento estranho. Na minha máquina, as compilações de código e funciona muito bem. No entanto, em outra máquina, Os compila o código, mas acaba sendo executado em MTA de alguma forma. Obviamente, estando em MTA faz com que todos os tipos de problemas de tempo de execução para o GUI. Aqui é a minha principal:

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

Eu posso colocar um ponto de interrupção na primeira linha de principal para verificar o estado apartamento, e nas máquinas que build / executar corretamente, ele será "STA", como esperado. No entanto, nas máquinas problemáticas, será "MTA". Posso até tentar mudar o modo de apartamento para STA, sem efeito.

Eu tentei remover os diretórios debug / release e limpeza do projeto antes de compilar, executar sem um depurador anexado, todos sem sucesso. Eu não pode determinar qualquer padrão para que as máquinas funcionam e quais não. Se eu compilar o exe em uma máquina trabalhando e trazê-lo mais para uma máquina problemática, ele irá executar corretamente, então eu suspeito que isso é de alguma forma uma questão de ambiente de compilação. Todas as máquinas envolvidas estão executando o Windows XP com o padrão visual studio 2008. Alguma idéia?

Foi útil?

Solução

Descobri-lo. Nosso projeto foi fazer chamadas para uma DLL do openCV, e que dll tinha sido compilado para vários segmentos. visual studio percebeu isso e forçou o aplicativo para compilar para vários segmentos também. Diferentes versões da dll de uma máquina para outra foram responsáveis ??pela irregularidade do problema.

Outras dicas

Eu só tenho feito corrigir um bug similar com OpenCV 1.1 e código gerenciado. Por alguma razão, parece que as bibliotecas OpenCV forçar o aplicativo para MTA (talvez um objeto COM na interface OpenCV DShow). De qualquer forma eu encontrei esta solução: http://www.gamedev.net/community/ fóruns / mod / journal / journal.asp? userid = 62708

Se você reinicializar COM em seu aplicativo principal deveria consertar tudo. Você precisará link para Ole32.lib usar CoUninitialize (). Eu usei o seguinte 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top