<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBScript: Вызов API в VBScript]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=6810</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6810&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBScript: Вызов API в VBScript».]]></description>
		<lastBuildDate>Sat, 01 Nov 2014 08:50:40 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=87896#p87896</link>
			<description><![CDATA[<p><strong>Flasher</strong>, что-нибудь вспомнилось ?</p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Sat, 01 Nov 2014 08:50:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=87896#p87896</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=87852#p87852</link>
			<description><![CDATA[<p>Спутал с другим методом. А у этого с вызовом rundll какой-то косяк был, дома попробую вспомнить.</p>]]></description>
			<author><![CDATA[null@example.com (Flasher)]]></author>
			<pubDate>Thu, 30 Oct 2014 18:15:27 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=87852#p87852</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=87843#p87843</link>
			<description><![CDATA[<p><strong>Flasher</strong>, почему ? На чём падает ? O_o</p><p>P.S Запустил 6 раз. Всё норм.</p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Thu, 30 Oct 2014 15:07:01 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=87843#p87843</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=87842#p87842</link>
			<description><![CDATA[<p>Не очень удачный способ для случаев, когда скриптов запущено несколько.<br />А вообще варианты <a href="http://forum.script-coding.com/viewtopic.php?id=9493">тут</a> обсуждались.</p>]]></description>
			<author><![CDATA[null@example.com (Flasher)]]></author>
			<pubDate>Thu, 30 Oct 2014 14:59:58 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=87842#p87842</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=87838#p87838</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Thu, 30 Oct 2014 13:48:39 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=87838#p87838</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=87011#p87011</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (unreal612)]]></author>
			<pubDate>Sat, 04 Oct 2014 11:47:54 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=87011#p87011</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=87010#p87010</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (unreal612)]]></author>
			<pubDate>Sat, 04 Oct 2014 11:38:37 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=87010#p87010</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=87002#p87002</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Sat, 04 Oct 2014 05:21:03 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=87002#p87002</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=86999#p86999</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (unreal612)]]></author>
			<pubDate>Sat, 04 Oct 2014 03:53:59 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=86999#p86999</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=86998#p86998</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (unreal612)]]></author>
			<pubDate>Sat, 04 Oct 2014 03:35:06 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=86998#p86998</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=86480#p86480</link>
			<description><![CDATA[<p>Ну, сам этот тип говорит только о том, что строка нужна в Юникоде. Т.к. в JScript строки уже в Юникоде, то просто передаётся указатель на неё. Пока проблем с этим не было, запись туда не вызывала исключений. Т.е. память строк от записи не защищается.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Mon, 15 Sep 2014 12:15:34 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=86480#p86480</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=86474#p86474</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (unreal612)]]></author>
			<pubDate>Mon, 15 Sep 2014 11:13:05 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=86474#p86474</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=85924#p85924</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (unreal612)]]></author>
			<pubDate>Thu, 14 Aug 2014 12:15:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=85924#p85924</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=85923#p85923</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Thu, 14 Aug 2014 11:10:28 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=85923#p85923</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Вызов API в VBScript]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=85918#p85918</link>
			<description><![CDATA[<p>Да, верно. Или, учитывая, что это указатель, более идеологически правильно использовать тип &quot;p&quot;. По сути разницы не будет, но для читабельности кода, думаю, лучше.</p><p>Большими буквами обозначаются выходные числа, а здесь структура. Да и вообще это не работает в JScript, т.к. он передаёт аргументы по значению, т.е. в виде временных копий.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Thu, 14 Aug 2014 10:25:31 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=85918#p85918</guid>
		</item>
	</channel>
</rss>
