Сбой в Windows XP с очень простой программой GTK + Cairo - PullRequest
3 голосов
/ 05 ноября 2010

Я занимаюсь разработкой приложения Gtk с использованием gtkmm в Windows Vista с Visual Studio 2005. Приложение отлично работает на компьютере разработчика, но я получил отчеты о сбоях после его запуска на компьютерах с Windows XP (как с пакетом обновления 2, так и с 3),Я распространяю приложение со структурой каталогов, описанной в http://live.gnome.org/gtkmm/MSWindows, и до сих пор у меня не возникало проблем.

Сбой не дает сообщений об ошибках, кроме Windows, спрашивающей, хочу ли я сообщить об ошибке.

Чтобы решить эту проблему, я попытался скомпилировать программу для разных версий gtkmm (последняя стабильная версия gtkmm-win32-devel-2.16.0-4 и более старая версия gtkmm-win32-devel-2.10.11-1), но проблема не исчезла.

Я выследил проблему до вызова window-> create_cairo_context () внутри on_expose_event объекта Gtk :: DrawingArea.Когда я закомментировал этот звонок, проблема исчезла.Поэтому я написал следующую минимальную программу, которая по-прежнему вылетает:

#include <gtkmm.h>
    #include <iostream>

class MyWindow : public Gtk::Window {
    bool on_expose_event(GdkEventExpose* event) {
        std::cout << "expose" << std::endl;

        Glib::RefPtr<Gdk::Window> window = get_window();
        if(window) {
            std::cout << "win" << std::endl;
            std::cout << "Get cairo" << std::endl;
            Cairo::RefPtr<Cairo::Context> cr = window->create_cairo_context();
            std::cout << "Get cairo done" << std::endl;
        } else {
            std::cout << "no win" << std::endl;
        }

        return true;
    }
};

int main (int argc, char *argv[]) {
    Gtk::Main m(argc,argv);
    MyWindow w;
    m.run(w);
    return 0;
}

Это минимальное приложение может без проблем запускать и отображать окно, но если я переместлю окно за пределы экрана или если я сверну / разверну егодостаточно раз (таким образом вызывая вызовы on_expose_event), это в конечном итоге приведет к сбою.Может также случиться так, что он не будет аварийно завершать работу в первый раз, но он будет аварийно завершать работу после перезапуска приложения и запуска нескольких вызовов on_expose_event, как описано выше.Одна вещь, которую я заметил, это то, что приложение вылетает после печати «Get cairo done».Когда я закомментирую вызов create_cairo_context, проблема исчезнет, ​​поэтому я почти уверен, что с этой строкой что-то не так.

Ошибка возникает на чистых установленных машинах с Windows XP.Я протестировал оба приложения (оригинальное и минимальное) на ноутбуке коллеги, который также имеет Windows XP, но там не происходит сбой.Я предполагаю, что есть некоторая зависимость, которая доступна / обновляется на наших компьютерах, но не на компьютерах, где происходит сбой приложения.Я обновил DirectX и установил распространяемый Visual Studio C ++ 2005 на одном из проблемных компьютеров, но проблема сохраняется.

Исходное приложение, которое рисует график в DrawingArea, не обязательно аварийно завершает работу в первый раз.,Он может нормально работать в первый раз после перезагрузки, но более склонен к отказу во второй раз.

Я думаю о компиляции и тестировании с MinGW, чтобы посмотреть, решит ли это проблему.Я также попробую скомпилировать отладочную версию и попробую использовать отладчик.Я подозревал, что версия gdi32.dll может что-то делать, видя, что libcairo-2.dll зависит от этой DLL согласно Dependency Walker, но до сих пор это всего лишь предположение.Кроме этого, у меня нет идей.

Я пока попробую эти идеи.Надеюсь, у кого-то есть больше предложений или кто знает, что происходит с кодом выше.

...