<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; PHP: Ссылки, указатели, WINAPI и DynamicWrapperX]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=7773&amp;type=atom" />
	<updated>2012-11-13T19:41:19Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=7773</id>
		<entry>
			<title type="html"><![CDATA[Re: PHP: Ссылки, указатели, WINAPI и DynamicWrapperX]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=65598#p65598" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>Уточните, о чём всё-таки речь: DynamicWrapper или DynamicWrapperX. Если последний, то можно зарегистрировать API, выделяющую память, — например, GlobalAlloc — и запросить нужное количество байт под структуру. Так и получите указатель на структуру. Писать туда значения её членов можно методом NumPut, а читать методом NumGet. Тип параметра в GetCursorPos обозначить как &quot;i=p&quot;.</p></blockquote></div><p>Это трудно назвать нормальным способом, скорее костыль какой-то, но, к сожалению, в PHP, видимо, нет другого способа, поэтому только так. Тем не менее, он работает, и вот рабочий код, который пишет позицию курсора:<br /></p><div class="codebox"><pre><code>&lt;?php
$com = new COM(&quot;DynamicWrapperX&quot;); // 
$com-&gt;Register(&quot;user32&quot;, &quot;GetCursorPos&quot;, &quot;i=p&quot;, &quot;r=l&quot;); // регистрируем GetCursorPos
$com-&gt;Register(&quot;kernel32&quot;, &quot;GlobalAlloc&quot;, &quot;i=ll&quot;, &quot;r=p&quot;); // и GlobalAlloc

$addr = $com-&gt;GlobalAlloc(0, 8); // выделяем 8 байт под структуру POINT
// и присваиваем переменной $addr её адрес.
$com-&gt;GetCursorPos($addr); // вызываем GetCursorPos
$x = $com-&gt;NumGet($addr, 0, &quot;l&quot;); // выдёргиваем первые 4 байта в $x
$y = $com-&gt;NumGet($addr, 4, &quot;l&quot;); // и последние в переменную $y
echo &quot;$x $y&quot;;
?&gt;</code></pre></div><p>Спасибо, <strong>YMP</strong>. Спасибо за библиотеку и подсказку, как её использовать в PHP.</p>]]></content>
			<author>
				<name><![CDATA[vo1ty]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=28909</uri>
			</author>
			<updated>2012-11-13T19:41:19Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=65598#p65598</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: PHP: Ссылки, указатели, WINAPI и DynamicWrapperX]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=65574#p65574" />
			<content type="html"><![CDATA[<p>Уточните, о чём всё-таки речь: DynamicWrapper или DynamicWrapperX. Если последний, то можно зарегистрировать API, выделяющую память, — например, GlobalAlloc — и запросить нужное количество байт под структуру. Так и получите указатель на структуру. Писать туда значения её членов можно методом NumPut, а читать методом NumGet. Тип параметра в GetCursorPos обозначить как &quot;i=p&quot;.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2012-11-13T04:15:04Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=65574#p65574</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[PHP: Ссылки, указатели, WINAPI и DynamicWrapperX]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=65573#p65573" />
			<content type="html"><![CDATA[<p>Доброго времени суток! Думал написать на PHP приложение, использующее Windows API. Сначала решил узнать, как оно вообще, можно ли вообще это сделать.</p><p>Проблема здесь не одна, а целых две. Первая заключается в том, что некоторые функции требуют им передать ссылку на какую-нибудь структуру.<br />Структура? А что такое структура?<br /></p><div class="codebox"><pre><code>struct S { int x; int y; }</code></pre></div><p>Памяти, насколько мне известно, эта структура занимает 8 байт (если, конечно, int занимает 4 байта). Первые 4 для переменной x, последние - для y.<br />Есть ли подобные конструкции в PHP? Вот вопрос.<br />Вот страничка официального сайта PHP:<br /><a href="http://www.php.net/manual/ru/spl.datastructures.php">http://www.php.net/manual/ru/spl.datastructures.php</a><br />Здесь есть несколько видов структур данных, но, кажется, ни один из них не подходит, кроме, казалось бы, &quot;Массивов&quot;. Описание:</p><div class="quotebox"><blockquote><p>структуры, которые хранят данные в непрерывном виде, доступные через индексы</p></blockquote></div><p>Может показаться, будто это то, что нужно, но на деле, наверное, это обычный массив, как в C/C++.</p><p>Вторая проблема. Структуры явно не передаются параметрами функции Win32API, они передаются по ссылкам. PHP умеет принимать аргументы пользовательских функций &quot;по ссылке&quot;, но передаются они при этом самым обычным способом, так, будто это и не ссылка.<br /></p><div class="codebox"><pre><code>function a ($s)
{
// ...
  $s = 1; // $s - копия переменной $b
}
$b = 10;
a($b); // передаём копию переменной $b
echo $b; // выведет 10


function c (&amp;$lnk) // принимаем ссылку
{
// ...
  $lnk = 30 // устанавливаем значение $d в 30
}
$d = 15;
c($d); // ПЕРЕДАЁМ ТАК, КАК ОБЫЧНУЮ ПЕРЕМЕННУЮ
echo $d; // 30</code></pre></div><p>Поэтому я совсем не уверен, что вообще можно передать именно ссылку. Но надеюсь, что ошибаюсь.</p><p>В любом случае, хотя бы одна из этих проблем существует, потому что, казалось бы, верный код:</p><div class="codebox"><pre><code>&lt;?php
$com = new COM(&quot;DynamicWrapperX&quot;);
$com-&gt;Register(&quot;user32&quot;, &quot;GetCursorPos&quot;, &quot;i=h&quot;, &quot;r=l&quot;);

$c = new SplFixedArray(2);
$com-&gt;GetCursorPos($c);
?&gt;</code></pre></div><p>Выдаёт такую ошибку:<br /></p><div class="quotebox"><blockquote><p>PHP Fatal error:&nbsp; Uncaught exception &#039;com_exception&#039; with message &#039;Error [0x80070057] Параметр задан неверно.<br />&#039; in D:\CODE\php\dynwrap.php:4<br />Stack trace:<br />#0 D:\CODE\php\dynwrap.php(4): com-&gt;GetCursorPos(Object(SplFixedArray))<br />#1 {main}<br />&nbsp; thrown in D:\CODE\php\dynwrap.php on line 4</p></blockquote></div><p>Надеюсь, кто-нибудь знает, как решить такую проблему.</p>]]></content>
			<author>
				<name><![CDATA[vo1ty]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=28909</uri>
			</author>
			<updated>2012-11-13T00:22:25Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=65573#p65573</id>
		</entry>
</feed>
