Ошибка выполнения функции в потоке
От: Flex2 Россия  
Дата: 28.01.04 14:24
Оценка:
Как бы так предистория.
Пишу библу раcширения функциq системы VFP. Фактически это та же DLL , только
с механизмом вызова функций заточенным под VFP и написанными функциями для обмена данными с VFP и коего чего специализированного.
Параметры из проги в функцию передаются хитрым образом , через структуру ParamBlk. Не будем вдаваться в подробности, главное что параметры достоверно поступают в вызываемую функцию и ини именно те самые.
Нижеприведенный код, это код функции запуска потока, в качетве параметра ей передается ссылка на объект. И он передается.
Есть функция , _SetObjectProperty, она устанавливает свойство указанного объекта в значение котрое завели в структуру типа Value.
Вот прототип:
int _SetObjectProperty(Value FAR *objct, char FAR *prop, Value FAR *val, int fAdd)
objct — объект
prop — свойство
val — значение
fAdd — признак создания свойсва если оно отсутсвует

Трабл в том что из функции биюлиотеки которую вызвали из VFP, _SetObjectProperty работает, а вот в потоке , куда передали значение структуры содержащей объект не работает и вызывает неисправимую ошибку. В чем грабли ?

void StartHookEvents(ParamBlk FAR *parm)
{
#define p0 (parm->p[0].val)
unsigned int uThrID;
HANDLE hThr;
char ident;
Value pRval;

pRval.ev_type = 'I';
pRval.ev_long = 10;
_SetObjectProperty(&p0,"TOP",&pRval,0); // тут выполняется, устанавливает свойство переданного объекта (формы) TOP в 10.

hThr = CreateThread(NULL,0,NotyfyEvents,(LPVOID)(&parm->p[0].val),0,&uThrID);
_RetInt (0.10);
}



А вот потоковая функция(тестовая):
DWORD WINAPI NotyfyEvents(LPVOID FAR pParams)
{
Value *pTval = (Value *)pParams; // Получили объект
Value pRval;

pRval.ev_type = 'I'; // Создали то что хотим присвоить
pRval.ev_long = 10; // cвойству

_SetObjectProperty(pTval,"TOP",&pRval,0); // Тут ошибка при выполнении
...
...
...
}

Компилится и линкуется намана.
Поможите ?

28.01.04 17:38: Перенесено модератором из 'C/C++' — ПК
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.