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

Вернуться   Форум Flasher.ru > Блоги > alexcon314

Оценить эту запись

Сишные указатели в zinc-приложении.

Запись от alexcon314 размещена 19.04.2011 в 08:19

Одной из фич цинка является возможность динамически подключать в работу приложения библиотеки функций, написанных на с/с++. Речь идет о 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.

[из реорганизованного раздела Flash Приложения: AIR, Zinc и тд.]
Всего комментариев 0

Комментарии

 

 


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


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