문제

이상한 행동을 보여주는 C ++ GUI 프로젝트가 있습니다. 내 컴퓨터에서 코드는 컴파일하고 잘 실행됩니다. 그러나 다른 컴퓨터에서는 코드가 컴파일되지만 결국 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를 컴파일하고 문제가있는 기계로 가져 오면 올바르게 실행되므로 이것이 어떻게 든 빌드 환경 문제라고 생각합니다. 관련된 모든 기계는 Visual Studio 2008 표준으로 Windows XP를 실행하고 있습니다. 어떤 아이디어?

도움이 되었습니까?

해결책

그것을 알아 냈습니다. 우리의 프로젝트는 OpenCV에서 DLL을 호출하고 있었고 DLL은 여러 스레드에 대해 컴파일되었습니다. Visual Studio는 이것을 알아 차리고 앱이 여러 스레드를 컴파일하도록 강요했습니다. 한 머신마다 다른 버전의 DLL이 문제의 불규칙성을 담당했습니다.

다른 팁

방금 OpenCV 1.1 및 관리 코드로 비슷한 버그를 수정했습니다. 어떤 이유로 든 OpenCV 라이브러리는 애플리케이션을 MTA로 강제로 강제로 보입니다 (아마도 OpenCV dshow 인터페이스의 COM 객체). 어쨌든 나는이 해결책을 찾았다 :http://www.gamedev.net/community/forums/mod/journal/journal.asp?userid=62708

기본 응용 프로그램에서 COM을 다시 시작하면 모든 것을 수정해야합니다. couninitialize ()를 사용하려면 Ole32.lib에 연결해야합니다. 다음 코드를 사용했습니다.

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