On-line: PSP, гостей 0. Всего: 1 [подробнее..]
АвторСообщение
Администратор




Пост N: 1168
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 17.06.09 14:14. Заголовок: vm


Подскажите, правильно ли я делаю ? Надо на С вызвать harbour-функцию с передачей параметров:

myFunc(p1, p2,, p3)

вызываю:

hb_vmPushSymbol (hb_dynsymGetSymbol ("MYFUNC"));
hb_vmPush(p1);
hb_vmPush(p2);
hb_vmPushNil();
hb_vmPush(p3);
hb_vmDo( 3 );


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 9 [только новые]


модератор




Пост N: 1015
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 17.06.09 14:27. Заголовок: Pasha пишет: Подска..


Pasha пишет:

 цитата:
Подскажите, правильно ли я делаю ?


Сравни с этим вызовом для обработки очереди сообщений:


 цитата:
pSymbolEvents = hb_dynsymSymbol( hb_dynsymGet("MYFUNC") );

if( pSymbolEvents )
{
hb_vmPushSymbol( pSymbolEvents );
hb_vmPushNil();
hb_vmPushLong( (LONG) hWnd );
hb_vmPushLong( message );
hb_vmPushLong( wParam );
hb_vmPushLong( lParam );
hb_vmDo( 4 );
}



Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 1169
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 17.06.09 14:33. Заголовок: hWnd - это 1-й парам..


hWnd - это 1-й параметр ?

т.е, в моем случае надо:

hb_vmPushSymbol (hb_dynsymGetSymbol ("MYFUNC"));
hb_vmPushNil();
hb_vmPush(p1);
hb_vmPush(p2);
hb_vmPushNil();
hb_vmPush(p3);
hb_vmDo( 4 );

?

Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 1016
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 17.06.09 14:57. Заголовок: Pasha пишет: т.е, в..


Pasha пишет:

 цитата:
т.е, в моем случае надо:

hb_vmPushSymbol (hb_dynsymGetSymbol ("MYFUNC"));
hb_vmPushNil();
hb_vmPush(p1);
hb_vmPush(p2);
hb_vmPushNil();
hb_vmPush(p3);
hb_vmDo( 4 );

?


По-видимому, так

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 693
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 17.06.09 16:45. Заголовок: Я б на вашем месте ..


Я б на вашем месте написал

pSymbolEvents = hb_dynsymFindName( "MYFUNC" );
if( pSymbolEvents )
{
hb_vmPushSymbol( pSymbolEvents );
hb_vmPushNil();
hb_vmPush(p1);
hb_vmPush(p2);
hb_vmPushNil();
hb_vmPush(p3);
hb_vmDo( 4 );
}

чтобы избежать граблей если MYFUNC не определена.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 1171
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 18.06.09 15:44. Заголовок: Петр пишет: чтобы и..


Петр пишет:

 цитата:
чтобы избежать граблей если MYFUNC не определена.



Эти функции у меня в одном модуле, так что символ будет существовать

Еще вопрос.

Если я из C-функции вызываю блок кода вида {|| cStr}, который получаю в виде параметра

PHB_ITEM p2 = hb_vmEvalBlock( hb_param( 1, HB_IT_BLOCK ) );

то надо ли делать в конце

hb_itemClear(p2);
и
hb_itemRelease(p2);

?


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 694
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 18.06.09 16:36. Заголовок: Pasha пишет: hb_ite..


Pasha пишет:

 цитата:
hb_itemClear(p2);



Не нужно - эта функция используется преимущественно при повторном использовании структуры
PHB_ITEM, например в цикле.


 цитата:
hb_itemRelease(p2)



Вроде бы нет, 100% не уверен

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 697
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 18.06.09 17:20. Заголовок: Петр пишет: Вроде б..


Петр пишет:

 цитата:
Вроде бы нет, 100% не уверен


Уверен - не нужно

 цитата:
ABNORMAL TERMINATION



Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 1173
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.06.09 08:34. Заголовок: Я тут сам столкнулся..


Я тут сам столкнулся с вмешательством мистических сил в работу функций rdd :-) и теперь копаю свой код с целью изгнания нечистой силы
Ситуация такая

Обьявление переменных:

PHB_ITEM pIndExp = hb_param( 2, HB_IT_ANY );
PHB_ITEM puIndExp = NULL;
PHB_ITEM pxIndExp1 = NULL;
PHB_ITEM pxIndExp2 = NULL;

заполнение значений:

if( HB_IS_BLOCK( pIndExp ) )
{
puIndExp = hb_vmEvalBlock( pIndExp );
}
else
puIndExp = pIndExp;
if( ! HB_IS_ARRAY( puIndExp ) )
{
pxIndExp1 = pxIndExp2 = puIndExp;
}
else if( hb_arrayLen( puIndExp ) >= 2 )
{
pxIndExp1 = hb_arrayGetItemPtr( puIndExp, 1 );
pxIndExp2 = hb_arrayGetItemPtr( puIndExp, 2 );
}


Функция в качестве 2-го параметра получает блок кода, который возвращает строку
далее в цикле вызываю

SELF_SKIP( pArea, -1);

и неожиданно обнаруживаю, что hb_itemGetCPtr(pxIndExp1) до вызова SELF_SKIP и после (ставлю отладочный вывод) имеет разное значение !
Причем значение pxIndExp1 (проверяю pointer) - не изменилось
Т.е, после вызова pxIndExp1 в этом ITEM записано текущее значение OrdKeyVal после отработки skip(-1)
Причем такая ситуация возникает не в каждом вызове моей функции на выполнение, а только на "надцатый раз", и по этой причине краткий пример я привести не могу


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 1174
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.06.09 10:55. Заголовок: Я тут обнаружил, что..


Я тут обнаружил, что dbSkip() иногда возвращает значение, отличное от nil: а именно - OrdKeyVal
Записывает он его по-видимому в hb_stackReturnItem()
Туда же записывает свой результат hb_vmEvalBlock, и происходит накладка.

Поэтому я заменил:

puIndExp = hb_vmEvalBlock( pIndExp );

на

puIndExp = hb_itemNew( NULL );
hb_itemCopy( puIndExp, hb_vmEvalBlock( pIndExp ) );

с последующим hb_itemRelease, и все заработало

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 58
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет