Тема: Отображение диалогового окна экспортируемой функцией
Значит есть следующее:
1. Простейший загрузочный ARX модуль созданный визардом в который добавлена единственная команда загружающая/выгружающая DLL и выполняющая единственную экспортируемую функцию:
Добавлена команда MYCOMMAND:
AddCommand("XXX", "MYCOMMAND", "MYCOMMAND", ACRX_CMD_TRANSPARENT | ACRX_CMD_USEPICKSET, MyCommand);
Собственно фукция:
typedef int (WINAPI *pMyFunction)(); void MyCommand() { HINSTANCE hMyDll; if((hMyDll = ::LoadLibrary("MyDll.dll"))!=NULL) { pMyFunction pfnMyFunction; pfnMyFunction = (pMyFunction)GetProcAddress(hMyDll,"CommandFunction"); int iCode=(*pfnMyFunction)(); ::FreeLibrary(hMyDll); } else acutPrintf("\nError"); }
2. Создана библиотека MyDll.dll с единственной экспортируемой функцией CommandFunction. Библиотека создавалась при помощи MFC AppWizard (dll) с режимом “MFC Extension DLL”. Вот что имеем:
HINSTANCE _hdllInstance = NULL; static AFX_EXTENSION_MODULE MyModuleDLL = { NULL, NULL }; extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { // Remove this if you use lpReserved UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH) { TRACE0("OPTMODULE.DLL Initializing!\n"); // Extension DLL one-time initialization if (!AfxInitExtensionModule(OptModuleDLL, hInstance)) return 0; _hdllInstance = hInstance; new CDynLinkLibrary(MyModuleDLL); } else if (dwReason == DLL_PROCESS_DETACH) { TRACE0("OPTMODULE.DLL Terminating!\n"); // Terminate the library before destructors are called AfxTermExtensionModule(MyModuleDLL); } return 1; // ok }
Экспортируемая функция, которая должна отображать простой диалог:
extern "C" BOOL CALLBACK CommandFunction() { CMyDlg *WDialog; WDialog = new CMyDlg(CWnd::FromHandle(adsw_acadMainWnd())); WDialog->DoModal(); delete WDialog; return TRUE; }
В общем после загрузки и вызова команды MYCOMMAND акад спотыкается о строчку WDialog->DoModal() и вываливается. Если выгасить указанную строчку, то все работает великолепно.
Понятно что в этой ситуации происходит конфликт с ресурсами. Причем обращение к другим ресурсам в теле функции с использованием ::FindResource с указанием дескриптора _hdllInstance работает без сучка и задоринки.
Решение проблемы похоже зарыто в традиционном вызове CAcModuleResourceOverride resOverride. Но указывать его перед WDialog->DoModal() бессмысленно т.к. у нас не объявлен AC_IMPLEMENT_EXTENSION_MODULE.
Пытался вызывать acDocManager->pushResourceHandle и acDocManager->popResourceHandle - результат нулевой.
Вызов AFX_MANAGE_STATE(AfxGetStaticModuleState()) также ни к чему не приводит.
Перерыл весь http://discussion.autodesk.com/ но достойного решения моей проблемы там нет.
В связи с чем с возгласом о помощи обращаюсь к Вам, господа....