比来因为事情上的需要,对系统在架构长进行解耦,参考之前做的对象考虑对进程间通信封装一个动态库,差此外进程加载动态库供给的通用接口来进动作静收发。正好在学习qt,于是基于qt的qlocalserver来进行了动态库的开发。开发完成之后,问题来了。。。有一部分成果是使用网页来展现的,我们用了一个公司买的封装过的浏览器来加载网页,网页的事件由浏览器加载的np插件来响应,我的思路就是我用开发的np插件(这也是一个动态库)加载我的动态库,来实现np插件与我的处事进程之间的通信。开发都很顺利。。。编译,使用dependence检察动态库是否有依赖缺掉,显示也很正常,但是浏览器加载np插件的时候就插件就瓦解了,报出这样的错误:Cannot create a win event notifier without a QEventDispatcherWin32。
百度之,答案是这样的:https://*.com/questions/3511044/cannot-create-a-win-event-notifier-without-a-qeventdispatcherwin32。
这人说他是用release版本的应用挪用了debug版本的动态库。因为我的都是用的debug版本的,所以显然不是这个错误了。
继续百度,相关的几乎没有,回到调试的工程,发明是在初始化一个qlocalsocket东西的时候瓦解的,,往下调试的话会发此刻报错是呈此刻这个文件qwineventnotifier_p.cpp的这句话
QEventDispatcherWin32 *eventDispatcher = qobject_cast<QEventDispatcherWin32 *>(d->threadData->eventDispatcher);
这个d->threadData->eventDispatcher在内存中调看是空的。哎。对qt我也是初学者,老诚恳实地再去google一下吧。(真的觉得百度欠好用,出格是这种偏门的错误,百度几乎没有。之前做过一个qt的文件树也是百度啥也搜不到,这个筹备另写一篇)也搜了bing,功效前三条都是跟上面一样的,但是还是有一条引起了我的注意:
这里面作者列举了一个在启动QCoreApplication a(argc,argv)之前访谒QObject引起错误的实例。固然后面参差不齐的答复也没人说解决了这个问题。但是这给了我一个思路,因为np插件是c++写的,加载np插件的plugins-container.exe显然也不是qt写的,而我之前调试的时候都是使用qt进程进行的。因此我当即写了一个简单的c++win32控制台措施来加载我的插件,公然呈现了上面的错误。
问题找到了,显然qt的一些类(基于QObject)是需要基于一个QCoreApplication的实例化东西的,这样再去搜索找到这样一个答案:https://*.com/questions/2150488/using-a-qt-based-dll-in-a-non-qt-application。
参照答主本身的描述(他本身供给了一个解决要领),因为我们整个动态库的主线程使用了qlocalserver,所以我在插件的入口加上这样的代码:
QCoreApplication *_pQCoreApplication;
if (QCoreApplication::instance() == NULL)
{
//如果不是qt进程 则本身实例化一个QCoreApplication
int argc = 1;
char* argv[] = { "dummy.exe", NULL };//进程名可以随便起一个 无所谓的
_pQCoreApplication = new QCoreApplication(argc, argv);
_pQCoreApplication.processEvents();
}
else
{
_pQCoreApplication = NULL;
}
问题是解决了,进程运行也正常了,无论是内存还是析构都没有报出异常,但是问题和提问者是一样的,就是这样使用是否安适,以及是否合适,还有待思考和盘问。