<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: WIN32_Process Create не возвращает PID]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10656&amp;type=atom" />
	<updated>2015-05-21T17:37:11Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=10656</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: WIN32_Process Create не возвращает PID]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=94122#p94122" />
			<content type="html"><![CDATA[<p>У меня вот так работает:<br /></p><div class="codebox"><pre><code>strComputer:=&quot;127.0.0.1&quot;
ComObjError(1)
WbemLocator:=ComObjCreate(&quot;WbemScripting.SWbemLocator&quot;)
oCon:=WbemLocator.ConnectServer(strComputer, &quot;root\cimv2&quot;)
oProc:=oCon.Get(&quot;Win32_Process&quot;)

objInParams := oProc.Methods_(&quot;Create&quot;).InParameters.SpawnInstance_()
objInParams.CommandLine := &quot;notepad.exe&quot;
objOutParams := oProc.ExecMethod_(&quot;Create&quot;, objInParams)
MsgBox % objOutParams.ProcessId
ExitApp
</code></pre></div><p>Решение взято из незаслуженно удалённой темы «<a href="http://forum.script-coding.com/viewtopic.php?id=622">JScript: Работа с WMI</a>»:</p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><p>2007-08-24 23:23:41<br /></p><div class="quotebox"><cite>mozers пишет:</cite><blockquote><p>Имеем вполне рабочий VBS код, для запуска процесса и показа присвоенного ему индификатора:<br /></p><div class="codebox"><pre><code>Set objProcess = GetObject(&quot;winmgmts:\\.\root\cimv2:Win32_Process&quot;)
pID=0
errReturn = objProcess.Create(&quot;cmd&quot;, null, null, pID)
WScript.Echo &quot;Create ProcessID = &quot; &amp; pID
</code></pre></div><p>Тот же самый код, но выполненный на JS, лишь запускает процесс, но почему то никак не хочет присваивать значение индефикатору процесса:<br /></p><div class="codebox"><pre><code>var objProcess = GetObject(&quot;winmgmts:\\\\.\\root\\cimv2:Win32_Process&quot;);
var pID=0;
var errReturn = objProcess.Create(&quot;cmd&quot;, null, null, pID);
WScript.Echo (&quot;Create ProcessID = &quot; + pID);
</code></pre></div><p>Как заставить последний скрипт присваивать значение pID ?</p></blockquote></div><p>2007-08-25 08:15:53<br /></p><div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>Возможно ссылка, которую приводил <strong>alexii</strong>, объясняет этот казус: <a href="http://www.rsdn.ru/Forum/Info/FAQ.scripting.outparams.aspx">Скрипты и [out] параметры COM-методов</a><br />Если я правильно уловил суть, VBS в таких случаях передаёт переменные методу по ссылке, а JScript - по значению. Т.е. создаётся временная переменная, туда копируется значение из pID и передаётся методу. Поэтому все изменения происходят во временной переменной, а pID остаётся как был.</p></blockquote></div><p>2007-08-25 10:22:06<br /></p><div class="quotebox"><cite>mozers пишет:</cite><blockquote><p><strong>2YMP</strong><br />Похоже что Вы совершенно правы и причина именно в этом. (Я тоже нашел <a href="http://www.windowsitpro.com/WindowsScripting/Article/ArticleID/93402/93402.html">анонс статьи из журнала Scripting Pro VIP</a>, где рассматривется эта проблема и вроде как даже дается решение).<br />Но и про приведенной Вами ссылке и в найденном мной анонсе описана _причина_, но, увы, нет _решения_ <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /><br />Так все таки КАК ПОБЕДИТЬ ??? (меня интересует только изложенный выше конкретный пример).</p></blockquote></div><p>2007-08-25 11:18:00<br /></p><div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>Статья в MSDN, возможно, даёт намёк на решение: <a href="http://msdn2.microsoft.com/en-us/library/aa394616.aspx">Writing WMI Scripts in JScript</a><br /></p><div class="quotebox"><blockquote><p>Methods in VBScript can be called directly, while JScript methods are called with the SWbemMethod, InParam, and OutParam objects.</p></blockquote></div><p>К сожалению, в дальнейшем я ничего не понял, т.е. мои знания в WMI близки к нулю.</p></blockquote></div><p>2007-08-25 12:31:20<br /></p><div class="quotebox"><cite>The gray Cardinal пишет:</cite><blockquote><p>Для тех, кто не ищет лёгких путей <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />:<br /></p><div class="codebox"><pre><code>objProcess = GetObject(&quot;winmgmts:\\\\.\\root\\cimv2:Win32_Process&quot;);
objInParams = objProcess.Methods_(&quot;Create&quot;).InParameters.SpawnInstance_();
objInParams.CommandLine = &quot;cmd&quot;;
objOutParams = objProcess.ExecMethod_(&quot;Create&quot;, objInParams);
WScript.Echo(objOutParams.ProcessId);
</code></pre></div></blockquote></div><p>2007-08-25 12:55:41<br /></p><div class="quotebox"><cite>alexii пишет:</cite><blockquote><p><strong>2mozers</strong><br />Не забывайте про WMI Code Creator, с его помощью можно получить практически готовый шаблон кода (в том числе и этот; останется перевести его на jscript&nbsp; <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />)</p></blockquote></div><p>2007-08-25 13:33:33<br /></p><div class="quotebox"><cite>The gray Cardinal пишет:</cite><blockquote><p>OFF. На правах рекламы <img src="//forum.script-coding.com/img/smilies/lol.png" width="15" height="15" /> (Python)<br /></p><div class="codebox"><pre><code>import wmi
c = wmi.WMI()
pID, result = c.Win32_Process.Create(&quot;cmd&quot;)
print pID
</code></pre></div></blockquote></div><p>2007-08-26 00:26:39<br /></p><div class="quotebox"><cite>mozers пишет:</cite><blockquote><p>Спасибо ВСЕМ за отзывчивость, толковые советы и реальную помощь!<br />Все работатет <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />Мой скрипт запускает разные программки на другой машине, а если я где то ошибся и программка зависла (слишком уж долго выполняется), то скрипт ее принудительно завершает.<br />Все было написано на VBS, ща переписал на JS (он мне больше нравится), но вот на этом пунктике затормозил...<br />СПАСИБО, помогли!<br />WMI Code Creator - тоже штука неплохая, получше Scriptomatic2 будет, хотя у последнего больше форматов на выходе (в т.ч. и JS). Вот только с помощью оных приблуд код, что <strong>The gray Cardinal</strong> написал, не создашь <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" /></p></blockquote></div></div></div><p>Мне почему-то казалось, что эта тема нашла отражение в Коллекции — выходит, ошибался…</p><br /><p>Хотя, решение, которое привёл <strong>teadrinker</strong> — позволяющее работать с аргументами функций, передаваемыми по ссылке, — является более общим, по крайней мере для AutoHotkey.</p>]]></content>
			<author>
				<name><![CDATA[wisgest]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=3850</uri>
			</author>
			<updated>2015-05-21T17:37:11Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=94122#p94122</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: WIN32_Process Create не возвращает PID]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=94117#p94117" />
			<content type="html"><![CDATA[<p>Проверил. Работает. Спасибо огромное.</p>]]></content>
			<author>
				<name><![CDATA[chippp]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=28524</uri>
			</author>
			<updated>2015-05-21T09:14:02Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=94117#p94117</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: WIN32_Process Create не возвращает PID]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=94094#p94094" />
			<content type="html"><![CDATA[<p>Ну, или так, вроде попроще для понимания:<br /></p><div class="codebox"><pre><code>strComputer:=&quot;127.0.0.1&quot;
ComObjError(1)
WbemLocator:=ComObjCreate(&quot;WbemScripting.SWbemLocator&quot;)
oCon:=WbemLocator.ConnectServer(strComputer, &quot;root\cimv2&quot;)
oProc:=oCon.Get(&quot;Win32_Process&quot;)

processid := new ComVar
oProc.Create(&quot;notepad.exe&quot;, ComObjMissing(), ComObjMissing(), processid.ref)

MsgBox % processid[]
ExitApp

class ComVar
{   
   __New(Type = 0xC)  {  ; VT_VARIANT := 0xC
      this.arr := ComObjArray(Type, 1)
      DllCall(&quot;oleaut32\SafeArrayAccessData&quot;, Ptr, ComObjValue(this.arr), PtrP, arr_data)
      this.ref := ComObject(0x4000|Type, arr_data)  ; VT_BYREF := 0x4000
   }
   
   __Get(p*)  {
      if p.MaxIndex() = &quot;&quot;
         Return this.arr[0]
   }
   
   __Delete()  {
      DllCall(&quot;oleaut32\SafeArrayUnaccessData&quot;, Ptr, ComObjValue(this.arr))
   }
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-05-20T17:14:37Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=94094#p94094</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: WIN32_Process Create не возвращает PID]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=94084#p94084" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>strComputer:=&quot;127.0.0.1&quot;
ComObjError(1)
WbemLocator:=ComObjCreate(&quot;WbemScripting.SWbemLocator&quot;)
oCon:=WbemLocator.ConnectServer(strComputer, &quot;root\cimv2&quot;)
oProc:=oCon.Get(&quot;Win32_Process&quot;)

processid := ComVar()
oProc.Create(&quot;notepad.exe&quot;, ComObjMissing(), ComObjMissing(), processid.ref)

MsgBox % processid[]
ExitApp

ComVar(Type=0xC)   ; http://ahkscript.org/docs/commands/ComObjActive.htm#ByRef
{
    static base := { __Get: &quot;ComVarGet&quot;, __Set: &quot;ComVarSet&quot;, __Delete: &quot;ComVarDel&quot; }
    ; Create an array of 1 VARIANT.  This method allows built-in code to take
    ; care of all conversions between VARIANT and AutoHotkey internal types.
    arr := ComObjArray(Type, 1)
    ; Lock the array and retrieve a pointer to the VARIANT.
    DllCall(&quot;oleaut32\SafeArrayAccessData&quot;, &quot;ptr&quot;, ComObjValue(arr), &quot;ptr*&quot;, arr_data)
    ; Store the array and an object which can be used to pass the VARIANT ByRef.
    return { ref: ComObject(0x4000|Type, arr_data), _: arr, base: base }
}

ComVarGet(cv, p*) { ; Called when script accesses an unknown field.
    if p.MaxIndex() = &quot;&quot; ; No name/parameters, i.e. cv[]
        return cv._[0]
}

ComVarSet(cv, v, p*) { ; Called when script sets an unknown field.
    if p.MaxIndex() = &quot;&quot; ; No name/parameters, i.e. cv[]:=v
        return cv._[0] := v
}

ComVarDel(cv) { ; Called when the object is being freed.
    ; This must be done to allow the internal array to be freed.
    DllCall(&quot;oleaut32\SafeArrayUnaccessData&quot;, &quot;ptr&quot;, ComObjValue(cv._))
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-05-20T16:05:31Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=94084#p94084</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: WIN32_Process Create не возвращает PID]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=94067#p94067" />
			<content type="html"><![CDATA[<p>А, ясно, попозже тогда напишу, если никто не опередит.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-05-20T09:20:32Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=94067#p94067</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: WIN32_Process Create не возвращает PID]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=94064#p94064" />
			<content type="html"><![CDATA[<p>Не подходит, процесс по факту запускаться будет на удаленной машине. localhost используется для теста.</p>]]></content>
			<author>
				<name><![CDATA[chippp]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=28524</uri>
			</author>
			<updated>2015-05-20T08:56:18Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=94064#p94064</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: WIN32_Process Create не возвращает PID]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=94063#p94063" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>Run, notepad.exe,,, PID
MsgBox, % PID</code></pre></div>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-05-20T08:41:07Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=94063#p94063</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: WIN32_Process Create не возвращает PID]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=94062#p94062" />
			<content type="html"><![CDATA[<p>Добрый день.</p><div class="codebox"><pre><code>
strComputer:=&quot;127.0.0.1&quot;
ComObjError(1)
WbemLocator:=ComObjCreate(&quot;WbemScripting.SWbemLocator&quot;)
oCon:=WbemLocator.ConnectServer(strComputer, &quot;root\cimv2&quot;)
oProc:=oCon.Get(&quot;Win32_Process&quot;)
oProc.Create(&quot;notepad.exe&quot;, ComObjMissing(), ComObjMissing(), processid)

MsgBox % processid
ExitApp
</code></pre></div><p><strong>Проблема:</strong><br />В переменную processid не возвращается pid запущенного процесса.</p><p>Описание метода Create класса Win32_Process <a href="https://msdn.microsoft.com/en-us/library/aa389388(v=vs.85).aspx">https://msdn.microsoft.com/en-us/librar … s.85).aspx</a></p><p>Заранее спасибо за помощь.</p>]]></content>
			<author>
				<name><![CDATA[chippp]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=28524</uri>
			</author>
			<updated>2015-05-20T08:20:59Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=94062#p94062</id>
		</entry>
</feed>
