Ошибка при вызове ocx.
От: Денис_К Россия  
Дата: 28.04.03 10:29
Оценка:
Возникла такая проблема:
Есть ocx, я его импортирую таким образом:


#import "..\lib\avimaker.ocx" no_namespace named_guids raw_dispinterfaces raw_native_types


Далее, я делаю так:

//В одном потоке
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);

//В другом потоке
MULTI_QI mq[2];
mq[0].hr = mq[1].hr = 0;
mq[0].pIID = &IID_IUnknown;
mq[1].pIID = &DIID__DAviMaker;
mq[0].pItf = mq[1].pItf = NULL;

HRESULT hr = CoCreateInstanceEx(CLSID_AviMaker, NULL, CLSCTX_ALL, NULL, 2, mq);
if((hr != 0) || (mq[0].hr != 0) || (mq[1].hr != 0) || (NULL == mq[0].pItf) || (NULL == mq[1].pItf))
{
m_sExecutionError = _bstr_t("CFragmentFileToProcess::ExecuteProcessing#1.1 CoCreateInstance failed: ") +
        _bstr_t(_com_error(hr).ErrorMessage());
return false;
}

m_pUnknwn = mq[0].pItf;
m_AMaker = (_DAviMaker*)mq[1].pItf;

hr = m_AMaker->raw_AboutBox();


hr в результате вызова AboutBox содержит E_UNEXPECTED.

С чем это может быть связано?
Денис.
Re: Ошибка при вызове ocx.
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 28.04.03 10:36
Оценка:
Здравствуйте, Денис_К, Вы писали:

[]

Вместо

Д_К>m_AMaker = (_DAviMaker*)mq[1].pItf;


Попробуй вызвать QueryInterface.
Re[2]: Ошибка при вызове ocx.
От: Денис_К Россия  
Дата: 28.04.03 10:41
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Попробуй вызвать QueryInterface.


Я пробовал.
m_pUnknwn->QueryInterface(DIID__DAviMaker, (void**)&m_AMaker);

Эффект тот же.

Я пробовал этот .ocx положить на формочку в VB и вызвать из проги на VB тот же AboutBox. Работает!
Денис.
Re: Ошибка при вызове ocx.
От: Tom Россия http://www.RSDN.ru
Дата: 28.04.03 11:57
Оценка:
ДК>С чем это может быть связано?
Например с тем, что CoInitializeEx(NULL, COINIT_MULTITHREADED) надо вызывать для каждого потока...
... << RSDN@Home 1.0 beta 6a >>
Народная мудрось
всем все никому ничего(с).
Re[2]: Ошибка при вызове ocx.
От: Денис_К Россия  
Дата: 28.04.03 12:15
Оценка:
Здравствуйте, Tom, Вы писали:

ДК>С чем это может быть связано?

Tom>Например с тем, что CoInitializeEx(NULL, COINIT_MULTITHREADED) надо вызывать для каждого потока...

Разве? Для COINIT_MULTITHREADED?

Я сейчас попробовал выполнить это из того же потока, где вызвал CoInitializeEx. Результат — прежний.

Также поизголялся в бейсике:

 Dim obj As AVIMAKERLib.AviMaker
 Set obj = CreateObject("AVIMAKER.AviMaker")
 Call obj.AboutBox


— не работает — на 2-й строке пишет ActiveX component can't create object


 Dim obj As AVIMAKERLib.AviMaker
 Set obj = new AVIMAKER.AviMaker
 Call obj.AboutBox

— работает.
Денис.
Re[3]: Ошибка при вызове ocx.
От: Tom Россия http://www.RSDN.ru
Дата: 28.04.03 12:34
Оценка:
Здравствуйте, Денис_К, Вы писали:

ДК>Здравствуйте, Tom, Вы писали:


ДК>>С чем это может быть связано?

Tom>>Например с тем, что CoInitializeEx(NULL, COINIT_MULTITHREADED) надо вызывать для каждого потока...

ДК>Разве? Для COINIT_MULTITHREADED?


Именно для каждого потока:
Initializes the COM library for use by the calling thread, sets the thread's concurrency model, and creates a new apartment for the thread if one is required.


ДК>Я сейчас попробовал выполнить это из того же потока, где вызвал CoInitializeEx. Результат — прежний.

ДК>Также поизголялся в бейсике:
ДК>
ДК> Dim obj As AVIMAKERLib.AviMaker
ДК> Set obj = CreateObject("AVIMAKER.AviMaker")
ДК> Call obj.AboutBox
ДК>

ДК> — не работает — на 2-й строке пишет ActiveX component can't create object
Это может быть потому, что указан не правильный ProgID. т.е строчка "AVIMAKER.AviMaker" неверна. Что бы найти правильный ProgID можно поискать его в реестре в ключе "HKEY_CLASSES_ROOT\твой прог айди"


ДК>

ДК>
ДК> Dim obj As AVIMAKERLib.AviMaker
ДК> Set obj = new AVIMAKER.AviMaker
ДК> Call obj.AboutBox
ДК>

ДК> — работает.
Потому что используется раннее связывание и обьект создаётся не по ProgID а по CLSID.


PS: Вообще то басик работает в STA аппартаменте, так что для чистоты эксперимента вызывай CoInitialize(0) (для каждого потока ессно в котором будешь работать с COM-ом.)
PPS: Для твоего случая нет необзходимости использовать CoCreateInstanceEx. Обычно эта функция используется для создания "удалённых" обьектов DCOM.
PPPS: Насколько я вижу твой обьект выставляет дисп интерфейс. Возможно в этом и проблемма. Попробуй вызвать свой AboutBox через IDispatch->Invoke
... << RSDN@Home 1.0 beta 6a >>
Народная мудрось
всем все никому ничего(с).
Re[4]: Ошибка при вызове ocx.
От: Денис_К Россия  
Дата: 28.04.03 15:59
Оценка:
Здравствуйте, Tom, Вы писали:

Написал вот так:

HRESULT hr = CoInitialize(NULL);

OLECHAR* s1 = new OLECHAR[100];
int nn = MultiByteToWideChar(CP_ACP, 0, "AVIMAKER.AviMakerCtrl.1", -1, s1, 100);
CLSID avimaker_cls;
hr = CLSIDFromProgID(s1, &avimaker_cls);

MULTI_QI mq[3];
mq[0].hr = mq[1].hr = 0;
mq[0].pIID = &IID_IUnknown;
mq[1].pIID = &IID_IDispatch;
    
mq[0].pItf = NULL;
mq[1].pItf = NULL;

hr = CoCreateInstanceEx(avimaker_cls, 
            NULL, 
            CLSCTX_INPROC_SERVER,
            NULL,
              2,
            mq);
if(hr != 0 || mq[0].hr != 0 || mq[1].hr != 0 || NULL == mq[0].pItf || NULL == mq[1].pItf)
{
_bstr_t m_sExecutionError = _bstr_t("CFragmentFileToProcess::ExecuteProcessing#1.1 CoCreateInstance failed: ") +
                            _bstr_t(_com_error(hr).ErrorMessage());
return;
}

IUnknown* pUnknwn = mq[0].pItf;
IDispatch* pDisp = (IDispatch*)mq[1].pItf;

nn = MultiByteToWideChar(CP_ACP, 0, "AboutBox", -1, s1, 100);
DISPID disp_id;
hr = pDisp->GetIDsOfNames(IID_NULL, (LPOLESTR*)&s1, 1, LOCALE_USER_DEFAULT, &disp_id);

DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
hr = pDisp->Invoke(    disp_id,
        IID_NULL,
        LOCALE_USER_DEFAULT,
        DISPATCH_METHOD,
        &dispparamsNoArgs,
        NULL,
        NULL,
        NULL);


Ну то есть приблизил условия к варианту на VB, насколько смог.
В результате — Invoke опять-таки возвращает E_UNEXPECTED.
Денис.
Re: Нет контейнера...
От: Vi2 Удмуртия http://www.adem.ru
Дата: 29.04.03 03:44
Оценка: 6 (1)
Здравствуйте, Денис_К, Вы писали:

Д_К>Есть ocx, я его импортирую таким образом:
Д_К>...
Д_К>hr в результате вызова AboutBox содержит E_UNEXPECTED.
Д_К>С чем это может быть связано?

Вполне может быть с тем, что это OCX, который отличается от обычного СОМ объекта тем, что может и не работать без установки контейнера. У меня мало опыта именно с ОСХ, но опыт Скриптов об этом говорит — без установки ***Site Скрипт просто не работает. И именно E_UNEXPECTED возвращает из всех методов.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Нет контейнера...
От: Денис_К Россия  
Дата: 30.04.03 11:42
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Вполне может быть с тем, что это OCX, который отличается от обычного СОМ объекта тем, что может и не работать без установки контейнера. У меня мало опыта именно с ОСХ, но опыт Скриптов об этом говорит — без установки ***Site Скрипт просто не работает. И именно E_UNEXPECTED возвращает из всех методов.


Похоже, дело действительно в этом. А можно ли как-то это обойти? Я хочу использовать этот OCX в виндовом сервисе.
Денис.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.