Поиск:

Ответ в темуСоздание новой темы Создание опроса
> IDispatch, Управление интерфейсом 
:(
    Опции темы
Andrey44
  Дата 27.2.2009, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



По-порядку:
У меня есть длл в котором есть СОМ объект.
Для создания объекта в длл есть функция CreateObject(IGadget** gadget, HINSTANCE hinst),
которую я нахожу через GetProcAddres(*), и вызываю ее для создания СОМ объекта.
Код

IDispatchPtr dispPtr;
CreateObject(&dispPtr, GetModuleHandle(0));

Объект создается все прекрасно работает, но у IGadget есть еще некоторые свои методы, например ShowObject(bool show)
Так вот, проблема в том, как эти функции вызывать?
Я знаю что у IDispatch есть метод Invoke, но его применить у меня не получается.
Если можно примерчик с Invoke, или хотя-бы расскажите как сделать.
Спасибо.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
xvr
Дата 27.2.2009, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Код


DISPID did;
wchar_t* nm=L"ShowObject"; 
DISPPARAMS params;

dispPtr->GetIDsOfNames(IID_NULL,&nm,1, LOCALE_SYSTEM_DEFAULT,&did);

VARIANT show;

VariantInit(&show);
show.vt=VT_BOOL;
show.boolVal = how2show?VARIANT_TRUE:VARIANT_FALSE;

params.rgvarg = &show;
params.rgdispidNamedArgs=NULL;
params.cArgs = 1;
params.cNamedArgs = 0;

dispPtr->Invoke(did,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&params,NULL,NULL,NULL);

PM MAIL   Вверх
Andrey44
Дата 27.2.2009, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



xvr, спасибо, дома попробую, в понедельник отпишусь smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Andrey44
Дата 2.3.2009, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Не пойму в чем проблема, программа падает при вызове
Код

dispPtr->GetIDsOfNames(IID_NULL,&nm,1, LOCALE_SYSTEM_DEFAULT,&did);

Access violation !!! Хотя указатель dispPtr живой и валидный, а посмотреть кто падает не знаю как. smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
xvr
Дата 2.3.2009, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(Andrey44 @ 2.3.2009,  07:56)
Не пойму в чем проблема, программа падает при вызове
Код

dispPtr->GetIDsOfNames(IID_NULL,&nm,1, LOCALE_SYSTEM_DEFAULT,&did);

Access violation !!! Хотя указатель dispPtr живой и валидный, а посмотреть кто падает не знаю как. smile

Может объект надо создавать через стандартные средства COM/ActiveX, а не дергая напрямую функцию из dll. Если созданный объект пользуется сервисами COM, то может и упасть.

PM MAIL   Вверх
Rififi
Дата 3.3.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



Andrey44
Так вот, проблема в том, как эти функции вызывать?
QueryInterface уже не по-пацански?

PM MAIL   Вверх
Andrey44
Дата 3.3.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Rififi, Как я могу вызвать QueryInterface когда у меня не хедера и я не знаю как интерфейс называется.
Я знаю что у него есть некоторые методы и все

Добавлено через 8 минут и 32 секунды
Цитата(xvr @  2.3.2009,  10:34 Найти цитируемый пост)
Может объект надо создавать через стандартные средства COM/ActiveX, а не дергая напрямую функцию из dll. Если созданный объект пользуется сервисами COM, то может и упасть.

Этот объект даже не зарегистрирован в системе. И он не пользуется сервисами COM.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Rififi
Дата 3.3.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



Andrey44
что там, даже библиотеки типов нет?
PM MAIL   Вверх
xvr
Дата 3.3.2009, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(Andrey44 @ 3.3.2009,  16:07)
Rififi, Как я могу вызвать QueryInterface когда у меня не хедера и я не знаю как интерфейс называется.
Я знаю что у него есть некоторые методы и все

Добавлено @ 16:15
Цитата(xvr @  2.3.2009,  10:34 Найти цитируемый пост)
Может объект надо создавать через стандартные средства COM/ActiveX, а не дергая напрямую функцию из dll. Если созданный объект пользуется сервисами COM, то может и упасть.

Этот объект даже не зарегистрирован в системе. И он не пользуется сервисами COM.

Может он не IDispatch, или вообще не COM объект? Хоть что то о нем известно?


PM MAIL   Вверх
Andrey44
Дата 4.3.2009, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Цитата(Andrey44 @  27.2.2009,  08:15 Найти цитируемый пост)
Для создания объекта в длл есть функция CreateObject(IGadget** gadget, HINSTANCE hinst),
которую я нахожу через GetProcAddres(*), и вызываю ее для создания СОМ объекта.
Код

IDispatchPtr dispPtr;
CreateObject(&dispPtr, GetModuleHandle(0));


Объект создается все прекрасно работает, но у IGadget есть еще некоторые свои методы, например ShowObject(bool show)



Как я и писал, он(объект) создается и я его вижу, он работает так как надо, НО Я ХОЧУ ИМ УПРАВЛЯТЬ!!!
Известно, что он пронаследован от IUnknown и что он прекрасно работает когда создан.
Известно 
Код

ShowObject(bool show);
SetPosObject(int x, int y);

Вот и все что о нем можно сказать.





--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
xvr
Дата 4.3.2009, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(Andrey44 @ 4.3.2009,  07:56)
Код

IDispatchPtr dispPtr;
CreateObject(&dispPtr, GetModuleHandle(0));


Как я и писал, он(объект) создается и я его вижу, он работает так как надо, НО Я ХОЧУ ИМ УПРАВЛЯТЬ!!!
Известно, что он пронаследован от IUnknown и что он прекрасно работает когда создан.

Так от IDispatch или от IUnknown? Это две большие разницы! Их методы вызываются ПРИНЦИПИАЛЬНО разным способом. От IDispatch можно звать, как я писал, от IUnknown их нужно звать напрямую. Во втором случае без дополнительной информации не обойтись - сам объект такой информации не содержит  smile 
PS. Можешь сюда dll кинуть?
PM MAIL   Вверх
Andrey44
Дата 4.3.2009, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Цитата(xvr @  4.3.2009,  09:08 Найти цитируемый пост)
Так от IDispatch или от IUnknown?

100% от IUnknown
Цитата(xvr @  4.3.2009,  09:08 Найти цитируемый пост)
PS. Можешь сюда dll кинуть? 

Могу конечно, но только завтра утром. Нет сейчас с собой.

xvr, Спасибо большое что помогаешь smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Andrey44
Дата 5.3.2009, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



И еще, очень странно! Дома работает вызов функции 
Код

HMODULE hLib = LoadLibrary(_T("AnyClock.dll"));
static IDispatchPtr dispPtr;

void (*pfnMy)(void**, HINSTANCE) = (void(*)(void**, HINSTANCE))GetProcAddress(hLib, "CreateGadget");

int _tmain(int argc, _TCHAR* argv[])
{
    pfnMy((void**)&dispPtr, GetModuleHandle(0));
    return 0;
}

А на работе отказывается работать. Объект не создается и все падает при вызове функции pfnMy((void**)&dispPtr, GetModuleHandle(0));
Хотя дома и на работе Виста стоит. Кстати это должно работать только под Вистой, не меньше.
Я уже запутался, почему так?

Добавлено через 2 минуты и 10 секунд
Забыл, вот дллка

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  dllAnyClock.rar 522,67 Kb


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
xvr
Дата 5.3.2009, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(Andrey44 @ 5.3.2009,  08:25)
И еще, очень странно! Дома работает вызов функции 
Код

HMODULE hLib = LoadLibrary(_T("AnyClock.dll"));
static IDispatchPtr dispPtr;

void (*pfnMy)(void**, HINSTANCE) = (void(*)(void**, HINSTANCE))GetProcAddress(hLib, "CreateGadget");

int _tmain(int argc, _TCHAR* argv[])
{
    pfnMy((void**)&dispPtr, GetModuleHandle(0));
    return 0;
}

А на работе отказывается работать. Объект не создается и все падает при вызове функции pfnMy((void**)&dispPtr, GetModuleHandle(0));
Хотя дома и на работе Виста стоит. 

Может библиотек не хватает? Оно использует:
Цитата

    GDI32.dll
    MSVCR90.dll
    gdiplus.dll
    dwmapi.dll
    COMCTL32.dll
и пачку стандартных

Цитата

Забыл, вот дллка
дллку посмотрел, typelib'а увы нет, но судя по наличию DllRegisterServer и пр. она вполне нормальный COM сервер. Можно ее зарегистрировать и посмотреть, что она пропишет в реестр. По поводу объекта - или искать хидер, или IDA в руки и потрошить dll  smile 

PM MAIL   Вверх
Andrey44
Дата 5.3.2009, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



xvr, Спасибо, что-то буду думать. smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0952 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.