我的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。
答案 0 :(得分:0)
如果问题确实是由于使用了两组不匹配的GTK +库,那么最直接的解决方案是使用完全相同版本的GTK +和用于构建Firefox的依赖库来构建wxWidgets。在实践中,最简单的方法可能是在构建Firefox的同一系统下构建它。
从维护的角度来看,这绝对不是理想的,但遗憾的是我无法提出任何其他解决方案。如果您的代码是GPL,您可以尝试静态链接GTK +,但通常不会出于各种原因推荐它,如果它不是GPL,那么无论如何都无法做到。