Автор | Сообщение |
|
| Администратор
|
Пост 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 );
|
|
|
Ответов - 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 ); } |
|
|
|
|
|
| Администратор
|
Пост 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 ); ?
|
|
|
|
| модератор
|
Пост 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 ); ? |
| По-видимому, так
|
|
|
|
| постоянный участник
|
Пост 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 не определена.
|
|
|
|
| Администратор
|
Пост 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); ?
|
|
|
|
| постоянный участник
|
Пост N: 694
Зарегистрирован: 09.10.06
|
|
Отправлено: 18.06.09 16:36. Заголовок: Pasha пишет: hb_ite..
Pasha пишет: Не нужно - эта функция используется преимущественно при повторном использовании структуры PHB_ITEM, например в цикле. Вроде бы нет, 100% не уверен
|
|
|
|
| постоянный участник
|
Пост N: 697
Зарегистрирован: 09.10.06
|
|
Отправлено: 18.06.09 17:20. Заголовок: Петр пишет: Вроде б..
Петр пишет: цитата: | Вроде бы нет, 100% не уверен |
| Уверен - не нужно
|
|
|
|
| Администратор
|
Пост 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) Причем такая ситуация возникает не в каждом вызове моей функции на выполнение, а только на "надцатый раз", и по этой причине краткий пример я привести не могу
|
|
|
|
| Администратор
|
Пост 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, и все заработало
|
|
|
|