![]() |
|
|
![]()
|
|
| Zigrund |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
Здравствуйте. Только зарегился и сразу прешёл к делу.
На работе изчаю подключение com. Подключаю в длл. Всё замечательно работате при вызове моей тестовой простенькой исполнительной программой. Но когда мою длл вызывает основное наше приложение, где есть всякие оле сервера, то перестают вызываться функции кома. Никаких исключентй и ошибок не вылазит. Подобный случай был, так и не разобрались в чём дело. Мистика какая-то. Так подключаю. HRESULT hr = CoCreateInstance(CLSID_GeoDataUser, NULL, CLSCTX_LOCAL_SERVER, DIID_IGeoDataUser, (void**) &m_GeoDataUser ); m_GeoDataUser - интерфейс с которым работаю. Вообще вроде всё правильно. проверил на тысячу раз. И у меня же рабоатет. Не может быть ли там каких-нибудь пересечений с другими com объектами и оле серверами. Подскажите, как это вылечить? Я уже 3 день пытаюсь, и просто не понимаю в чём проблем. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Проверяйте свой COM сервер. В первую очередь работу с параметрами - не удалили ли вы где чего лишнего. И не запутались ли где с подсчетом ссылок. Не пытались ли где работать с BSTR как с wchar_t* и наоборот. И еще много чего.
Это не показатель. Ошибки в вашем COM сервере на игрушечной тестовой программе могли и не проявиться Давайте код, будем смотреть подробно |
|||
|
||||
| Zigrund |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
Пожалуйста: Это H
Это CPP
Добавлено @ 12:05 Вроде всё просто. Я конечно начинающий программист. Это сообщение отредактировал(а) Rrader - 4.3.2011, 17:15 |
||||
|
|||||
| Zigrund |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
В программе, в которой не работает касяк возникат тут: bool __fastcall THandleCityGuide::DrawCityGuide(Graphics::TBitmap *bmpCityGuide,int DeltaMapXCityGuide,int DeltaMapYCityGuide)
//m_GeoDataUser->SetScale(ZoomCityGuide,bmpCityGuide->Width / 2,bmpCityGuide->Height / 2); //m_GeoDataUser->SetScreenSize(bmpCityGuide->Width,bmpCityGuide->Height); m_GeoDataUser->SetScreenSize(500,500); //m_GeoDataUser->ShiftScreen(-DeltaMapXCityGuide,-DeltaMapYCityGuide); m_GeoDataUser->PathGif = WideString(PathImage); // путь удаляется и не усчтанавливается. m_GeoDataUser->set_PathGif(WideString(PathImage)); // путь удаляется и не усчтанавливается. //m_GeoDataUser->set_PathGif(L"C:\\Test1.bmp"); Application->MessageBox(AnsiString(m_GeoDataUser->PathGif).c_str(),0,0); m_GeoDataUser->Draw(); // а здесь ниччего не рисуется. Beep(1500,50); Application->MessageBox(AnsiString(m_GeoDataUser->get_PathGif()).c_str(),0,0); // тут ничего не вызывается Application->MessageBox(PathImage.c_str(),0,0); //bmpCityGuide->LoadFromFile(PathImage); bmpCityGuide->Canvas->Unlock(); StatuS = true; Beep(500,50); //Но никаких исключений нет. Но при этов когда сначала вызывалась функция: bool __fastcall THandleCityGuide::LoadMap(char *PathMap,double &N, double &W, double &S, double &E, double &zoom) всё было корректное. Проверял. Если после Draw вставить это: LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0,NULL); MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION ); То вернёт: "не удаётся найти указанный файл" Это сообщение отредактировал(а) Zigrund - 26.1.2011, 15:15 |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
А что лежит в PathImage? Может этого файла действительно нет (или он лежит не там). И что возвращает set_PathGif?
Еще, как описанна проперть PathGif ? Если как BSTR то присваивать ей напрямую WideString нельзя, может сломаться (а может и нет) И еще, GeoDataUser - ваше творение, или чье то стороннее? PS. Вот тут -
Добавлено через 4 минуты и 9 секунд
|
||||
|
|||||
| Zigrund |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
В PathGif хранится путь к файлу, с которым работате ком объект. Я сначала и вызываю мою функцию InitDll, там устанавливаю переменную, потом мою bool __fastcall THandleCityGuide::LoadMap, ТАм эта переенная есть и доступ к ней нормальной. А потом по ходу выполнения исполнительной программы в которой не работает, вызывается функция рисования, и в ней йже ничего не работате. Как буд-то доступ блакируется. Да, Вы совершенно правы, там одна лишняяя, просто я пытался всеми способами ееё установить. Но ничего не помогло. А при работе с моей exe и одной любой строки достатточно, а лучше там вообще не одной, потому, что я её установил до этого в InitDll. И с моим exe не теряется доступ. У меня подобная ситуация была. Тоже юзал функции CoInitialize(NULL); CoUninitialize(); У меня всё работало. При том код был проверен, а на другом не моём exe не работало. Я склоняюсь, что что-то не так с исполнителной программой. Что там такое может быть. Повторюсь, там используется какой-то оле сервер. Мог там программер ошибиться, что мой софтинка не работает. У меня -то всё предельно просто. Ничего не обноляется, просто кто-то мне доступ закрывает. Это сообщение отредактировал(а) Zigrund - 27.1.2011, 08:51 |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Это понятно. Я спрашивал что именно там лежит (т.е. значение). Путь к файлу абсолютный или относительный? Если второе, то будут проблемы если кто то изменит текущую директорию в работающей программе (к примеру она меняется банальным вызовом диалога выбора имени файла) Это вряд ли. Вряд ли он виноват (если он только не в конец кривой и косой |
|||
|
||||
| Zigrund |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
Абсолютный конечно. Нет, там всё железно. Почему спросил про блокируется, потому, что функции com вызываться перстают. Точно знаю. Писал оле сервак опытный программер конечно. но он его писал быстро, так как надо было срочно, и пару мест методом тыка мог сделать. как мне сказали. У меня код проще некуда. Всего пара строк. Сами видете. Я его Вам весь целеком скинул. Может подскажете какие-нибудь стандартные места, чтобы я попросил посмотреть, где обычно бывают ошибки: На С# вроде всё нормально работате в студии. А на Buildere C++, вот такой вот канфуз непонятный. А надо на нём впервую очередь. Это сообщение отредактировал(а) Zigrund - 27.1.2011, 14:15 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Увы, в коде вроде никакого криминала в глаза не бросается.
|
|||
|
||||
| Zigrund |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
Да, код совсем не сложный. Тогда, может из Вашего опыта подскажите, какие бывают типовые ошибки при использовании оле сервера, и мы их поищем в exe приложении в котором не работает. Спасибо за оказанную Вами помощь. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Самые частые это неправильное освобождение ресурсов (параметры освобождаются не там или не тогда, когда надо), и ошибки в подсчете ссылок (приводит к зависшим объектам или преждевременно удаленным объектам) Еще бывают всякие баги с multithread'ом (в основном это обычные баги, но есть и некоторые специфичные для COM) |
|||
|
||||
| Zigrund |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
Спасибо за совет. А посоветуйте, что-нибудь почитать, из серии "com для чайников". Это сообщение отредактировал(а) Zigrund - 28.1.2011, 14:07 |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 5 Всего: 118 |
Дейл Роджерсон - Inside Com. http://forum.vingrad.ru/forum/topic-63870.html
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| Zigrund |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
Спасибо. |
|||
|
||||
| Zigrund |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
Здравствуйте.
Вообще если подключать мои функции через синхронайз, то вроде работает всё. Но при этом появляются тормоза. Может есть ещё какой-нибудь пдобный способ, но пошустрее??? Подскажите пожалуйста) |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |