Зависание CreateDispatch в DLL
От: tyomchick Россия  
Дата: 26.09.05 16:12
Оценка:
Привет!
Господа, есть приблизно такой код:


    COleDispatchDriver  ICry ;  
    if (CoInitialize(0) != S_OK) AfxMessageBox("Не инициализируется OLE!"); 
    
    if (!ICry.CreateDispatch(_T("ATS.CryptoUI"), NULL))
        AfxMessageBox("Не грузиться объект!");


Так вот, когда он присутствует в Exe-шном приложении, то прекрасно отрабатывает.
А вот когда я его вызываю в DLL, то на вызове CreateDispatch приложение зависает.
Пдскажите плз в чём проблема.
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний
Re: Зависание CreateDispatch в DLL
От: algol Россия about:blank
Дата: 26.09.05 21:52
Оценка:
Здравствуйте, 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.

Re[2]: Зависание CreateDispatch в DLL
От: tyomchick Россия  
Дата: 27.09.05 07:21
Оценка:
Здравствуйте, 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.


Программа продолжает виснуть.
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний
Re: Зависание CreateDispatch в DLL
От: Аноним  
Дата: 28.09.05 10:45
Оценка:
Здравствуйте, tyomchick, Вы писали:


T>Привет!

T>Господа, есть приблизно такой код:


T>
T>    COleDispatchDriver  ICry ;  
T>    if (CoInitialize(0) != S_OK) AfxMessageBox("Не инициализируется OLE!"); 
    
T>    if (!ICry.CreateDispatch(_T("ATS.CryptoUI"), NULL))
T>        AfxMessageBox("Не грузиться объект!");
T>


T>Так вот, когда он присутствует в Exe-шном приложении, то прекрасно отрабатывает.

T>А вот когда я его вызываю в DLL, то на вызове CreateDispatch приложение зависает.
T>Пдскажите плз в чём проблема.

В каком месте DLL расположен этот код?
Re[2]: Зависание CreateDispatch в DLL
От: tyomchick Россия  
Дата: 29.09.05 18:10
Оценка:
Здравствуйте, Аноним, Вы писали:


T>>
T>>    COleDispatchDriver  ICry ;  
T>>    if (CoInitialize(0) != S_OK) AfxMessageBox("Не инициализируется OLE!"); 
    
T>>    if (!ICry.CreateDispatch(_T("ATS.CryptoUI"), NULL))
T>>        AfxMessageBox("Не грузиться объект!");
T>>


А>В каком месте DLL расположен этот код?


В InitInstance.
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний
Re: Зависание CreateDispatch в DLL
От: ilmade Россия  
Дата: 20.09.07 15:02
Оценка:
Всем привет!

У меня примерно такая же проблема.

Вот фрагмент кода:


    AfxOleInit();
    // Create FineReaderForms object
    IFineFormApp formsApp;
    formsApp.CreateDispatch("FormReader.Application.6.5");
    // Initialize license
    formsApp.InitializeLicense( "Standard" );
    // Show main window
    formsApp.SetVisible( TRUE );


Объект formsApp не создается, когда вызываю CreateDispatch() в dll. Код расположен в InitInstance. Подскажите, пожалуйста, в чем проблема.
Спасибо!
Re[2]: Зависание CreateDispatch в DLL
От: bnk СССР http://unmanagedvisio.com/
Дата: 20.09.07 18:38
Оценка:
Здравствуйте, ilmade, Вы писали:

I>Всем привет!


I>У меня примерно такая же проблема.


I>Вот фрагмент кода:



I>
I>    AfxOleInit();
I>    // Create FineReaderForms object
I>    IFineFormApp formsApp;
I>    formsApp.CreateDispatch("FormReader.Application.6.5");
I>


I>Объект formsApp не создается, когда вызываю CreateDispatch() в dll. Код расположен в InitInstance. Подскажите, пожалуйста, в чем проблема.

I>Спасибо!

1. Возможно, для вашей DLL CoInitialize (AfxOleInit) уже была вызвана главной проргаммой (возможно с другими параметрами, например MTA). Если она уже была вызвана, вызывать AfxOleInit второй раз в DLL бессмысленно.

2. Если зайти отладчиком внутрь CreateDispatch — на чем конкретно виснет-то?

3. Попробуйте откомпилировать в Release. Это избавит от подозрений насчет AfxOleInitModule & MFCOxx.DLL

4. Попробуйте заменить COleDispatchDirver на CComDispatchDriver. Это избавит от подозрений на счет MFC.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.