Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Указание интерпретатора


Автор: UndeadBlow 9.4.2012, 19:09
Всем добра.
Такое дело, скрип выполняется только 32-разрядными интерпретаторами. В Win7, например, этот интерпретатор находится по адресу c:\\windows\sysWOW64\ wscript.exe. Каким образом указать в скрипте интерпретатор, которым его надо выполнять, во избежание ошибки на 64-разрядных системах?

Автор: ksnk 9.4.2012, 19:12
Указать в скрипте интерпретатор в Win нельзя. Если скрипт начал выполняться, он уже чем-то исполняется  smile 

Интересно, что можно написать на JavaSCript, чтобы была разница между 64 и 32 разрядными системами?

Автор: UndeadBlow 9.4.2012, 19:16
Сам в шоке, поверь. Препода замучал, втроем с аспирантом наконец вкурили, почему скрипт работает дома и не работает в аудитории.
Короче там объект COM'овский класса ScriptControl не хочет создаваться, когда скрипт запущен 64-разрядным интерпретатором.
Какие есть варианты решения? Желательно автоматизированного решения, ассоциировать файл вручную с нужным экзешником конечно всегда можно.

Автор: Aliance 10.4.2012, 09:26
По вторникам мысли других людей не читаем, код бы увидеть...

Автор: UndeadBlow 10.4.2012, 14:58
Кусок вызывающий проблемы на 64-разрядных системах.
Код

var vb = {};
vb.Function = function(func)
{
return function()
{
return vb.Function.eval.call(this, func, arguments);
};
};
vb.Function.eval = function(func)
{
var args = Array.prototype.slice.call(arguments[1]);
for (var i = 0; i < args.length; i++) {
if ( typeof args[i] != 'string' ) {
continue;
}
args[i] = '"' + args[i].replace(/"/g, '" + Chr(34) + "') + '"'; // '
}
var vbe;
vbe =WScript.CreateObject("ScriptControl");
vbe.Language = 'VBScript';
return vbe.eval(func + '(' + args.join(', ') + ')');
};


Конкретно не создается объект ScriptControl (неважно через WScript создавать или через ActiveX) на не 32-разрядных системах.
Через cmd если вызвать интерпретатор 32-разрядной системы в вин7 (windows\sysWOW64\wscript.exe) и запустить скрипт, то ок. Иначе проблемы.

Автор: ksnk 10.4.2012, 15:11
Насколько я понимаю, проблема при создании объекта VBScript? А до работы с этим объектом все , в принципе, работает?

Автор: UndeadBlow 10.4.2012, 15:14
Цитата(ksnk @ 10.4.2012,  15:11)
Насколько я понимаю, проблема при создании объекта VBScript? А до работы с этим объектом все , в принципе, работает?

Подредактировал сообщение, указал в чем именно проблема.
Остальное да, работает.
Кстати, забавно, но у девушки на компе не вышло даже ассоциировать расширение с интерпретатором в sysWOW64. Запускается через него только через cmd. Что за фигня >.<

Автор: ksnk 10.4.2012, 15:54
Если поискать по словам 
Цитата
scriptcontrol 32 64 ActiveX component can't create object
 в гугле, то можно найти много вопросов, но решения мне там не попадалось... Видимо - "доктор сказал - в морг"
Хотя, можно поковыряться http://resource.dopus.com/viewtopic.php?f=26&t=13448 слишком много букв для простого отлупа. Возможно там есть и решение... 
проверить все это я не могу ;) 

Автор: UndeadBlow 10.4.2012, 16:48
В диких недрах стаковерфлова есть сие, что и помогло. Но больше я выжать из этого не смог.
http://stackoverflow.com/questions/2429477/cannot-use-createobject-from-vb-scripts-on-windows-7
Других вариантов создания InputBox на javascript я не знаю, кроме как через vb вот так.

Автор: ksnk 10.4.2012, 18:08
Цитата(UndeadBlow @  10.4.2012,  16:48 Найти цитируемый пост)
Других вариантов создания InputBox на javascript я не знаю, кроме как через vb вот так.

Это да. У нас в одном приложении используется JS в качестве скриптового языка. Там по просьбам трудящихся была в конце концов введена функция msgBox и inputBox и еще какие-то, поддерживаемые приложением. 
До этого реализация inputBox там была такая.
Код

function inputBox(Msg,Title,Default)
{
    var vbscript = new ActiveXObject("ScriptControl");
    vbscript.Language = "VBScript";
    vbscript.AddCode( [
        'Function inputB(ByVal Msg, ByVal Title, ByVal Default )',
        'inputB=InputBox(Msg,Title,Default)',
        'End Function'].join("\n"));
    return vbscript.Run("inputB",Msg,Title,Default);
}
 Выглядит она по другому, но, вероятно, с такими-же багами на 64разрядной машине.
В мистическом смысле функции в функции разбираться не было большого желания... smile 

Автор: UndeadBlow 11.4.2012, 01:08
Цитата(ksnk @ 10.4.2012,  18:08)
Цитата(UndeadBlow @  10.4.2012,  16:48 Найти цитируемый пост)
Других вариантов создания InputBox на javascript я не знаю, кроме как через vb вот так.

Это да. У нас в одном приложении используется JS в качестве скриптового языка. Там по просьбам трудящихся была в конце концов введена функция msgBox и inputBox и еще какие-то, поддерживаемые приложением. 
До этого реализация inputBox там была такая.
Код

function inputBox(Msg,Title,Default)
{
    var vbscript = new ActiveXObject("ScriptControl");
    vbscript.Language = "VBScript";
    vbscript.AddCode( [
        'Function inputB(ByVal Msg, ByVal Title, ByVal Default )',
        'inputB=InputBox(Msg,Title,Default)',
        'End Function'].join("\n"));
    return vbscript.Run("inputB",Msg,Title,Default);
}
 Выглядит она по другому, но, вероятно, с такими-же багами на 64разрядной машине.
В мистическом смысле функции в функции разбираться не было большого желания... smile

Проблема не в коде, а в создании com объекта, да :( Так что знай, эта хрень на 64 не пойдет, или пойдет, но с бубном диким)
Впрочем можно изголиться и сделать в скрипте создание смд файла и создание еще одного .js файла. Потом смд запускает js и после выполнения оба удаляются. Но это и есть жуткий бубен, хз. Попробую препода попытать одного умного, может подскажет что получше в итоге.
Кстати говоря, вся эта хрень - это плата за кроссплатформенность. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)