Не получается вызвать из плюса, tiscript'овую функцию. Для простоты, в качестве плюсового кода использовал исходники сэмпла 'minimal' из Sciter SDK. Модифицировал их следующим образом:
// LPCBYTE pb = 0;
// UINT cb = 0;
// GetResource(L"default.html",pb,cb);
// assert( pb && cb );
// SciterLoadHtml(hwnd, pb,cb, NULL );
SciterLoadFile(hwnd, L"sample.htm");
std::string functionName("foo");
tiscript::VM* vm = SciterGetVM(hwnd);
tiscript::pinned func(vm);
tiscript::value ns = tiscript::get_global_ns(vm);
func = tiscript::get_prop(vm, ns, functionName.c_str());
if( !tiscript::is_function(func) ) {
return NULL;
}
Код непосредственно вызывающий функцию не привожу, т.к. до него дело не доходит. Т.е. is_function возвращает false. Вот sample.htm:
<html>
<script type="text/tiscript">
function foo() {
view.msgbox(#info, "foo called");
}
</script>
</html>
Здравствуйте, dr.Benzin, Вы писали:
DB>Не получается вызвать из плюса, tiscript'овую функцию. Для простоты, в качестве плюсового кода использовал исходники сэмпла 'minimal' из Sciter SDK. Модифицировал их следующим образом:
...
Дело в том что global namespace (tiscript::get_global_ns(vm))
это не то место где живут объекты загруженного документа.
При загрузке документа для него создается свой namespace (что есть обычный объект — "вешалка")
В этом ns живут такие объекты как self и view.
Проблема в том что я забыл выставить наружу метод:
SCDOM_RESULT SCAPI SciterGetElementNamespace( HELEMENT he, tiscript_value* pval);
Завтра буду делать билд — появится.
Последовательность такая:
SciterLoadFile(hwnd, L"sample.htm");
HELEMENT root = dom::element::root_element(hwnd);
std::string functionName("foo");
tiscript::VM* vm = SciterGetVM(hwnd);
tiscript::pinned func(vm);
tiscript::value ns; SciterGetElementNamespace(root,&ns);
....
func = tiscript::get_prop(vm, ns, functionName.c_str());
Спасибо. С нетерпением жду билда