سؤال

وأنا عندي مشروع واجهة المستخدم الرسومية C ++ اظهار بعض السلوك الغريب. على الجهاز الخاص بي، رمز يجمع ويعمل على ما يرام. ومع ذلك، على جهاز آخر، كود يجمع لكن ينتهي تشغيل في MTA بطريقة أو بأخرى. من الواضح، ويجري في MTA يسبب كل أنواع المشاكل وقت لواجهة المستخدم الرسومية. هنا هو بلدي الرئيسية:

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

ويمكن أن أضع نقطة على السطر الأول من main للتحقق من حالة الشقة، وعلى الأجهزة التي تبني / تنفيذ بشكل صحيح، فإنه سيكون "STA"، كما هو متوقع. ومع ذلك، على أجهزة إشكالية، سيكون "MTA". حتى أستطيع أن محاولة تبديل وضع شقة لSTA، دون تأثير.

ولقد حاولت إزالة التصحيح / تطبيق الاستعراض المفصل إطلاق وتنظيف المشروع قبل تجميع وتشغيل دون مصحح المرفقة، ولكن دون جدوى. لا أستطيع تحديد أي نمط الذي آلات تعمل والتي لا. إذا كنت تجميع إكس على جهاز العمل وجعله أكثر إلى جهاز إشكالية، فإنه سيتم تنفيذ بشكل صحيح، لذلك أظن أن هذا هو إلى حد ما قضية بناء بيئة. جميع الأجهزة المعنية تعمل بنظام التشغيل Windows XP مع استوديو البصرية 2008 القياسية. أي أفكار؟

هل كانت مفيدة؟

المحلول

وترد عليها. كان مشروعنا إجراء المكالمات إلى DLL من مكتبة برمجية مفتوحة للرؤية الحاسوبية، وكان ذلك DLL تم تجميع للمواضيع متعددة. لاحظ استوديو البصرية هذا وأجبر التطبيق تجميع للمواضيع متعددة أيضا. اختلاف إصدارات DLL من جهاز واحد إلى آخر ومسؤولة عن عدم انتظام المشكلة.

نصائح أخرى

وأنا فقط حصلت على القيام به تحديد خلل مماثل مع مكتبة برمجية مفتوحة للرؤية الحاسوبية 1.1 و التعليمات البرمجية المدارة. لسبب ما يبدو أن المكتبات مكتبة برمجية مفتوحة للرؤية الحاسوبية تجبر التطبيق في MTA (ربما كائن COM في واجهة مكتبة برمجية مفتوحة للرؤية الحاسوبية DShow). على أي حال لقد وجدت هذا الحل: http://www.gamedev.net/community/ المنتديات / وزارة الدفاع / مجلة / journal.asp؟ معرف المستخدم = 62708

إذا قمت بإعادة تهيئة COM في تطبيق الرئيسي الخاص بك يجب إصلاح كل شيء. وسوف تحتاج لربط OLE32.lib استخدام CoUninitialize (). لقد استخدمت البرمجية التالية:

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