Я ПОЛУЧИЛ ЭТУ РАБОТУ!После многих разочаровывающих часов, работая над этим, я начал работать.Я использовал код, предоставленный в документации по миграции Qt / MFC, который имеет:
BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason,
LPVOID /*lpvReserved*/ )
{
static bool ownApplication = FALSE;
if ( dwReason == DLL_PROCESS_ATTACH )
ownApplication = QMfcApp::pluginInstance( hInstance );
if ( dwReason == DLL_PROCESS_DETACH && ownApplication )
delete qApp;
return TRUE;
}
Эта структура работала бы для одной загрузки моей библиотеки подключаемых модулей, но не работала при последующих загрузках.Я не верю, что DllMain является правильным местом для вызова pluginInstance (по крайней мере, для моего варианта использования).Я думаю, что проблема заключалась в том, что мое стороннее приложение вызывает DllMain только один раз и не выгружает DLL, пока приложение не закроется.Таким образом, когда я запустил свой плагин, а затем выключил и снова запустил его, QApplication, инициализированный вызовом pluginInstance, все еще зависал.Я думаю, что мое стороннее приложение запускает отдельные потоки каждый раз, когда запускается мой плагин, поэтому, когда я запускал свой плагин во второй раз, он был новым потоком, но все еще пытался использовать исходную настройку QApplication в DllMain (DLL все еще загружается).Отсюда моя ошибка, потому что это был новый поток, пытающийся записать в GUI.
Стороннее приложение MFC, которое я создаю, ожидает два экспорта в мою DLL, Startup () и Shutdown (), которые он вызывает насоответствующие времена.
Так что вместо того, чтобы делать то, что предлагает пошаговое руководство, я сделал следующее (псевдокод):
extern "C" __declspec(dllexport) void Startup()
{
QMfcApp::pluginInstance( 3rdPartyApp::GetPluginHandle() );
QWinWidget win( 3rdPartyApp::GetParentWindow() );
win.showCentered();
QMessageBox::about( &win, "About", "Hello World" );
}
extern "C" __declspec(dllexport) void Shutdown()
{
qApp->quit();
delete qApp;
}
Это хорошо для одного плагина, но если я создаю несколько плагинов, яЯ не уверен, насколько хорошо это будет работать из-за интеграции цикла событий. Я думаю, что для всех плагинов должен быть только один QApplication (основываясь на моем прочтении документации Qt / MFC).