Форум » [x]Harbour » vm » Ответить

vm

Pasha: Подскажите, правильно ли я делаю ? Надо на С вызвать 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

gfilatov: 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 ); }

Pasha: hWnd - это 1-й параметр ? т.е, в моем случае надо: hb_vmPushSymbol (hb_dynsymGetSymbol ("MYFUNC")); hb_vmPushNil(); hb_vmPush(p1); hb_vmPush(p2); hb_vmPushNil(); hb_vmPush(p3); hb_vmDo( 4 ); ?

gfilatov: Pasha пишет: т.е, в моем случае надо: hb_vmPushSymbol (hb_dynsymGetSymbol ("MYFUNC")); hb_vmPushNil(); hb_vmPush(p1); hb_vmPush(p2); hb_vmPushNil(); hb_vmPush(p3); hb_vmDo( 4 ); ? По-видимому, так


Петр: Я б на вашем месте написал 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 не определена.

Pasha: Петр пишет: чтобы избежать граблей если MYFUNC не определена. Эти функции у меня в одном модуле, так что символ будет существовать Еще вопрос. Если я из C-функции вызываю блок кода вида {|| cStr}, который получаю в виде параметра PHB_ITEM p2 = hb_vmEvalBlock( hb_param( 1, HB_IT_BLOCK ) ); то надо ли делать в конце hb_itemClear(p2); и hb_itemRelease(p2); ?

Петр: Pasha пишет: hb_itemClear(p2); Не нужно - эта функция используется преимущественно при повторном использовании структуры PHB_ITEM, например в цикле. hb_itemRelease(p2) Вроде бы нет, 100% не уверен

Петр: Петр пишет: Вроде бы нет, 100% не уверен Уверен - не нужно ABNORMAL TERMINATION

Pasha: Я тут сам столкнулся с вмешательством мистических сил в работу функций 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) Причем такая ситуация возникает не в каждом вызове моей функции на выполнение, а только на "надцатый раз", и по этой причине краткий пример я привести не могу

Pasha: Я тут обнаружил, что dbSkip() иногда возвращает значение, отличное от nil: а именно - OrdKeyVal Записывает он его по-видимому в hb_stackReturnItem() Туда же записывает свой результат hb_vmEvalBlock, и происходит накладка. Поэтому я заменил: puIndExp = hb_vmEvalBlock( pIndExp ); на puIndExp = hb_itemNew( NULL ); hb_itemCopy( puIndExp, hb_vmEvalBlock( pIndExp ) ); с последующим hb_itemRelease, и все заработало



полная версия страницы