Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подключение Com через длл, в одном приложении работает в другом нет 
:(
    Опции темы
xvr
Дата 2.2.2011, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Zigrund @  2.2.2011,  13:42 Найти цитируемый пост)
Вообще если подключать мои функции через синхронайз, то вроде работает всё.

Ага. Проблемы с апартаментами COM  smile . При синхронайэ они вызываются в основной нити приложения, а без - в той нити, где стоял вызов синхронайз. По идее прямые вызовы (без синхронайз) должны были завершаться с ошибками (т.е. не работать).
Цитата(Zigrund @  2.2.2011,  13:42 Найти цитируемый пост)
Может есть ещё какой-нибудь пдобный способ, но пошустрее???

Вам нужно отмаршалить интерфейс в тот поток, где вы его собираетесь вызывать (CoMarshalInterThreadInterfaceInStream и CoGetInterfaceAndReleaseStream) и потом можно вызывать. Но учтите, вызовы COM объекта пойдут из разных потоков в параллель, он может быть к этому не готов  smile 


PM MAIL   Вверх
Zigrund
Дата 3.2.2011, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 26.1.2011

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



Цитата(xvr @ 2.2.2011,  22:30)
Цитата(Zigrund @  2.2.2011,  13:42 Найти цитируемый пост)
Вообще если подключать мои функции через синхронайз, то вроде работает всё.

Ага. Проблемы с апартаментами COM  smile . При синхронайэ они вызываются в основной нити приложения, а без - в той нити, где стоял вызов синхронайз. По идее прямые вызовы (без синхронайз) должны были завершаться с ошибками (т.е. не работать).
Цитата(Zigrund @  2.2.2011,  13:42 Найти цитируемый пост)
Может есть ещё какой-нибудь пдобный способ, но пошустрее???

Вам нужно отмаршалить интерфейс в тот поток, где вы его собираетесь вызывать (CoMarshalInterThreadInterfaceInStream и CoGetInterfaceAndReleaseStream) и потом можно вызывать. Но учтите, вызовы COM объекта пойдут из разных потоков в параллель, он может быть к этому не готов  smile

Спасибо. 
Буду пытаться разобраться.
А вот ещё немного не потеме.
Функция интерфейса принимает и возвращает VARIANT.
Как в него и из него сделать double[][] (двумерный массив даблов). 
PM MAIL   Вверх
xvr
Дата 3.2.2011, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Zigrund @  3.2.2011,  11:53 Найти цитируемый пост)
Функция интерфейса принимает и возвращает VARIANT.
Как в него и из него сделать double[][] (двумерный массив даблов).  

Сначала проверить, что в VARIANT лежит SafeArray (это массивы в понимании AX). Потом проверить, что он 2х мерный. Потом сделать требуемый 2х мерный массив double'ов и поэлементно скопировать из SafeArray'я в массив.
Если размеры массива известны заранее (и константны), то можно напрямую извлечь из SafeArray'я указатель на данные.

PM MAIL   Вверх
Zigrund
Дата 4.2.2011, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 26.1.2011

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



Цитата(xvr @ 3.2.2011,  15:16)
Цитата(Zigrund @  3.2.2011,  11:53 Найти цитируемый пост)
Функция интерфейса принимает и возвращает VARIANT.
Как в него и из него сделать double[][] (двумерный массив даблов).  

Сначала проверить, что в VARIANT лежит SafeArray (это массивы в понимании AX). Потом проверить, что он 2х мерный. Потом сделать требуемый 2х мерный массив double'ов и поэлементно скопировать из SafeArray'я в массив.
Если размеры массива известны заранее (и константны), то можно напрямую извлечь из SafeArray'я указатель на данные.

Вообщем там одномерный массив. 
В exe проекте всё работает а в длл опять как-то касяк. Ничего не возвращается. Передаётся вроде нормально. 
PM MAIL   Вверх
Zigrund
Дата 16.2.2011, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 26.1.2011

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



Всёмучаю свой ком объект.
проблема с высвыбождением памяти:

Код

if(m_GeoDataUser)
        {
            IDispatch *i_dispatch = m_GeoDataUser->GetCoordinateConverter();
            if(i_dispatch)
            {
                i_dispatch->QueryInterface(DIID_ICoordinateConverter,(void**)&icc);
                i_dispatch->Release();
            }
            if(icc)
            {
                int NewNumberElements =  2 * NumberElements - 1;
                Variant GeoArrayOut;
                Variant GeoArrayIn(OPENARRAY(int, (0, NewNumberElements)), varDouble);
                TempOdnomerMass = (double*) GeoArrayIn.ArrayLock();
                for(int i = 0; i < NumberElements ; i++)
                {
                    TempOdnomerMass[2 * i] =  Track[i][1] * PiDel180;
                    TempOdnomerMass[2 * i + 1] =  Track[i][0] * PiDel180;
                }
                GeoArrayIn.ArrayUnlock();
                GeoArrayOut = icc->GeoToScreenArray(GeoArrayIn);
                OutXY = (double*) GeoArrayOut.ArrayLock();
                for(int i = 0; i < NumberElements; i ++)
                {
                    Track[i][0] = OutXY[2 * i];
                    Track[i][1] = OutXY[2 * i + 1];
                }
                GeoArrayOut.ArrayUnlock();
                                                        VariantClear(GeoArrayOut);
                VariantClear(GeoArrayIn);
                icc->Release();
                StatuS = true;
            }
        }




Всё нормально работает, кроме этого кусочка (как раз, где обращени к ком объекту идёт):

Код

                                                        GeoArrayOut = icc->GeoToScreenArray(GeoArrayIn);
                OutXY = (double*) GeoArrayOut.ArrayLock();
                for(int i = 0; i < NumberElements; i ++)
                {
                    Track[i][0] = OutXY[2 * i];
                    Track[i][1] = OutXY[2 * i + 1];
                }
                GeoArrayOut.ArrayUnlock();
                                                        VariantClear(GeoArrayOut);


При каждои запуске где-то 1MB памяти куда-то неизвестно уходит. В чём может быть проблема?

Это сообщение отредактировал(а) Rrader - 4.3.2011, 17:16
PM MAIL   Вверх
xvr
Дата 16.2.2011, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Криминала не видно. Видимо проблема где то в другом месте

PM MAIL   Вверх
Zigrund
Дата 17.2.2011, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 26.1.2011

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



Цитата(xvr @ 16.2.2011,  19:13)
Криминала не видно. Видимо проблема где то в другом месте

А у меня это единственное место, где я вариант использую.
Может его как-то надо удалять особенным образом?
PM MAIL   Вверх
xvr
Дата 17.2.2011, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Zigrund @  17.2.2011,  11:14 Найти цитируемый пост)
Может его как-то надо удалять особенным образом? 

Нет. Variant должен удаляться сам (это VCL врапер над VARIANT'ом)


PM MAIL   Вверх
Zigrund
Дата 1.3.2011, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 26.1.2011

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



Цитата(xvr @ 17.2.2011,  15:57)
Цитата(Zigrund @  17.2.2011,  11:14 Найти цитируемый пост)
Может его как-то надо удалять особенным образом? 

Нет. Variant должен удаляться сам (это VCL врапер над VARIANT'ом)

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


 




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


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

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