Сишные указатели в 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);
__out LPSTR lpBuffer,
__inout LPDWORD lpnSize);
Вопрос: как можно работать с такой функцией из цинк-приложения?
Примерно вот так:
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();
Цитата:
42002008
42002272
true
alexcon
42002272
true
alexcon
PS. Статья написана при участии chingachgoog.
[из реорганизованного раздела Flash Приложения: AIR, Zinc и тд.]
Всего комментариев 0
Комментарии
Последние записи от alexcon314
- Пишем свою оболочку для FP под Windows. Шаг 6. (19.05.2011)
- Пишем свою оболочку для FP под Windows. Шаг 5. (18.05.2011)
- Пишем свою оболочку для FP под Windows. Шаг 4. (18.05.2011)
- Пишем свою оболочку для FP под Windows. Шаг 3. (18.05.2011)
- Пишем свою оболочку для FP под Windows. Шаг 2. (17.05.2011)