调整窗口大小时,Gtkmm-app在Windows 8.1上崩溃

时间:2015-03-08 11:43:06

标签: c++ pointers visual-studio-2012 gtkmm

我在视觉工作室大约1年前开发了一个带gtkmm的应用程序。当我使用Windows XP和Visual Studio 2010时没问题。现在,当我在Windows 8.1上运行它并在Visual Studio 2012中编译时 - 我可以启动它但是一旦我尝试调整窗口大小或按下OK按钮它崩溃了。

我可以在调试器中看到它在调整窗口大小时在回调函数中崩溃:

cr = window->create_cairo_context();

这时按下确定按钮:

} 

当它返回时,它位于回调函数的末尾。

这里是源代码(回调函数)

 void MyWindow::on_button_clicked(Glib::ustring data) {

Glib::RefPtr<Gdk::Window> window = myDrawingArea.get_window();

if(window)
{

    Gtk::Allocation allocation = myDrawingArea.get_allocation();
    const int width = allocation.get_width();
    const int height = allocation.get_height();
    std::cout << "w = " << width << std::endl;

    // coordinates for the center of the window
    int xc, yc;
    xc = width / 2;
    yc = height / 2;

    Cairo::RefPtr<Cairo::Context> cr = window->create_cairo_context();

    cr->set_line_width(1.0);
    std::cout << "hello in on_button_clicked!!!\n";

    a = 0;
    b = 300;
    c = 200;
    d = 150;
    e = 350;
    f = 400;
    // draw red lines out from the center of the window
    cr->set_source_rgb(0.8, 0.5, 0.0);
    cr->move_to(a, b);
    cr->line_to(c, d);
    cr->move_to(c, d);
    cr->line_to(e, f);

    cr->stroke();
    std::cout << "here comes crasch!!!\n";
}

和另一个(调整大小)

 bool MyWindow::on_drawing_expose_event(GdkEventExpose* event) {

Glib::RefPtr<Gdk::Window> window = myDrawingArea.get_window();
if(window)
{
    std::cout << "here comes crasch!!!\n";
        cr = window->create_cairo_context();

并且调试器给了我这个信息

    sigc::trackable <Unable to read memory> 
    Glib::ObjectBase    <Unable to read memory> 

和callstack

 >  ConsoleApplication4.exe!MyWindow::on_drawing_expose_event(_GdkEventExpose * event) Line 173 C++
ConsoleApplication4.exe!sigc::internal::slot_call1<sigc::bound_mem_functor1<bool,MyWindow,_GdkEventExpose *>,bool,_GdkEventExpose *>::call_it(sigc::internal::slot_rep * rep, _GdkEventExpose * const & a_1) Line 137   C++
gtkmm-vc100-2_4.dll!100a549b()  Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for gtkmm-vc100-2_4.dll]   
libgtk-win32-2.0-0.dll!61859f1e()   Unknown
libgobject-2.0-0.dll!63a45aca() Unknown
libgobject-2.0-0.dll!63a567e4() Unknown
libgobject-2.0-0.dll!63a5dafe() Unknown
libgobject-2.0-0.dll!63a5de66() Unknown
libgtk-win32-2.0-0.dll!6197a0f7()   Unknown
libgdk-win32-2.0-0.dll!6c363fe9()   Unknown
libgdk-win32-2.0-0.dll!6c363f9d()   Unknown
msvcrt.dll!_free() Unknown
msvcrt.dll!_free() Unknown
000000a8()  Unknown
msvcrt.dll!_free() Unknown
libglib-2.0-0.dll!685f6947()    Unknown
gtkmm-vc100-2_4.dll!10011723()  Unknown
gtkmm-vc100-2_4.dll!10024836()  Unknown
libgobject-2.0-0.dll!63a45aca() Unknown
libgobject-2.0-0.dll!63a56438() Unknown
libgobject-2.0-0.dll!63a5dcd6() Unknown
KernelBase.dll!_WaitForMultipleObjectsEx@20()  Unknown
libgdk-win32-2.0-0.dll!6c34137c()   Unknown
libglib-2.0-0.dll!685f09eb()    Unknown
libglib-2.0-0.dll!685f1205()    Unknown
libglib-2.0-0.dll!685f13f5()    Unknown
user32.dll!__InternalCallWinProc@20()  Unknown
user32.dll!UserCallWinProcCheckWow()    Unknown
user32.dll!DispatchClientMessage()  Unknown
user32.dll!___fnDWORD@4()  Unknown
ntdll.dll!_KiUserCallbackDispatcher@12()   Unknown
user32.dll!RealDefWindowProcWorker()    Unknown
user32.dll!RealDefWindowProcW() Unknown
uxtheme.dll!DoMsgDefault(struct _THEME_MSG const *) Unknown
uxtheme.dll!OnDwpSysCommand()   Unknown
uxtheme.dll!_ThemeDefWindowProc()   Unknown
uxtheme.dll!_ThemeDefWindowProcW@16()  Unknown
user32.dll!DefWindowProcW() Unknown
libgdk-win32-2.0-0.dll!6c37db18()   Unknown
user32.dll!__InternalCallWinProc@20()  Unknown
user32.dll!UserCallWinProcCheckWow()    Unknown
user32.dll!DispatchClientMessage()  Unknown
user32.dll!___fnDWORD@4()  Unknown
ntdll.dll!_KiUserCallbackDispatcher@12()   Unknown
user32.dll!RealDefWindowProcWorker()    Unknown
user32.dll!RealDefWindowProcW() Unknown
uxtheme.dll!DoMsgDefault(struct _THEME_MSG const *) Unknown
uxtheme.dll!OnDwpNcLButtonDown()    Unknown
uxtheme.dll!_ThemeDefWindowProc()   Unknown
uxtheme.dll!_ThemeDefWindowProcW@16()  Unknown
user32.dll!DefWindowProcW() Unknown
libgdk-win32-2.0-0.dll!6c37db18()   Unknown
user32.dll!__InternalCallWinProc@20()  Unknown
user32.dll!UserCallWinProcCheckWow()    Unknown
user32.dll!DispatchMessageWorker()  Unknown
user32.dll!_DispatchMessageW@4()   Unknown
libgdk-win32-2.0-0.dll!6c37dbe4()   Unknown
libgdk-win32-2.0-0.dll!6c37dc16()   Unknown
libglib-2.0-0.dll!685f09eb()    Unknown
libglib-2.0-0.dll!685f1205()    Unknown
libglib-2.0-0.dll!685efb1c()    Unknown
libgtk-win32-2.0-0.dll!61857694()   Unknown
msvcr100.dll!_free()   Unknown
msvcr100.dll!_free()   Unknown
sigc-vc100-2_0.dll!00092516()   Unknown
gtkmm-vc100-2_4.dll!10045a4f()  Unknown
ConsoleApplication4.exe!main(int argc, char * * argv) Line 10   C++
ConsoleApplication4.exe!__tmainCRTStartup() Line 536    C
kernel32.dll!@BaseThreadInitThunk@12() Unknown
ntdll.dll!__RtlUserThreadStart()    Unknown
ntdll.dll!__RtlUserThreadStart@8() Unknown

所以我想知道什么是错的 - 因为它曾经在其他平台上运行没有问题?

非常乐于助人。如果有人想看到整个来源并尝试它,我可以发布它。

1 个答案:

答案 0 :(得分:0)

您的问题是编译器版本,您需要使用Visual Studio 2013从源代码编译新的gtkmm,然后重建您的应用程序。

第二个选项是安装旧版本的Visual Studio并重建您的应用程序并定位XP。

如果您决定使用Visual Studio 2013编译最新的gtkmm(3.14),我就如何做到这一点制作了一个教程link1 link2。无论如何,在我的GitHub页面上,您还可以找到用于Windows x64的Visual Studio 2013调试的prebult gtkmm 3.14