Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / FLL & COM DLL / 4 сообщений из 4, страница 1 из 1
26.05.2004, 12:26
    #32534245
ноль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FLL & COM DLL
Создаю COM DLL VFP. Для примера:
С таким кодом компоненты вызов obj = CREATEOBJECT("comdll.Test") работает
Код: plaintext
1.
2.
3.
4.
5.
DEFINE CLASS Test as Session Olepublic
LOCAL pDispatch as Integer
PROCEDURE RunTest(bstr_str as string)
MESSAGEBOX(bstr_str, 32 ,"Тест выполнения")
ENDPROC
ENDDEFINE
А если собрать с таким кодом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DEFINE CLASS Test as Session Olepublic
PROCEDURE Init
LOCAL pDispatch as Integer
SET LIBRARY TO flib2.fll  additive
pDispatch =  SYS( 3095 ,this)
= RunComVFP(pDispatch) <-RunComVFP  выполняет RunTest, параметры не важны
EndPRoc
PROCEDURE RunTest(bstr_str as string)
MESSAGEBOX(bstr_str, 32 ,"Тест выполнения")
ENDPROC
ENDDEFINE
то obj = CREATEOBJECT("comdll.Test")
Выдает сообщение о том, что произошла неопознанная ошибка.
flib2.fll - рабочая.
В чем может быть дело ?
...
Рейтинг: 0 / 0
26.05.2004, 13:03
    #32534370
ноль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FLL & COM DLL
1 . pDispatch =SYS(3095,this) в коде 2 в методе инит принимает значение 0,
по идее-то она должна вернуть указатель на Dispatch контрола.
2. При вызове:
obj = CREATEOBJECT("comdll.Test")
? SYS(3095,obj) возвращает его IDispatch *.
Тогда как получить IDispatch * моего контрола после его создания в самом
методе моего контрола а не из вне ?
...
Рейтинг: 0 / 0
26.05.2004, 13:45
    #32534541
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FLL & COM DLL
Боюсь, что ничего не получится. В контекте com dll объекта _Vfp не существует :((. Можно организовать внутри класса некий интерфейс и передавать на него ссылку. Но только не this. Почитайте еще про соответсвующие SYS()
...
Рейтинг: 0 / 0
26.05.2004, 14:20
    #32534656
ноль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FLL & COM DLL
То Crip:
Ага, это я понял, но ведь IDispatch объекта com dll vfp можно получить извне.
Создать свойсво у компоненты и запихнуть объекту в его же свойсво, примерно так:
obj = CREATEOBJECT("comdll.Test")
obj.pDisp = SYS(3095,obj)
Я это попробовал, значение указателя IDispatch дейсвительно формируется,
но тот метод, который мне нужно дернуть валит приложение, а при попытке
заюзать СOM как EXE зависает. Что странно. Метод сделал пустым, параметров у него нет. Из FLL дергаю так :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void FAR RunComVFP(ParamBlk FAR *parm) 
{
           using namespace VFPLib;
            IDispatch*  _vfpptr = (IDispatch*)p( 0 ).ev_long ;
            CoInitialize( 0 ); 
	ItestPtr pmyclassvfp = (ItestPtr)_vfpptr;
	_variant_t vresult;                   
   	vresult = pmyclassvfp->RunTest();
	pmyclassvfp->Release();
            CoUninitialize(); 
	return;
}
ItestPtr -из VFPLib и он видит функции объекта, естесно typelib взял которую фокс создал при сборке компоненты.

Вызываю так : RunComVFP(this.pDisp) this.pDisp - присвоил перед вызовом.
И ничего. Либо приложение отрубается , ecли компонента лежит в DLL , либо
зависает , если лежит в EXE.
Такой же код, выполняет DoCmd для _vfp, естесно в несколько другой реализации. Что странно при использовании COM EXE, при попоытке снять VFP ругается что мол процесс ее занял и она может только переключится на его выполнение , а снятся, только через диспетчер.
И как это добро бороть ?
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / FLL & COM DLL / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]