通过firefox p11模块打开Wxwidget窗口时崩溃

时间:2015-08-06 12:03:16

标签: c++ linux firefox shared-libraries wxwidgets

我的pkcs#11库中有一个函数,我想在调用时打开一个wxwidgets窗口。当firefox调用pkcs#11 C_Sign函数时,将调用该函数。 (我的C_Sign函数调用login_dialog)

这是代码

#include <wx/wx.h>
#include "wx/wxprec.h"
#include <pthread.h>

class wxP11App2 : public wxApp
{
public:
  virtual bool OnInit();
};

DECLARE_APP(wxP11App2)
// Use _NO_MAIN since we don't want main() to be created
IMPLEMENT_APP_NO_MAIN(wxP11App2);


bool wxP11App2::OnInit()
{
  printf("OnInit\n");
  wxFrame *frame = new wxFrame((wxFrame*) NULL, -1, _T("Hello wxWidgets World"));
  frame->CreateStatusBar();
  frame->SetStatusText(_T("Hello World"));
  frame->Show(true);
  SetTopWindow(frame);
  printf("OnInit done\n");
  return true;
}


void* start_wxapp_func(void* args)
{
  printf("Thread func\n");

  int argc = 0;
  wxChar* argv = NULL;

  wxApp* pApp = new wxP11App2();
  wxApp::SetInstance(pApp);
  wxEntry(argc, &argv);

  return NULL;
}

int login_dialog()
{
  int rv = 0;

  pthread_t thread1;
  pthread_create( &thread1, NULL, start_wxapp_func, NULL);

  int count = 0;
  while(1) {
    printf("Sleep: %d\n", count++);
    sleep(1);
  }

  return rv;
}

但是,当调用wxEntry时,firefox会崩溃。如果我从一个新创建的c ++程序中调用C_Sign(而不是当firefox调用C_Sign函数时)它可以工作。我得到了我的wxwidgets窗口。我没有在该程序中使用任何其他GUI。 (既没有wxwidgets上下文也没有gtk上下文)。

似乎它崩溃了firefox所以我认为它可能有一些事情要做firefox已经运行了一个gtk实例(并且由于wxwidgets使用gtk它可能是个问题)。

您对我应该尝试的内容有什么建议吗?

更新:

这是使用调试信息构建的firefox的堆栈跟踪:

0   gdk_drawable_get_screen mozgtk.c    561 0x7f5ab2291b09  
1   wx_gdk_window_get_screen    gtk2-compat.h   391 0x7f5a859beca4  
2   wxClientDisplayRect display.cpp 80  0x7f5a859bedb2  
3   wxGetClientDisplayRect  gdicmn.cpp  902 0x7f5a85ae5300  
4   wxTopLevelWindowBase::GetDefaultSize    toplvcmn.cpp    216 0x7f5a85b7f8fb  
5   wxTopLevelWindowGTK::Create toplevel.cpp    571 0x7f5a859d3955  
6   wxFrame::Create frame.cpp   56  0x7f5a85a3bb75  
7   wxFrame::wxFrame    frame.h 31  0x7f5a8679dd0c  
8   wxP11App2::OnInit   LoginDlg_linux.cpp  27  0x7f5a8679d825  
9   wxAppConsoleBase::CallOnInit    app.h   93  0x7f5a8679db95  
10  wxEntry init.cpp    479 0x7f5a858b789f  
11  start_wxapp_func    LoginDlg_linux.cpp  47  0x7f5a8679da2a  
12  start_thread        312 0x7f5ab1e60182  
13  clone       111 0x7f5ab116947d  

所以在我的代码中,它创建了一个崩溃程序的新wxFrame。

1 个答案:

答案 0 :(得分:0)

如果问题确实是由于使用了两组不匹配的GTK +库,那么最直接的解决方案是使用完全相同版本的GTK +和用于构建Firefox的依赖库来构建wxWidgets。在实践中,最简单的方法可能是在构建Firefox的同一系统下构建它。

从维护的角度来看,这绝对不是理想的,但遗憾的是我无法提出任何其他解决方案。如果您的代码是GPL,您可以尝试静态链接GTK +,但通常不会出于各种原因推荐它,如果它不是GPL,那么无论如何都无法做到。