Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
ВнизПотоки в ActiveX (OCX) Найти похожие ветки
← →
MikePetrichenko © (2006-11-15 23:38) [0]Доброго времени суток!
Вот и мое время пришло стать вопрошающим.
Вопрос собственно прост. Имеется ActiveX. Этот ActiveX подгружает DLL (мою), которая подгружает еще одну DLL (производства тертьей фирмы). Моя является переходником, так как иного способа достучаться до исходной DLL нет.
Так вот проблема: в DLL (последней) создается поток и определнным (каким только богу известно) способом ожидается его завершение. Но ActiveX виснет на мертво и вываливается с жуткой ошибкой. Если эту DLL пользовать в VCL то все ОК.
Такая же проблема наблюдается и при создании потоков в самом ActiveX и используется метод Synchronize.
Потоковая модель Apartment (иначе VB сильно колбасит с другой моделью).
Есть у кого идеи по решению проблемы.
P.S. Жутко извиняюсь за много букв.
← →
MikePetrichenko © (2006-11-16 00:05) [1]Блин. Пойду убью кого-нибудь и съем.
Второй вопрос. Есть ли шанс заставить VB и VC (6) использовать ActiveX с потоковой модлью Free или Both?
← →
MikePetrichenko © (2006-11-16 01:19) [2]Ау! Тут ктонить про ActiveX слышал? :)
Ну хоть в гугль пошлите. Уж стреляться в пору, но не хочет оно работать...
← →
sniknik © (2006-11-16 01:38) [3]зачем в гугль? поближе, почитать ошибку, и попробовать понять о чем она...
> при создании потоков в самом ActiveX и используется метод Synchronize.
с чем синхронизируешся? основной поток с выборкой сообщений есть?
← →
MikePetrichenko © (2006-11-16 01:42) [4]
> поближе, почитать ошибку, и попробовать понять о чем она.
> ..
Ошибка.. AV at address $xxxxx. Абсолютно ни очем не говорит.
> с чем синхронизируешся? основной поток с выборкой сообщений
> есть?
И не одним :)
← →
MikePetrichenko © (2006-11-16 01:47) [5]
> попробовать понять о чем она...
Да. В догонку. Чтобы ложных представлений не создавать..
И так. Имеется WidCOMM API. Сие API представляет из себя:
1. DLL, которая ставится вместе с WidComm Bluetooth Stack.
2. LIB + Headers для разработки приложений на VC под WidComm. Причем сия DLL (см. п. 1) экпортирует класс. (Ну это же С, как без этого). Для DLL имеется LIB. Которая статически линкуентся в exe. LIB содердит классы - обертки над классом в DLL (что там в DLL только гадать, да и в LIB тоже не понятно).
3. Для ухода от статической линковки (ну нельзя мне чтобы эта DLL статически линковалась) была создана DLL переходник между Delphi (читай VCL) и WidComm API LIB.
Так вот. При загрузке сеей DLL вызывается функция инициализации WidCOMM API. Если я эту фнукцию вызываю из VCL то все ОК. Но как только функция вызывается из ActiveX (OCX), то она виснет намертво. Исследования показали что там заводится поток какой-то. А дальше фиг его знает что происходит.
← →
sniknik © (2006-11-16 01:51) [6]> Ошибка.. AV at address $xxxxx. Абсолютно ни очем не говорит.
очень даже говорит. обращение к чему то несозданному, с указанием адреса где... при желании и удаче вплоть до строки покажет (Find Error).
чегото ты не создал... чтото, что в VCL, раз там работает, делается автоматом. например инициализация COM (CoInitialize).
← →
MikePetrichenko © (2006-11-16 01:54) [7]
> очень даже говорит. обращение к чему то несозданному, с
> указанием адреса где... при желании и удаче вплоть до строки
> покажет (Find Error).
>
> чегото ты не создал... чтото, что в VCL, раз там работает,
> делается автоматом. например инициализация COM (CoInitialize).
>
Тьфу. Какой в баню строки, если AV вываливается в WidCOM API DLL.
VCL версия, а не ActiveX в VCL.
http://www.btframework.com
Есть две версии ActiveX и VCL.
VCL версия работает отлично, ActiveX вот с такими заворотами.
← →
MikePetrichenko © (2006-11-16 01:57) [8]Да. И еще в догонку. Код библиотек ОДИНАКОВ. Т. е. ActiveX - обертка над VCL версией. Инициализация происходит в секции initialization....
Упс. По-моему нашел ошику. Вопрос в какой последовательности эти секции инициализации вызываются.....
← →
sniknik © (2006-11-16 02:10) [9]> Инициализация происходит в секции initialization....
> Вопрос в какой последовательности эти секции инициализации вызываются.....
тогда уж и, что в нем инициализируется/создается(поток?), и сколько обращений(копий обьектов) к библиотеке ActiveX ожидается, т.к. инициализация произойдет 1 раз, а копий будет к примеру десять, они все за тот один поток и передерутся, если там есть конечно какаято связь/взаимодействие между ними (а зачем еще Synchronize. явно есть).
← →
MikePetrichenko © (2006-11-16 02:19) [10]
> (копий обьектов) к библиотеке ActiveX ожидается
Я же написал: потоковая модель Apartment!
← →
MikePetrichenko © (2006-11-16 02:51) [11]И так. Перефразирую вопрос.
Имеется:
WidCommAPIDLL (черный ящик, есть только описание либы) -- LIB(C++)+DLL(переходник писанный мною) -- VCL компоненты (писано мною)
При загрузке VCL в секции инициализации выполняется (кратко):
1. Проверка наличия WidCommAPIDLL
2. Если есть, загрузка моей DLL.
3. Если п.2 ОК, получение указателей на нужные мне функции.
4. Все функции ОК, то вызов функции инициализации моей DLL (где инициализируется WidCommDLL).
5. Вызов функции инициализации Bluetooth стека из моей DLL который просто переадресовывается в соответствющую функцию WidCommDLLAPI
6. Вызов функии проверки инициализации стека (аналогично п. 5).
Так вот. При работе в VCL версии сие работает отлично.
Если же компилится ActiveX то виснем на п 6.
По моим наблюдениям п. 6. создает какой-то поток.
Отсюда вопрос про потоки в ActiveX с потоковой моделью Apartment, так как с Free все вроде работает.
Но Free не понимается VB и VC.
Отсюда вопрос про Free в данных средах.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c