Accessing an Outlook Add-in via redemption - outlook

Is is possible to access an outlook add-in via redemption, rather than me adding the add-in to my application, I am not sure if this is possible.

Redemption is a wrapper around Extended MAPI, not Outlook. So, it doesn't provide anything for dealing with Outlook features like add-ins.
You can get the Outlook running instance or create a new one of none exists and then access the COM add-ins list. The COMAddIns property of the Application class returns a COMAddIns collection that represents all the Component Object Model (COM) add-ins currently loaded in Microsoft Outlook.
Private Sub CountCOMAddins()
MsgBox "There are " & Application.COMAddIns.Count & " COM add-ins."
End Sub

Related

How to Detect if Office 365 web addin is installed or not?

We have a desktop app with which we want to integrate Office 365 calendar. We will have our users provide their consent by authorising the app in office 365. I wonder if I can use any specific permission and/or api that would help us know if our office 365 office.js addin is installed by that user. This works great with VSTO addin as we can get the info from system registry, however, as Office 365 addin is installed on cloud no such registry can be found and we won’t be able to know.
Exchange will create a subfolder for each installed web addin in a special folder named WebExtAddins. The folder is on the same level as the other special folders (e.g. the Inbox), but is hidden. You can see that folder (and its subfolders) in OutlookSpy (I am its author) - click IMsgStore button on the OutlookSpy ribbon, click "Open Folder", double click on the folder named WebExtAddins.
UPDATE April 2022 - it looks like Outlook no longer uses the WebExtAddins folder. Instead, the list of web addins is stored in a hidden (associated) message with the message class of "IPM.Configuration.ExtensionMasterTable" in the Inbox folder. The list is stored in the PR_ROAMING_XMLSTREAM binary property. The format of the property is not documented.
In EWS, the list of installed addins can be retrieved using the GetAppManifests operation. If you are using Outlook Object Model or Extended MAPI, your only option is parsing that blob.
For this particular case (figure out if a web addin is installed), the addin custom storage will be in a hidden (associated) message in Inbox folder with the message class of "IPM.Configuration.ClientExtension.<guid>", where <guid> is your addin's GUID. You should be able to asccess that hidden message using MAPIFolder.GetStorage("IPM.Configuration.ClientExtension.<guid>", olIdentifyByMessageClass) (where MAPIFolder is retrieved from Namespace.GetDefaultFolder(olFolderInbox))
It seems that there is no good way to check directly now. Just like you said,Office 365 add-in is installed on Cloud. Since it runs through a separate browser process (Like IE). After plug-ins are loaded, we typically see two IE processes in the process manager. Here's a detail. If your Office is 32-bit, then its core process will be a 32-bit one. You can see that if you load multiple plug-ins, the memory it uses will gradually increase. However, it is still a process.
Screenshot:
Also, if your Windows is 64-bit, it will create another 64-bit IE process which is actually a call relationship. As you can see from the diagram below, the 32-bit process is actually calling the 64-bit process.

Programmatically accessing archived mails in an Exchange folder

I am trying to access all the mails in a given folder via the ActiveX interface to Outlook 2013. I use the message API (MAPI) of Outlook to get the desired folder object.
However, when I go through all the items of this folder object, many messages are missing. Indeed, there are messages that are on the MS Exchange server that are not synchronized with Outlook because they are too old. (In Outlook, the folder ends with a link named 'Click here to view more on Microsoft Exchange'. When clicking on the link, the missing messages appear in Outlook. However they are not added to the folder object after this operation.)
How to access those messages? Is it possible via the Outlook ActiveX interface? If not, is there an equivalent interface to the MS Exchange server?
To access older (but not archived) emails, you can either
Set the Exchange account to sync all items in the Exchange account properties dialog. Outlook must be restarted.
Set the Exchange account to sync all items programmatically. You can do that using Extended MAPI (C++ or Delphi only), there is a flag that needs to be set in the MSEMS store profile section (the property tag is 0x66490003). Redemption (I am its author - any language) exposes the RDOExchangeMailboxStore.MonthsToKeepOffline / DaysToKeepOffline properties. Outlook must be restarted.
Open the parent folder in the online mode using the MAPI_NO_CACHE flag when calling IMsgStore::OpenEntry (Extended MAPI, C++ or Delphi only). Redemption (I am its author) lets you pass that flag when you open the folder using RDOSession.GetFolderFromID from any language.

Outlook 2013 VSTO Addin - How to check if the Mail view is selected?

In an Outlook 2013 VSTO addin (C#), I can check to see if the user is currently in the Calendar area/view by using "if(ActiveExplorer().CurrentView is CalendarView) ..."
How do I do something similar to check and see if the user is in the Mail view, where "Mail" is selected/blue at the bottom of the Outlook window and the user sees their Inbox items? There is no MailView type, or anything similar that I could find, to compare ActiveExplorer().CurrentView, etc., against.
Instead of using the CurrentView property of the Explorer class I'd suggest checking the DefaultItemType property of the Folder class. It returns a constant from the OlItemType enumeration indicating the default Outlook item type contained in the folder.
The CurrentFolder property of the Folder class returns a Folder object that represents the current folder displayed in the explorer. So, the code may look like the following one:
ActiveExplorer().CurrentFolder.DefaultItemType

Outlook 2007 Add-in form containing form with ActiveX control stuck in one off state

I have an add-in that contains a DLL and an OCX control, built in VB6. Each is separate, meaning that the add-in consists of Addin.DLL and Addin.OCX. The add-in uses a custom form, which is built off of the IPM.Appointment form in Outlook. It is deployed to the user's machine as an OFT file and is published to their Presonal Forms Library in the initial OnConnection of the add-in.
I was having issues with the form being stuck in a one off state, which required me to add code similar the following to my AppointmentItem Write and PropertyChange class:
Private Sub AppointmentItem_PropertyChange(ByVal name As String)
On Error GoTo ErrorHandler
Select Case name
Case "MessageClass"
Dim strGuid As String
' Check to see if this is one of our appointmentitems.
If IsItemUserItem(AppointmentItem_PropertyChange, strGuid) Then
' Change to our add-in message class. IPM.Appointment.XXX
AppointmentItem.MessageClass = gFormMsgClass
End If
End Select
done:
Exit Sub
ErrorHandler:
Trace "Error writing appointment item."
Resume done
End Sub
This works for most cases. However, I'm still running into instances where when I check the item during the NewInspector event if it is an Exception I cannot access UserProperties, which are used to facilitate data sharing between the DLL and OCX.
Additionally when trying to edit the form in the form designer, I cannot save the form as an OFT from Outlook 2007. I'm kind of at a loss as to what is going on with this...Any help is appreciated.
Actually it appears I have my own answer. There were some user-defined properties added to the folder that were not added to the item and they were causing the one off issues.

How can I programatically tell what Outlook addins are installed, and if they are enabled or not?

How do I determine what Outlook COM or PIA addins are installed, and if they are enabled or not.
How can I get this information, and hopefully the file version as well?
(1) If you want to access this information from inside another Outlook Add-in, you may use the the Application.ComAddins object (e.g. it's Count property gives you the number of add-ins installed). You can loop through this collection and check the LoadBehaviour property of the single COMAddin object to now if they're loading or if they're disabled.
(2) If you wand to access the information from outside of Outlook, you may consider to read the appropriate registry entries under the Software\Microsoft\Office\Outlook\Addins key.
(3) Please be aware that you cannot trust this information at all, because Office add-ins can be installed either for a single user or for all users. So you cannot access the installed add-ins absolutely, but only for the current user running your app /your procedure, by reading the abovementioned key (a) under HKLM and (b) under HKCU. The Application.COMAddins object shows you both information blended in one.
(4) I don't recall that a version number is available either in the COMAddin object or in the registry. To access that, you'll have to read the registry to find the file or assembly of the add-in, and access the file version. Please note that "old" COM Add-ins written in Visual Basic 6 or another language have other registry entries than VSTO add-ins or add-ins based on the Add-in Express tool.
To determine which installed add-ins are active (enabled/loaded):
'Loop through all installed add-ins and show whether they are active or not.
Dim app As New Outlook.Application
Dim name As String
Dim loaded As Boolean
For i = 1 To app.COMAddIns.Count
name = app.COMAddIns.Item(i).Description
loaded = app.COMAddIns.Item(i).Connect 'Returns True for active, False for inactive
MsgBox(name & ": " & loaded)
Next
To check the status of a specific add-in by name:
Dim app As New Outlook.Application
Dim addinName As String = "ADD-IN NAME"
Dim loaded As Boolean = app.COMAddIns.Item(addinName).Connect
MsgBox(addinName & ": " & loaded)
You can access that information even from outside of outlook.
Dim count As Integer
Dim app As New Outlook.Application
count = app.COMAddIns.Count
For i = 1 To count
MsgBox(app.COMAddIns.Item(0).Description)
Next

Resources