Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: PHP: Ссылки, указатели, WINAPI и DynamicWrapperX
Форумы портала PHP.SU » » Операционная система и системные вызовы » PHP: Ссылки, указатели, WINAPI и DynamicWrapperX

Страниц (1): [1]
 

1. vo1ty - 13 Ноября, 2012 - 11:16:32 - перейти к сообщению
Доброго времени суток! Думал написать на PHP приложение, использующее Windows API. Сначала решил узнать, как оно вообще, можно ли вообще это сделать.

w32api уже использовать нельзя, его выпилили из PHP, насколько я знаю.
Поэтому вариант выбрал следующий: Использую DynamicWrapperX (http://www[dot]script-coding[dot]com/dynwrapx[dot]html ) и COM, который из PHP разработчики ещё не выдернули. И, в общем-то, это работает для простых вызовов вроде MessageBoxA();.

Проблема здесь не одна, а целых две. Первая заключается в том, что некоторые функции требуют им передать ссылку на какую-нибудь структуру.
Структура? А что такое структура?
CODE (text):
скопировать код в буфер обмена
  1. struct POINT { int x; int y; }

Памяти, насколько мне известно, эта структура занимает 8 байт (если, конечно, int занимает 4 байта). Первые 4 для переменной x, последние - для y.
Есть ли подобные конструкции в PHP? Вот вопрос.
Вот страничка официального сайта PHP:
http://www.php.net/manual/ru/spl...tastructures.php
Здесь есть несколько видов структур данных, но, кажется, ни один из них не подходит, кроме, казалось бы, "Массивов". Описание:
Цитата:
структуры, которые хранят данные в непрерывном виде, доступные через индексы

Может показаться, будто это то, что нужно, но на деле, наверное, это обычный массив, как в C/C++.

Вторая проблема. Структуры явно не передаются параметрами функции Win32API, они передаются по ссылкам. PHP умеет принимать аргументы пользовательских функций "по ссылке", но передаются они при этом самым обычным способом, так, будто это и не ссылка.
CODE (text):
скопировать код в буфер обмена
  1. function a ($s)
  2. {
  3. // ...
  4.   $s = 1; // $s - копия переменной $b
  5. }
  6. $b = 10;
  7. a($b); // передаём копию переменной $b
  8. echo $b; // выведет 10
  9.  
  10.  
  11. function c (&$lnk) // принимаем ссылку
  12. {
  13. // ...
  14.   $lnk = 30 // устанавливаем значение $d в 30
  15. }
  16. $d = 15;
  17. c($d); // ПЕРЕДАЁМ ТАК, КАК ОБЫЧНУЮ ПЕРЕМЕННУЮ
  18. echo $d; // 30

Поэтому я совсем не уверен, что вообще можно передать именно ссылку. Но надеюсь, что ошибаюсь.

В любом случае, хотя бы одна из этих проблем существует, потому что, казалось бы, верный код:
CODE (text):
скопировать код в буфер обмена
  1. <?php
  2. $com = new COM("DynamicWrapper");
  3. $com->Register("user32", "GetCursorPos", "i=h", "r=l");
  4.  
  5. $c = new SplFixedArray(2);
  6. $com->GetCursorPos($c);
  7. ?>

Выдаёт такую ошибку:
Цитата:
PHP Fatal error: Uncaught exception 'com_exception' with message 'Error [0x80070057] Параметр задан неверно.
' in D:\CODE\php\dynwrap.php:4
Stack trace:
#0 D:\CODE\php\dynwrap.php(4): com->GetCursorPos(Object(SplFixedArray))
#1 {main}
thrown in D:\CODE\php\dynwrap.php on line 4

Надеюсь, кто-нибудь знает, как решить такую проблему.

 

Powered by ExBB FM 1.0 RC1