前阵子项目需求我封装一个类似于MessageBox这个API创建的类似窗口给我们的程序使用,本着做好看界面的想法,我开始着手去做了,做了个demo也能用,但随着窗口写完实际放到程序里去用的时候,问题出来了。
第一个问题:
如果调用dll的程序是多线程,这时候qt的弊端来了,Qt只有一个GUI线程,当你调用QWinWidget win(parent);这句话,parent是HWND窗口句柄,qt会把这个窗口对应的threadid作为qt的GUI线程,这时候如果你程序的其他线程再调用这个dll去创建窗口,其他的线程统统会报错,Widgets must be created in the GUI thread.
第二个问题:
如果你的程序是qt程序,那么直接就GG了,qt程序的主线程就是GUI线程,这时候你再非GUI线程上调用dll创建窗口,那么也一样会报错Widgets must be created in the GUI thread.
所以当你想要使用qt封装窗口进dll,那么一定要明确几点,调用dll的程序不能是QT程序,而且这个程序如果有多个线程都会调用dll的话,还得不能同时调用,至少目前试下来这样会出错,还是老老实实地用win32好了,难怪一开始搜封装qt窗口进dll,资料也特别少,这块能用dll的条件也异常的苛刻