В следующем примере демонстрируется вызов функции с именем evalute, которая определена в теле html-страницы следующим образом.
<SCRIPT>
function evaluate(x) {
alert(x + "= " + eval(x));
}
</SCRIPT>
// Эта функция выполняет скрипт
void CMyHtmlView::OnCallscript() {
HRESULT hr;
LPDISPATCH pDispatch = GetHtmlDocument();
if (pDispatch == NULL) return;
IHTMLDocument* pHtmlDoc;
hr = pDispatch->QueryInterface(__uuidof(IHTMLDocument), (void**)&pHtmlDoc);
LPDISPATCH pScript;
pHtmlDoc->get_Script(&pScript);
pScript->AddRef();
if (SUCCEEDED(hr)) {
// Получаем DISPID интересуемой функции
OLECHAR* szMember = L"evaluate";
DISPID dispid;
HRESULT hr = pScript->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if (SUCCEEDED(hr)) {
// Выполняем
COleVariant vtResult;
static BYTE parms[] = VTS_BSTR;
COleDispatchDriver dispDriver(pScript);
dispDriver.InvokeHelper(dispid, DISPATCH_METHOD, VT_VARIANT, (void*)&vtResult, parms, "5+Math.sin(9)");
}
}
pScript->Realease();
pHtmlDoc->Release();
pDispatch->Release();
}
ФОРУМ RSDN – ИЗБРАННОЕ
Тема: Коллеги, улыбнитесь
От: adonz
…В продолжение темы:
• Главная программа – функции malloc: Прошу обеспечить выделение 257 килобайт Conventional Memory.
• Функция malloc – операционной системе: Прошу выделить 257 килобайт Conventional Memory в связи с производственной необходимостью.
• Операционная система – главной пpограмме: Выделить 257 килобайт Conventional Memory не представляется возможным в связи с отсутствием таковых. Есть 3 мега Extended. Берете?
• Главная программа – обработчику исключений: С памятью облом. Что делать будем?
• Обработчик исключений – процедуре оптимизации: Необходимо добиться экономии памяти за счет более pационального использования системных ресурсов.
• Контроллер прерываний – обработчику прерываний: Тут это… юзер кнопку нажал…
• Главная программа – обработчику прерываний: Hе дергайся! Подержит и отпустит.
• Процедуpа оптимизации – обработчику исключений: Готово!
• Главная программа – обработчику исключений: Ну что там?
• Обработчик исключений – главной программе: Еще хуже стало. Может, на диск посвопимся?
• Главная программа – жесткому диску: Прошу принять на хpанение swap-файл в размере 257 килобайт.
• Жесткий диск – главной программе: Ваша просьба не может быть удовлетворена за недостатком места.
• Главная программа – опеpационной системе: Что еще за глюк? Было же место!
• Жесткий диск – главной программе: Ничего не глюк. Вы еще прошлый swap-файл на 4 мега не забрали. А я, между пpочим, не резиновый. И даже не stacker'ный.
• Контроллер прерываний – обработчику прерываний: Тут это… юзер опять кнопку давит…
• Обработчик прерываний – PC speaker'у: Hу скажи ему что-нибудь, пусть отвяжется!
• PC speaker – юзеру: Биип!
• Главная программа – операционной системе: Ну может можно чего-нибудь перераспределить?
• Операционная система – главной программе: Другим задачам тоже память нужна. Вам что, General Protection Error схлопотать охота?
• Главная программа – хакерской функции: Ну-ка выясни, кто там отожрал всю память, и выкини их к XTшной матеpи!
• Контроллер прерываний – обработчику прерываний: Тут юзер Ctrl-Alt-Del жмет!
• Главная программа – обработчику прерываний: Да отруби ты этому зануде клавиатуpу! Мы тут делом заняты…
• Хакерская функция – главной программе: Опаньки!
• Главная программа – операционной системе: Ну что там? Сколько памяти свободно?
• Операционная система – главной программе: 320 Conventional и… ой, куда это Extended Memory Manager делся?
• Главная программа – хакерской функции: Ты что начистила, сволочь?
• Хакерская функция – главной программе: А чо я, чо я? Мне сказали – выкинуть, я и выкидываю!
• Функция malloc – операционной системе: Прошу выделить 257 килобайт Conventional Memory в связи с производственной необходимостью.
• Операционная система – главной программе: Не могу. У меня в Extended Memory важные данные лежали. И вообще, я с вами скоро повешусь!
• Кнопка Reset – процессору: Ну что? Доигрались?
… ХОЛОДHЫЙ РЕСТАРТ…
• Autoexec.bat – главной программе: Так на чем мы остановились?
Это все на сегодня. Пока!
Алекс Jenter [email protected] Duisburg, 2001. Публикуемые в рассылке материалы принадлежат сайту RSDN.
Программирование на Visual C++
Выпуск №57 от 23 декабря 2001 г.
Здравствуйте, дорогие подписчики!
Опять я к сожалению заставил вас недоумевать, почему не выходит рассылка. Дело в том, что мне по личным причинам пришлось срочно поехать в другой город и пробыть там две недели. Выпускать рассылку оттуда в это время не было никакой возможности. Само собой разумеется, что теперь рассылка будет выходить вовремя. Я искренне прошу прощения и надеюсь на ваше понимание. Ну а теперь – к делу! Ведь за это время на сайте RSDN появилось много интересного…
СТАТЬЯ
GDI+
Часть 1. Краткое знакомство
Автор: Виталий Брусенцев
Демонстрационное приложение на C++ (требует наличия GDI+) – 88 Кб.
Демонстрационное приложение на C# (требует CLR) – 62 Кб.
За последний год компания Microsoft подготовила разработчикам множество сюрпризов. Новые продукты и технологии буквально завладели вниманием околокомпьютерного мира. Пока неясно, насколько успешным будет дебют технологии .NET и основанных на ней программных продуктов и средств разработки. Но одно из новшеств, безусловно, уже завоевало признание разработчиков, связанных с графикой и мультимедиа, – технология GDI+. Именно она, вернее, основанный на ней новый графический интерфейс является "лицом" новых операционных систем – Windows XP и .NET Server.
Что же такое GDI+? Официальная документация скромно называет ее Class-based API, то есть основанным на классах интерфейсе прикладных программ. Так как она встроена в Windows XP и .NET Server, ее называют частью этих операционных систем. Часто встречается также определение "библиотека" или "библиотека классов". В действительности, предоставляемый GDI+ набор классов является тонкой оболочкой над множеством обычных функций, реализованных в одной динамической библиотеке GdiPlus.dll. В общем, имея все это в виду, будем для краткости далее называть ее просто библиотекой.
Итак, GDI+ – это библиотека, призванная заменить существующий уже больше 11 (или 18 – как считать) лет интерфейс GDI, являющийся графическим ядром предыдущих версий Windows. Она сочетает в себе (по крайней мере, по замыслу) все достоинства своего предшественника и предоставляет множество новых мощных возможностей. Кроме того, при ее проектировании заранее ставилась цель наименее болезненного переноса приложений на 64-битные платформы. Следовательно, хотя существующие GDI-приложения будут выполняться на новых версиях Windows, для новых проектов следует использовать GDI+.
Заглянем "под капот"
Что новенького?Далее мы еще будем рассматривать специфические (и такие эффектные!) возможности GDI+. Здесь же только опишем основные новшества.
Достоинства C++ – реализации:
• Объектно-ориентированный интерфейс: благодаря поддержке компилятора C++ мы "бесплатно" получаем контроль над типами и временем жизни объектов.
• Прозрачное управление памятью: объекты ядра GDI+ создаются в куче с помощью собственного менеджера памяти прозрачно для программиста.
• Использование перегрузки имен функций: функции одного назначения различаются только по своим параметрам.
• Собственное пространство имен: позволяет использовать понятные имена типов – такие, как Rect, Pen и Matrix – без конфликтов с другими библиотеками.
• Перегрузка операторов: предоставляет удобные операции '+' и '-' для таких типов, как Point и Size.
Архитектурные новинки библиотеки:
• Аппаратная абстракция: как уже было замечено, упрощается перенос на 64-битные платформы.
• теперь можно не бояться "оставить выбранной кисть в контексте перед удалением" – такая типичная для GDI ошибка! Новый дизайн графических функций/объектов:
• Разделение функций закраски и отрисовки: предоставляет большую гибкость в рисовании, например, позволяет заливать незамкнутые фигуры.
• Появление графических контейнеров: контейнеры позволяют "сцепить" вместе несколько операций и использовать как одну команду.
• Увеличившаяся поддержка путей (paths) и их взаимодействия с регионами: теперь пути являются полноправными объектами вне контекста рисования и могут легко трансформироваться в регионы.