我正在使用Visual Studio 2005在Windows Vista上使用gtkmm开发Gtk应用程序。该应用程序在开发计算机上运行正常,但是在Windows XP计算机(Service Pack 2和3)上运行后我收到了崩溃报告。我使用http://live.gnome.org/gtkmm/MSWindows中描述的目录结构分发应用程序,到目前为止它没有给我任何问题。
崩溃没有提供任何错误消息,除了Windows询问我是否要报告错误。
为了解决这个问题,我尝试针对不同版本的gtkmm编译程序(最新的稳定版本gtkmm-win32-devel-2.16.0-4和旧版本gtkmm-win32-devel-2.10.11 -1)但问题仍然存在。
我在Gtk :: DrawingArea的on_expose_event中调用了window-> create_cairo_context()。当我注释掉这个电话时,问题就会消失。所以我编写了以下最小程序,它仍然崩溃:
#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 Redistributable,但问题仍然存在。
在DrawingArea上绘制图形的原始应用程序也不一定会在第一次崩溃。它可能在重新启动后第一次正常工作,但第二次更容易失败。
我正在考虑使用MinGW进行编译和测试,看看是否能解决问题。我还将尝试编译调试版本并尝试使用调试器。我怀疑gdi32.dll的版本可能有事情要做,看看根据Dependency Walker,libcairo-2.dll依赖于这个dll,但直到现在它只是一个推测。除此之外,我没有想法。
我暂时会尝试这些想法。希望有人有更多建议或知道上面的代码发生了什么。