Я занимаюсь разработкой приложения 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, но до сих пор это всего лишь предположение.Кроме этого, у меня нет идей.
Я пока попробую эти идеи.Надеюсь, у кого-то есть больше предложений или кто знает, что происходит с кодом выше.