?

Log in

 

Extended MAPI - Russian DotNet Alliance

About Extended MAPI

Previous Entry Extended MAPI 15 апр, 2006 @ 03:49 Next Entry
Приветствую, всех вас - о, знатоки framework!
У меня к вам есть вопрос, и, я надеюсь, что еще не все из вас забыли свои корни - С++.

Вопрос - применение MAPI через OOM.
Чтобы получить доступ из объекта MailItem к интерфейсу IMessage существует специальное свойство MAPIOBJECT, которое возвращает умный указатель на интерфейс IUnknown объекта, у которого существует нужный мне интерфейс IMessage. Проблема заключается в том, что я не знаю, где лежат идентификаторы интерфейсов - чтобы их можно было использовать в вызове queryinterface.
Может в каких заголовочных файлах вроде mapix.h или достаточно импорта одного mapi32.dll и там уже объявлены глобальные переменные?

Заранее спасибо!

P.S.
Жаль, что на данный момент получить доступ к свойству MAPIOBJECT из кода управляемых языков нелья:-(
Хотя есть достойная замена - доступ из dotNet впрямую к Extended MAPI?! Втупую создаем wrapper для mapi32.dll и что все готово? Не просто ли... Так почему один из известных MVP (создатель OutlookSpy) утверждал, что из, к примеру, того же C# это не получится?
Оставить комментарий
From:(Anonymous)
Date:Апрель, 15, 2006 08:31 (UTC)
(Link)
>Проблема заключается в том, что я не знаю, где лежат идентификаторы интерфейсов - чтобы их >можно было использовать в вызове queryinterface.
>Может в каких заголовочных файлах вроде mapix.h или достаточно импорта одного mapi32.dll и там >уже объявлены глобальные переменные?
Вся информация об интерфейсах лежит в библиотеке типов (TLB). Которая хранитя как ресурс в dll СОМ обьекта.
в проекте на C++ в stdafx.h вставляешь строчку типа
#import "имя_файла" rename_namespace("MAPI"), named_guids, raw_interfaces_only
потом обращаешься к идентификатору как MAPI::IID_чего-то там
P.S с тематикой данной не работал, но насчет wrapper, гугл по запросу mapiex .net выдает много результатов.
From:(Anonymous)
Date:Апрель, 15, 2006 08:34 (UTC)
(Link)
еще 2 копейки
на С++ я никогда QueryInterface не вызываю напрямую, ввиду очень полезного класса CComQIPtr

[User Picture Icon]
From:ustin_metka
Date:Апрель, 15, 2006 17:06 (UTC)
(Link)
Ага, но придется подключать библиотеки ATL, чего я пока успешно избегал - получается зря?:)))
Нет уж, помучаюсь с QueryInterface, тем более что CComQIPtr не скрывает Release.
[User Picture Icon]
From:ustin_metka
Date:Апрель, 15, 2006 17:05 (UTC)
(Link)
Спасибо, за ответ, только, возможно, я не правильно сформулировал свой вопрос.

Моя проблема не в директиве "import", с которой я знаком, а в библиотеке типов, которую требуется импортировать.
Собственно, мне было неизвестно, что импортировать? Где лежат идентификаторы интерфейсов объектов MAPI?

Так как после импорта библиотеки типов outlook (MSOUTL.OLB - описывающей соотвественно Object Outlook Model) идентификаторы интерфейсов, возвращаемые в свойстве MAPIOBJECT объектов OOM, не становятся известны компилятору (подключение атрибута auto_search к импортированию MSOUTL.OLB не помогло).

Естественно предположить, что нужно импортировать mapi32.dll и компилятор узнает все, что нужно. На опыте это подтвердилось.

Но где-то я читал, что ради одних идентификаторов интерфейсов MAPI необязательно импортировать mapi32.dll и достаточно подключить какой-то заголовочный файл, наподобие, "mapix.h" или "mapiguid.h".
Вот и хотелось узнать можно ли обойтись одним заголовочным файлом, если да, то каким именно ? В принципе в мсдн - это должно быть, но на компе у меня мсдн перестал работать, а на сайте майкрософт поиск по мсдн показывает мне упорно посторонние материалы :-(
[User Picture Icon]
From:ustin_metka
Date:Апрель, 15, 2006 17:15 (UTC)
(Link)
Большое спасибо jetsnail.


Интерфейс IMessage объявляется в файле "MAPIDEFS.H".
(Оставить комментарий)
Top of Page Разработано LiveJournal.com