COleDispatchDriver ICry ;
if (CoInitialize(0) != S_OK) AfxMessageBox("Не инициализируется OLE!");
if (!ICry.CreateDispatch(_T("ATS.CryptoUI"), NULL))
AfxMessageBox("Не грузиться объект!");
Так вот, когда он присутствует в Exe-шном приложении, то прекрасно отрабатывает.
А вот когда я его вызываю в DLL, то на вызове CreateDispatch приложение зависает.
Пдскажите плз в чём проблема.
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний
Здравствуйте, tyomchick, Вы писали:
T>Так вот, когда он присутствует в Exe-шном приложении, то прекрасно отрабатывает. T>А вот когда я его вызываю в DLL, то на вызове CreateDispatch приложение зависает.
Попробуйте вместо CoInitialize использовать AfxOleInitModule( ):
For OLE support from a regular DLL that is dynamically linked to MFC, call this function in your regular DLL's CWinApp::InitInstance function to initialize the MFC OLE DLL. The MFC OLE DLL is an extension DLL; in order for an extension DLL to get wired into a CDynLinkLibrary chain, it must create a CDynLinkLibrary object in the context of every module that will be using it. AfxOleInitModule creates the CDynLinkLibrary object in your regular DLL’s context so that it gets wired into the CDynLinkLibrary object chain of the regular DLL.
Здравствуйте, algol, Вы писали:
A>Здравствуйте, tyomchick, Вы писали:
T>>Так вот, когда он присутствует в Exe-шном приложении, то прекрасно отрабатывает. T>>А вот когда я его вызываю в DLL, то на вызове CreateDispatch приложение зависает.
A>Попробуйте вместо CoInitialize использовать AfxOleInitModule( ):
A>
A>For OLE support from a regular DLL that is dynamically linked to MFC, call this function in your regular DLL's CWinApp::InitInstance function to initialize the MFC OLE DLL. The MFC OLE DLL is an extension DLL; in order for an extension DLL to get wired into a CDynLinkLibrary chain, it must create a CDynLinkLibrary object in the context of every module that will be using it. AfxOleInitModule creates the CDynLinkLibrary object in your regular DLL’s context so that it gets wired into the CDynLinkLibrary object chain of the regular DLL.
К сожалению не помогло. И вообще без вызова CoInitialize функция просто завершается неудаче.
Вот какой коментарий я нашёл в реализации AfxOleInit:
// Special case DLL context to assume that the calling app initializes OLE.
// For DLLs where this is not the case, those DLLs will need to initialize
// OLE for themselves via OleInitialize. This is done since MFC cannot provide
// automatic uninitialize for DLLs because it is not valid to shutdown OLE
// during a DLL_PROCESS_DETACH.
Программа продолжает виснуть.
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний
T>Так вот, когда он присутствует в Exe-шном приложении, то прекрасно отрабатывает. T>А вот когда я его вызываю в DLL, то на вызове CreateDispatch приложение зависает. T>Пдскажите плз в чём проблема.
I>Объект formsApp не создается, когда вызываю CreateDispatch() в dll. Код расположен в InitInstance. Подскажите, пожалуйста, в чем проблема. I>Спасибо!
1. Возможно, для вашей DLL CoInitialize (AfxOleInit) уже была вызвана главной проргаммой (возможно с другими параметрами, например MTA). Если она уже была вызвана, вызывать AfxOleInit второй раз в DLL бессмысленно.
2. Если зайти отладчиком внутрь CreateDispatch — на чем конкретно виснет-то?
3. Попробуйте откомпилировать в Release. Это избавит от подозрений насчет AfxOleInitModule & MFCOxx.DLL
4. Попробуйте заменить COleDispatchDirver на CComDispatchDriver. Это избавит от подозрений на счет MFC.