Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Accessing COM Objects from Assembly

Основными операциями, в которых участвуют указатели являются

присваивание, получение адреса, выборка.

Присваивание является двухместной операцией, оба операнда

которой - указатели. Как и для других типов, операция присваива-

ния копирует значение одного указателя в другой, в результате оба

указателя будут содержать один и тот же адрес памяти. Если оба

указателя, участвующие в операции присваивания типизированные, то

оба они должны указывать на объекты одного и того же типа.

Операция получения адреса - одноместная, ее операнд может

иметь любой тип, результатом является типизированный (в соответс-

твии с типом операнда) указатель, содержащий адрес объекта-опе-

ранда.

Операция выборки - одноместная, ее операндом является типи-

зированный (обязательно!) указатель, результат - данные, выбран-

ные из памяти по адресу, заданному операндом. Тип результата оп-

ределяется типом указателя-операнда.

Перечисленных операций достаточно для решения задач приклад-

ного программирования поэтому набор операций над указателями, до-

пустимых в языке Pascal, этим и ограничивается. Системное прог-

раммирование требует более гибкой работы с адресами, поэтому в

языке C доступны также операции адресной арифметики, которые опи-

сываются ниже.

К указателю можно прибавить целое число или вычесть из него

целое число. Поскольку память имеет линейную структуру, прибавле-

ние к адресу числа даст нам адрес области памяти, смещенной на

это число байт (или других единиц измерения) относительно исход-

ного адреса. Результат операций "указатель + целое", "указатель -

целое" имеет тип "указатель".

Можно вычесть один указатель из другого (оба указателя-опе-

ранда при этом должны иметь одинаковый тип). Результат такого вы-

читания будет иметь тип целого числа со знаком. Его значение по-

казывает на сколько байт (или других единиц измерения) один адрес

отстоит от другого в памяти.

Отметим, что сложение указателей не имеет смысла. Поскольку

программа разрабатывается в относительных адресах и при разных

своих выполнениях может размещаться в разных областях памяти,

сумма двух адресов в программе будет давать разные результаты при

разных выполнениях. Смещение же объектов внутри программы друг

относительно друга не зависит от адреса загрузки программы, поэ-

тому результат операции вычитания указателей будет постоянным, и

такая операция является допустимой.

Операции адресной арифметики выполняются только над типизи-

рованными указателями. Единицей измерения в адресной арифметике

является размер объекта, который указателем адресуется. Так, если

переменная ipt определена как указатель на целое число (int

*ipt), то выражение ipt+1 даст адрес, больший не на 1, а на коли-

чество байт в целом числе (в MS DOS - 2). Вычитание указателей

также дает в результате не количество байт, а количество объектов

данного типа, помещающихся в памяти между двумя адресами. Это

справедливо как для указателей на простые типы, так и для указа-

телей на сложные объекты, размеры которых составляют десятки,

сотни и более байт.

В связи с имеющимися в языке C расширенными средствами рабо-

ты с указателями, следует упомянуть и о разных представлениях

указателей в этом языке. В C указатели любого типа могут быть

ближними (near) и дальними (far) или (huge). Эта дифференциация

связана с физической структурой адреса в i8086, которая была

рассмотрена выше. Ближние указатели представляют собой смещение в

текущем сегменте, для представления такого указателя достаточно

одного 16-разрядного слова. Дальние указатели представляются дву-

мя 16-разрядными словами - сегментом и смещением. Разница между

far или huge указателями состоит в том, что для первых адресная

арифметика работает только со смещением, не затрагивая сегментную

часть адреса, таким образом, операции адресной арифметики могут

изменять адрес в диапазоне не более 64 Кбайт; для вторых - в ад-

ресной арифметике участвует и сегментная часть, таким образом,

предел изменения адреса - 1 Мбайт.

Впрочем, это различие в представлении указателей имеется

только в системах программирования, работающих в среде MS DOS, в

современных же операционных системах, поддерживающих виртуальную

адресацию, различий между указателями нет, все указатели можно

считать гигантскими.

 

Accessing COM Objects from Assembly

 

Ernest Murphy ernie@surfree.com

 

Revised Dec 26 2000 for inclusion as part of MASM32

Revised July 10 2000 for the new form of coinvoke.

 

Sample code for this article is available at...\COM\examples\shortcut

 

 

Abstract:
--------------------------------------------------------------------------------------------------------------------

The COM (Component Object Model) is used by the Windows operation system in increasing ways. For example, the shell.dll uses COM to access some of its API methods. The IShellLink and IPersistFile interfaces of the shell32.dll will be demonstrated to create a shortcut shell link. A basic understanding of COM is assumed. The code sample included is MASM specific.

 

 

Introduction:
--------------------------------------------------------------------------------------------------------------------

COM may seem complicated with it's numerous details, but in use these complications disappear into simple function calls. The hardest part is understanding the data structures involved so you can define the
interfaces. I apologize for all the C++ terminology used in here. While COM is implementation neutral, it borrows much terminology from C++ to define itself.

 

In order to use the COM methods of some object, you must first instance or create that object from its coclass, then ask it to return you a pointer to it's interface. This process is performed by the API function CoCreateInstance. When you are done with the interface you call it's Release method, and COM and
the coclass will take care of deleting the object and unloading the coclass.

 

A COM object is referred to as the SERVER. The program that calls up a COM object so it may use it is referred to as the CLIENT.

 

 

Assessing COM Methods
--------------------------------------------------------------------------------------------------------------------
To use COM methods you need to know before hand what the interface looks like. Even if you "late bind" through an IDispatch interface, you still need to know what IDispatch looks like. A COM interface is just table of pointers to functions. Let's start with the IUnknown interface. If you were to create a component that simply exports the IUnknown interface, you have a fully functional COM object (albeit on the level of "Hello World"). IUnknown has the 3 basic methods of every interface, since all interfaces inherit from IUnknown. Keep in mind all an interface consists of is a structure of function pointers. For IUnknown, it looks like this:

 




Дата добавления: 2014-12-18; просмотров: 125 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2025 год. (0.008 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав