Вызов CreateDispatch из dll дает m_lpDispatch как NULL

У меня есть программа, в которой я вызываю exe из COleDispatchDriver. Это дает указатель m_lpDispatch как NULL. Я вызываю это из dll из основного исполняемого файла. Я добавил CoInitialize(NULL)/CoUninitialize() в начало и конец кода. Но все равно exe не появляется.

Совместная инициализация (НУЛЬ);

matProp = IMatProp();
matProp.CreateDispatch(_T("MatProp.Document"));
matProp.Initialize();
matProp.ShowApplication( SW_SHOW );
CoUninitialize();

IMatProp — это созданный машиной класс-оболочка IDispatch, который является подклассом класса ColeDispatchDriver. И ниже приведены методы этого класса.

длинный IMatProp::Initialize() {

long result;
InvokeHelper(0x1, DISPATCH_METHOD, VT_I4, (void*)&result, NULL);
return result;

}

длинный IMatProp::ShowApplication(длинное шоу) {

long result;
static BYTE parms[] =
    VTS_I4;
InvokeHelper(0x2, DISPATCH_METHOD, VT_I4, (void*)&result, parms,
    show);
return result;

}

Это отлично работало при вызове из exe, но при вызове из dll выдавало эту проблему. Пожалуйста помогите. Большое спасибо.


person gishara    schedule 16.08.2012    source источник
comment
Кроме того, почему бы вам не написать один отличный вопрос вместо публикации фрагментов вашей проблемы - я вижу это начало.   -  person Roman R.    schedule 16.08.2012
comment
Привет Роман, я отредактировал задачу, чтобы показать код. Извините, что не задал сразу весь вопрос.   -  person gishara    schedule 16.08.2012
comment
Все указанные методы возвращают статус выполнения, вы это проверяете? Если да, то какой код ошибки. Если CreateDispatch дает сбой, войдите в отладчик и посмотрите, где именно происходит сбой внутри, и что такое HRESULT код.   -  person Roman R.    schedule 16.08.2012
comment
CreateDispatch не работает, так как указатель m_lpDispatch имеет значение null. Мне пришлось вручную зарегистрировать exe с помощью командной строки с помощью MatProp.exe/RegServer. Я работаю в Windows 7. Можете ли вы объяснить мне, что не так?   -  person gishara    schedule 16.08.2012
comment
Вы не знаете, почему этот код дает сбой, потому что вы вообще не проверяете ошибки. Сначала вам нужно исправить это.   -  person Hans Passant    schedule 16.08.2012
comment
Я думал, что понял ошибку. exe не регистрируется, даже если я запускаю его один раз вручную. Потому что добавление его с помощью cmd решило ошибку. Я ошибаюсь? Спасибо.   -  person gishara    schedule 17.08.2012


Ответы (1)


Вероятно, вам нужно инициализировать OLE, а не просто COM. Попробуйте вместо этого использовать OleInitialize() и OleUninitialize().

Приложения MFC могут управлять этим с помощью вызова AfxOleInit() во время CMFCApp::InitInstance(), но вам придется позаботиться об этом самостоятельно, если вы используете несколько потоков.

person snowdude    schedule 16.08.2012
comment
спасибо, Snowdude, но он выдал отладочное утверждение как ASSERT(!pState-›m_bNeedTerm); // вызов дважды? в олеинит.cpp. - person gishara; 16.08.2012
comment
Вы вызываете AfxOleInit в том же потоке, в котором вы запускаете свой COM-код? - person snowdude; 16.08.2012
comment
да, поправьте меня, если я ошибаюсь, я новичок в этих COM-объектах. Большое спасибо. - person gishara; 17.08.2012
comment
В CreateDispatch передайте указатель на объект COleException, чтобы перехватить фактический код ошибки. Когда вы это сделаете, каково значение COleException::m_sc? - person snowdude; 17.08.2012