<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBScript: Вызов API в VBScript]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6810&amp;type=atom" />
	<updated>2014-11-01T08:50:40Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=6810</id>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=87896#p87896" />
			<content type="html"><![CDATA[<p><strong>Flasher</strong>, что-нибудь вспомнилось ?</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2014-11-01T08:50:40Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=87896#p87896</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=87852#p87852" />
			<content type="html"><![CDATA[<p>Спутал с другим методом. А у этого с вызовом rundll какой-то косяк был, дома попробую вспомнить.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2014-10-30T18:15:27Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=87852#p87852</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=87843#p87843" />
			<content type="html"><![CDATA[<p><strong>Flasher</strong>, почему ? На чём падает ? O_o</p><p>P.S Запустил 6 раз. Всё норм.</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2014-10-30T15:07:01Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=87843#p87843</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=87842#p87842" />
			<content type="html"><![CDATA[<p>Не очень удачный способ для случаев, когда скриптов запущено несколько.<br />А вообще варианты <a href="http://forum.script-coding.com/viewtopic.php?id=9493">тут</a> обсуждались.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2014-10-30T14:59:58Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=87842#p87842</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=87838#p87838" />
			<content type="html"><![CDATA[<p><strong>unreal612</strong>, нашёл в переписке с JSman-ом. Мы вот так делали. Тоже не моргает.</p><div class="codebox"><pre><code>function GetPID() {
    with (GetObject(&quot;winmgmts:root\\cimv2:win32_process.Handle=&#039;&quot; +
        new ActiveXObject(&quot;WScript.Shell&quot;).Exec(&quot;rundll32 kernel32,Sleep&quot;).ProcessId + &quot;&#039;&quot;)) {
        Terminate(); return ParentProcessId
    }
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2014-10-30T13:48:39Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=87838#p87838</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=87011#p87011" />
			<content type="html"><![CDATA[<p>кстати, в теме &quot;WSH: как из скрипта определить его идентификатор процесса (PID)&quot; PID определяется через запуск mshta, который все-таки моргает окном.<br />У себя сделал так без моргания:<br /></p><div class="codebox"><pre><code>function getScriptProcessID() {
    var
        wshShell = new ActiveXObject(&#039;WScript.Shell&#039;),
        id = &#039;&#039; + (new Date).valueOf(),
        strPath = &#039;&quot;&#039; + wshShell.expandEnvironmentStrings(&#039;%ComSpec%&#039;) + &#039;&quot; /k &quot;&#039; + id +&#039;&quot;&#039;,
        сhildProcess, processID;

    wshShell.run(strPath, 0);
    сhildProcess = wmiQuery(null, &quot;SELECT * FROM Win32_Process WHERE CommandLine LIKE &#039;%&quot; + id + &quot;%&#039;&quot;)[0];
    processID = сhildProcess.parentProcessID;

    сhildProcess.terminate();
    return processID;
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[unreal612]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31889</uri>
			</author>
			<updated>2014-10-04T11:47:54Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=87011#p87011</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=87010#p87010" />
			<content type="html"><![CDATA[<p>Насчет 2-го не понял (понял, что что-то из серии - этот тип строки имеет какой-то подтип, который не нравится DynamicWrapperX)</p><p>Насчет 1-го сенкс. Почитал ту тему + поискал эти методы в &quot;Введение в Windows Management Instrumentation (WMI)&quot; на самом сайте.<br />Сделал так<br /></p><div class="codebox"><pre><code>var processes = wmiQuery(null, &quot;Select * from Win32_Process&quot;)

for (var i=0; i&lt;processes.length; ++i) {
    var process = processes[i];

    var nameOfUser = [];
    var Return = wmiExecMethod(process, &quot;GetOwner&quot;, null, {user: nameOfUser});
    
    if (Return != 0)
        WScript.echo (&quot;Could not get owner info for process &quot; + process.name + &quot;\r\nError = &quot; + Return);
    else
        WScript.echo (&quot;Process &quot; + process.name + &quot; is owned by \\&quot; + nameOfUser[0] + &quot;.&quot;);
}


// ===========================================
Enumerator.prototype.toArray = function () {
    var result = [];
    for (; !this.atEnd(); this.moveNext())
        result.push(this.item());
    return result;
}

function wmiQuery(moniker, query) {
    moniker = moniker || &#039;winmgmts:{impersonationLevel=impersonate}!//./root/cimv2&#039;;
    var items =  GetObject(moniker).execQuery(query);
    return (new Enumerator(items)).toArray();
}

function wmiExecMethod(sWbemObject, method, inParams, outParams) {
    var _inParams = null, _outParams;
    if (inParams) {
        _inParams = sWbemObject.methods_(method).inParameters.spawnInstance_();
        for (var inParam in inParams)
            if (inParams.hasOwnProperty(inParam))
                _inParams[inParam] = inParams[inParam];
    };

    _outParams = sWbemObject.execMethod_(method, _inParams);

    if (outParams) {
        for (var outParam in outParams)
            if (outParams.hasOwnProperty(outParam))
                outParams[outParam].push(_outParams[outParam]) ;
        return _outParams.returnValue;
    } else
        return _outParams;
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[unreal612]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31889</uri>
			</author>
			<updated>2014-10-04T11:38:37Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=87010#p87010</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=87002#p87002" />
			<content type="html"><![CDATA[<p>1. <a href="http://forum.script-coding.com/viewtopic.php?id=625">JScript: вызов методов WMI с выходными параметрами</a></p><p>2. Для StrPtr нужна строка, а strNameOfUser имеет тип VT_NULL. Если бы при этом его значением был 0, то это бы проканало как нулевой указатель (NULL). Но у меня, например, его значение почему-то 2, поэтому функция преобразования типов в DWX его не пропускает. Не может указатель на строку иметь значение 2.</p><p>Возможно, тут надо на тип ориентироваться, игнорируя значение.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2014-10-04T05:21:03Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=87002#p87002</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=86999#p86999" />
			<content type="html"><![CDATA[<p>и почему-то, если в данный vbs-код после<br /></p><div class="codebox"><pre><code>Return = objProcess.GetOwner(strNameOfUser)</code></pre></div><p>вставить<br /></p><div class="codebox"><pre><code>WScript.Echo CStr(CreateObject(&quot;DynamicWrapperX.2&quot;).StrPtr(strNameOfUser))</code></pre></div><p>то выводится<br /></p><div class="quotebox"><blockquote><p>DynamicWrapperX.2: Значение аргумента вне диапазона для типа параметра</p></blockquote></div>]]></content>
			<author>
				<name><![CDATA[unreal612]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31889</uri>
			</author>
			<updated>2014-10-04T03:53:59Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=86999#p86999</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=86998#p86998" />
			<content type="html"><![CDATA[<p>откуда-то из MSDN<br /></p><div class="quotebox"><blockquote><p>strComputer = &quot;.&quot;<br />Set colProcesses = GetObject(&quot;winmgmts:&quot; &amp; _<br />&nbsp; &nbsp;&quot;{impersonationLevel=impersonate}!\\&quot; &amp; strComputer &amp; _<br />&nbsp; &nbsp;&quot;\root\cimv2&quot;).ExecQuery(&quot;Select * from Win32_Process&quot;)</p><p>For Each objProcess in colProcesses</p><p>&nbsp; &nbsp; Return = objProcess.GetOwner(<strong>strNameOfUser</strong>)<br />&nbsp; &nbsp; If Return &lt;&gt; 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; Wscript.Echo &quot;Could not get owner info for process &quot; &amp; _&nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objProcess.Name &amp; VBNewLine _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &amp; &quot;Error = &quot; &amp; Return<br />&nbsp; &nbsp; Else <br />&nbsp; &nbsp; &nbsp; &nbsp; Wscript.Echo &quot;Process &quot; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &amp; objProcess.Name &amp; &quot; is owned by &quot; _ <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &amp; &quot;\&quot; &amp; <strong>strNameOfUser</strong> &amp; &quot;.&quot;<br />&nbsp; &nbsp; End If<br />Next</p></blockquote></div><p>т.е. strNameOfUser является выходной переменной. Как такое реализовать на JScript?</p>]]></content>
			<author>
				<name><![CDATA[unreal612]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31889</uri>
			</author>
			<updated>2014-10-04T03:35:06Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=86998#p86998</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=86480#p86480" />
			<content type="html"><![CDATA[<p>Ну, сам этот тип говорит только о том, что строка нужна в Юникоде. Т.к. в JScript строки уже в Юникоде, то просто передаётся указатель на неё. Пока проблем с этим не было, запись туда не вызывала исключений. Т.е. память строк от записи не защищается.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2014-09-15T12:15:34Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=86480#p86480</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=86474#p86474" />
			<content type="html"><![CDATA[<p>в WinAPI есть ф-я CreateProcess (точнее CreateProcessW). У нее есть параметр &quot;LPTSTR lpCommandLine&quot;. Для него написано <br /></p><div class="quotebox"><blockquote><p>The Unicode version of this function, CreateProcessW, can modify the contents of this string. <strong>Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.</strong></p></blockquote></div><p>Если для него указывать &quot;r=w&quot;, то это будет корректно или нет?<br />Т.к. непонятно, являются типы параметров &quot;w&quot; только для чтения (как строки-литералы в C++) или нет (PS, хотя подозревая, что нет).<br />Или для такого типа строки надо юзать MemAlloc и тип параметра &quot;p&quot;?</p>]]></content>
			<author>
				<name><![CDATA[unreal612]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31889</uri>
			</author>
			<updated>2014-09-15T11:13:05Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=86474#p86474</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=85924#p85924" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>Большими буквами обозначаются выходные числа, а здесь структура. Да и вообще это не работает в JScript, т.к. он передаёт аргументы по значению, т.е. в виде временных копий.</p></blockquote></div><p>понятно, но на VBScript все равно не перейду. Не нравится его синтаксис и некоторые заморочки. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br /></p><div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>Для этой цели теперь есть метод LastError. Он возвращает этот код (или его описание), если функция была зарегистрирована с флагом &quot;l&quot;.</p></blockquote></div><p>о, сенкс.</p>]]></content>
			<author>
				<name><![CDATA[unreal612]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31889</uri>
			</author>
			<updated>2014-08-14T12:15:40Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=85924#p85924</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=85923#p85923" />
			<content type="html"><![CDATA[<p>Кстати, если нужен код ошибки от GetLastError, не нужно её регистрировать и потом вызывать. Т.к. нет гарантии, что между вызовом целевой функции и вызовом GetLastError не будет вызвана какая-то другая API-функция — либо объектом Dynwrapx, либо скриптовым движком. Тогда код ошибки может быть изменён.</p><p>Для этой цели теперь есть метод LastError. Он возвращает этот код (или его описание), если функция была зарегистрирована с флагом &quot;l&quot;.<br /></p><div class="codebox"><pre><code>
var WinAPI = new ActiveXObject(&quot;DynamicWrapperX.2&quot;),
    sizeof_OSVERSIONINFOEX = 4*5 + 128*2 + 2*3 + 1*2,  // DWORD*5 + WCHAR[128] + WORD*3 + BYTE*2
    MemPtr = WinAPI.MemAlloc( sizeof_OSVERSIONINFOEX, 1),
    nonzero;

WinAPI.Register(&quot;kernel32.dll:GetVersionExW&quot;, &quot;GetVersionEx&quot;, &quot;i=H&quot;, &quot;r=l&quot;, &quot;f=l&quot;);
WinAPI.NumPut( sizeof_OSVERSIONINFOEX, MemPtr, 0, &#039;u&#039; );

var nonzero = WinAPI.GetVersionEx(MemPtr);

WSH.echo(WinAPI.LastError() + &quot;\n&quot; + WinAPI.LastError(1));
</code></pre></div><div class="codebox"><pre><code>
---------------------------
Windows Script Host
---------------------------
122
Область данных, переданная по системному вызову, слишком мала.


---------------------------
ОК   
---------------------------
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2014-08-14T11:10:28Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=85923#p85923</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=85918#p85918" />
			<content type="html"><![CDATA[<p>Да, верно. Или, учитывая, что это указатель, более идеологически правильно использовать тип &quot;p&quot;. По сути разницы не будет, но для читабельности кода, думаю, лучше.</p><p>Большими буквами обозначаются выходные числа, а здесь структура. Да и вообще это не работает в JScript, т.к. он передаёт аргументы по значению, т.е. в виде временных копий.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2014-08-14T10:25:31Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=85918#p85918</id>
		</entry>
</feed>
