Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > Flash Приложения: AIR, Zinc и тд. > Статьи

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.01.2011, 16:23
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 1  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
По умолчанию Сишные указатели в zinc-приложении.

Одной из фич цинка является возможность динамически подключать в работу приложения библиотеки функций, написанных на с/с++. Речь идет о DLL- dynamic link library. DLL могут быт самописные, что дает в руки разработчика инструмент расширений. Но могут использоваться и готовые DLL, в т.ч. и системные, например, kernel32.dll, advpi32.dll, user32.dll и т.д. и т.п. В примерах к цинку, даже здесь на форуме, можно найти пример использования функции Beep() из kernel32. Еще примеры использования системных DLL можно посмотреть здесь (контроль над мышью, получение списка логических дисков, программное изменение раскладки). Все выглядит ок. Но... большое количество функций Win-API, crt принимают параметром указатель, причем параметр может быть и выходным. Это служит серьезным препятствием в их использовании. Из флэш-приложения работать с указателями нельзя. Тем не менее, не будем торопиться с выводами.
Что есть указатель? Грубо говоря, это переменная, хранящая адрес другой переменной. (Да простят меня знатоки с/c++, я рассказываю сейчас все это не для холивара). Проще говоря, это число (адрес памяти). Давйте посмотрим, что можно выжать из этой простой и незатейливой мысли.
В качестве примера рассмотрим простую функцию из advpi32 GetUserNameA(). Вот ее описание:
Цитата:
BOOL WINAPI GetUserNameA(
__out LPSTR lpBuffer,
__inout LPDWORD lpnSize);
Как видим, функция возвращает BOOL, а само желаемое имя пользователя сохраняется в буфере, указатель на который функция принимает первым параметром. Мало того, второй параметр есть указатель на DWORD является inout, т.е. он считывается в начале работы функции и туда что-то записывается по итогам работы функции, а именно размер буфера, и коиличество занесенных в него символов.
Вопрос: как можно работать с такой функцией из цинк-приложения?
Примерно вот так:
Код AS1/AS2:
var msvcrt = new mdm.DLL("msvcrt.dll");
// загружаем msvcrt.dll
msvcrt.addParameter("integer", 0xff);
var memU = msvcrt.call("integer", "malloc");
// при помощи malloc() выделяем память под имя пользователя.
// тут нам в memU возвращается адрес первого байта буфера!
out.text += memU + newline;
// очистка
msvcrt.clear();
msvcrt.addParameter("integer", 4);
// при помощи malloc() выделяем память под DWORD.
// тут нам в memN возвращается адрес первого байта DWORD!
var memN = msvcrt.call("integer", "malloc");
out.text += memN + newline;
// очистка
msvcrt.clear();
msvcrt.addParameter("integer", memN);
msvcrt.addParameter("integer", 0xff);
msvcrt.addParameter("integer", 1);
// устанавливаем c помощью memset 1-й байт DWORD в 0xff;
msvcrt.call("integer", "memset");
// очистка
msvcrt.clear();
var advapi32 = new mdm.DLL("Advapi32.dll");
advapi32.addParameter("integer", memU);
advapi32.addParameter("integer", memN);
// ВНИМАНИЕ! Передаем указатели (то бишь адреса наших буфера и DWORD) в GetUserNameA()
var b = advapi32.call("boolean","GetUserNameA");
out.text += b + newline;
// очистка
advapi32.clear();
// а теперь финт ушами
msvcrt.addParameter("integer", memU);
msvcrt.addParameter("integer", memU);
msvcrt.addParameter("integer", 0xff);
// копируем буфер сам в себя, memcpy возвратит указатель на него-же, и мы во флеше получим строку.
// цинк послушно преобразует буфер в String согласно типу указанного возвращаемого значения.
var u = msvcrt.call("string", "memcpy");
out.text += u + newline;
// очистка
msvcrt.clear();
msvcrt.addParameter("integer", memU);
msvcrt.call("integer", "free");
msvcrt.clear();
msvcrt.addParameter("integer", memN);
msvcrt.call("integer", "free");
msvcrt.clear();
msvcrt.close();
advapi32.close();
Вот так выгладит out (текстовое поле с выводом промежуточных результатов)
Цитата:
42002008
42002272
true
alexcon
Как видите, все работает!
PS. Статья написана при участии chingachgoog.

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:22.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Вкл.


 


Часовой пояс GMT +4, время: 19:22.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.