1 (изменено: im2002, 2012-11-20 12:30:35)

Тема: JS: Можно ли установить тип переменнй

var bGranted = true;
WScript.Echo("Тип переменной = " + typeof(bGranted));       // выводит сообщение, что тип переменной = boolean

я не хочу задавать для переменной bGranted явное значение true либо false, но хочу, чтобы она была "объявлена", как boolean

var bGranted;
typeof(bGranted) = boolean;       // выводит сообщение, об ошибке

Зачем всё это? Я никак не могу заставить работать скрипты для wmi при работе с реестром, как я писал в теме:
http://forum.script-coding.com/viewtopic.php?id=7786, т.е. с той ошибкой вроде разобрались, но вот переменная bGranted, которая должна
получать в результате значение true или false, в зависимости от действующих разрешений, никак этого делать не хочет....

в примере на vbs alexii решил эту проблему так:

Dim boolGranted

и так на vbs все ОК, а на JS просто не знаю как это сделать

если я просто определяю переменную  bGranted как

var bGranted;

то возвращаемое значение всегда  = false, что не соответствует действительности.... чё делать?!

то же самое происходит и в методе GetDWORDValue(hDefKey, sSubKeyName, sValueName, Value) для Класса StdRegProv.
Как написано в статье: Value - значение параметра: массив байтов, значение DWORD, строка или массив строк (после выполнения метода).
Вот я и не знаю как её, эту переменную определить..., т.е. в неё по идее должно записаться значение DWORD, присвоенное параметру sValueName
в разделе sSubKeyName, но в неё в итоге записывается 0, undefined, либо значение, которое я определил заранее сам. Как объявить эту переменную?

2

Re: JS: Можно ли установить тип переменнй

Ну так не умеет JScript с выходными параметрами работать. Выходной параметр должен передаваться в метод или функцию по ссылке, т.е. фактически передаётся адрес переменной. Потом метод либо функция может по этому адресу записать какое-то значение, и таким образом значение переменной меняется.

JScript всегда передаёт само значение переменной, адрес переменной он передавать не умеет. Т.е. создаётся временная копия переменной и она передаётся в метод или функцию. Так что у метода или функции нет никакого доступа к оригиналу переменной и нет возможности её значение изменить.

3

Re: JS: Можно ли установить тип переменнй

im2002 пишет:

если я просто определяю переменную  bGranted как
Код:

var bGranted;

то возвращаемое значение всегда  = false, что не соответствует действительности....

На самом деле именно эта конструкция создает переменную со значением undefined. Определяйте переменную и присваивайте ей значение

// хоть так
var granted;
granted = true;

// хоть так
var granted = true;

Не понятно, что именно Вы хотите - присвоить значение переменной или проверить ее тип? Я пока не улавливаю конкретных вопросов. В чем проблема?

im2002 пишет:

так на vbs все ОК, а на JS просто не знаю как это сделать

Я скажу банальность, но все же... Учите язык и не старайтесь применить старые привычки vbs в другом в корне отличающемся языке.

( 2 * b ) || ! ( 2 * b )

4

Re: JS: Можно ли установить тип переменнй

im2002 пишет:

typeof(bGranted)

поосторожнее с этой особенностью - она нервов вам много попортит, а результатом может быть только неприятие нового языка. Используйте как справочник темных мест в JS - http://shamansir.github.com/JavaScript-Garden/

( 2 * b ) || ! ( 2 * b )

5 (изменено: Rom5, 2012-11-20 14:44:12)

Re: JS: Можно ли установить тип переменнй

Если автор хотел, чтобы при объявлении переменной на задавать ее значение, а присваивать по ходу работы в Истину или Ложь, то им видимо предусматривается некий третий вариант, когда переменная как бы вообще никаким значением не установлена при невозможности выполнения проверок в функции.
Может просто не работать с возвращаемым буленовским значением, а, например, объявить числовую переменную с областью видимости глобальной для всего скрипта, и менять ее значение: 0 / 1 / 2.

В начале работы процедуры ее (глоб.переменную) сбрасывать в 0, а по ходу проверки доступов давать уже 1 или 2.

----
Или изначально возвращать в виде числового значения результат функции.

WBR. Roman

6

Re: JS: Можно ли установить тип переменнй

YMP пишет:

JScript всегда передаёт само значение переменной, адрес переменной он передавать не умеет. Т.е. создаётся временная копия переменной и она передаётся в метод или функцию. Так что у метода или функции нет никакого доступа к оригиналу переменной и нет возможности её значение изменить.

НЕ все так просто. ПРостые значения передаются по значению, сложные - по ссылке. Вот пример

Переменная x не изменилась, так как она была передана по значение. Переменная y - изменилась, так как была передана по ссылке


function f(x, y)
{
	x = 100;
	y.a = 100;

	WScript.Echo('IN FUNCTION');
	WScript.Echo(x);
	WScript.Echo(y.a);
};

var x = 10;
var y = { a: 1 };

WScript.Echo('BEFORE');
WScript.Echo(x);
WScript.Echo(y.a);

f(x, y);

WScript.Echo('AFTER');
WScript.Echo(x);
WScript.Echo(y.a);
( 2 * b ) || ! ( 2 * b )

7

Re: JS: Можно ли установить тип переменнй

Я так понимаю, автор хотел вот это: jscript stdregprov checkaccess inparameters.spawninstance - Поиск в Google, но не знал, как сформулировать поточнее.

8

Re: JS: Можно ли установить тип переменнй

Rumata
Да, вы правы, разница есть. Хотя если заглянуть "под капот", то в обоих случаях передаётся копия значения, просто во втором случае значением является ссылка на объект. На уровне скрипта, вероятно, значением переменной правильнее считать сам объект, и тогда да, получается, что он передаётся по ссылке.

9

Re: JS: Можно ли установить тип переменнй

YMP пишет:

во втором случае значением является ссылка на объект

эта весьма странная ссылка, потому что свойства объекта менять можно, а вот сам объект изменить - нет. Вот еще пример.


function f(y)
{
	y = { a: 100, b: 100 };

	WScript.Echo('IN FUNCTION');
	WScript.Echo(typeof y.a, y.a);
	WScript.Echo(typeof y.b, y.b);
};

var y = { a: 1 };

WScript.Echo('BEFORE');
WScript.Echo(typeof y.a, y.a);
WScript.Echo(typeof y.b, y.b);

f(y);

WScript.Echo('AFTER');
WScript.Echo(typeof y.a, y.a);
WScript.Echo(typeof y.b, y.b);
( 2 * b ) || ! ( 2 * b )

10

Re: JS: Можно ли установить тип переменнй

Rumata пишет:

эта весьма странная ссылка, потому что свойства объекта менять можно, а вот сам объект изменить - нет. Вот еще пример.

Здесь всё логично, по-моему. Внутри функции y — локальная переменная (параметр). Вы присваиваете ей другое значение (другой объект), но это никак не влияет на глобальную переменную y. В ней остаётся ссылка на прежний объект.
Сама глобальная y по ссылке не передаётся, как это делается в VBScript. Передаётся копия переменной, содержащая ссылку на тот же объект. Поэтому можно что-то делать с объектом, на который ссылается глобальная переменная, но не с самой глобальной переменной. Нельзя изменить её содержимое.

В случае VBScript была бы передана ссылка на переменную, содержащую ссылку на объект. Здесь уже можно менять как объект, так и переменную.

11 (изменено: im2002, 2012-11-21 14:20:14)

Re: JS: Можно ли установить тип переменнй

Для меня примеры приведённые выше вполне понятны. Но получить выходной параметр метода в своём случае никак не могу..

HKEY_CURRENT_USER = 0x80000001;
strLoc = ".";                    
strName = "root\\default:StdRegProv";         

SWbemServices = GetObject("WinMgmts:{impersonationLevel=Impersonate, authenticationLevel=pktPrivacy}!\\\\" + strLoc + "\\" + strName);
objwbemInParams = SWbemServices.Methods_("GetDWORDValue").InParameters.SpawnInstance_();
                                    
objwbemInParams.hDefKey = HKEY_CURRENT_USER;                // определение входных параметров метода GetDWORDValue
objwbemInParams.sSubKeyName = "my";
objwbemInParams.sValueName = "my_param";

objwbemOutParams = SWbemServices.ExecMethod_("GetDWORDValue", objwbemInParams);

Значение параметра "my_param" есть FF, тип параметра DWORD, параметр в разделе "my", этот раздел в корне HKEY_CURRENT_USER.

Как я могу использовать  objwbemOutParams, чтобы получить эти FF или 255.
У метода GetDWORDValue, есть 4-й (выходной параметр) Value, но как его вытянуть по ссылке не понимаю.

Value - значение параметра: массив байтов, значение DWORD, строка или массив строк (после выполнения метода). - из описания метода....

12

Re: JS: Можно ли установить тип переменнй

У меня получилось.

HKEY_CURRENT_USER = 0x80000001;
strLoc = ".";                    
strName = "root\\default:StdRegProv";         

SWbemServices = GetObject("WinMgmts:{impersonationLevel=Impersonate, authenticationLevel=pktPrivacy}!\\\\" + strLoc + "\\" + strName);
objwbemInParams = SWbemServices.Methods_("GetDWORDValue").InParameters.SpawnInstance_();
                                    
objwbemInParams.hDefKey = HKEY_CURRENT_USER;                // определение входных параметров метода GetDWORDValue
objwbemInParams.sSubKeyName = "my";
objwbemInParams.sValueName = "my_param";

objwbemOutParams = SWbemServices.ExecMethod_("GetDWORDValue", objwbemInParams);

WSH.echo(objwbemOutParams.uValue);

13 (изменено: im2002, 2012-11-21 15:46:15)

Re: JS: Можно ли установить тип переменнй

YMP! Большое спасибо! Но каким образом можно догадаться использовать значение uValue?! Может в статье опечатки? Теперь тоже работает... Я делал по "Рецепты WMI: работа с реестром Windows" может она кривая? статья эта... дайте ссылку на wmi для работы с реестром, если есть таковая!

14

Re: JS: Можно ли установить тип переменнй

Например, на MSDN можно посмотреть: GetDWORDValue method of the StdRegProv class (Windows).

15

Re: JS: Можно ли установить тип переменнй

Или прямо скриптом:

Option Explicit

Dim objProperty

With WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\default").Get("StdRegProv")
    With .Methods_("GetDWORDValue")
        WScript.Echo "InParameters:"
        WScript.Echo "---------------------------"
        
        For Each objProperty In .InParameters.Properties_
            WScript.Echo objProperty.Name
        Next
        
        WScript.Echo "---------------------------"
        WScript.Echo
        
        WScript.Echo "OutParameters:"
        WScript.Echo "---------------------------"
        
        For Each objProperty In .OutParameters.Properties_
            WScript.Echo objProperty.Name
        Next
        
        WScript.Echo "---------------------------"
    End With
End With

WScript.Quit 0

Ещё есть такая хорошая штука, как «C:\WINDOWS\system32\wbem\wbemtest.exe», а также утилиты из набора WMI Administrative Tools.

16

Re: JS: Можно ли установить тип переменнй

Спасибо за пример alexii, переложил на JS, сделал как функцию, могу смотреть методы для экземпляров класса и входные/выходные параметры этих методов. Просто счастлив. Ещё немного и кажется начну понимать...

17

Re: JS: Можно ли установить тип переменнй

im2002, с классикой:
Вы всё ещё не используете WMI? Часть I::Журнал СА 1.2006
Вы всё ещё не используете WMI? Часть II: пишем сценарии::Журнал СА 2.2006
Узнай секреты WMI: события и провайдеры. Часть I: дополнительные возможности::Журнал СА 3.2006
Узнай секреты WMI: события и провайдеры. Часть II: ключ к управлению системой и приложениями::Журнал СА 5.2006
знакомы?