У меня есть приложение на C ++, и я пишу новую надстройку для Outlook, которая, я думаю, будет с VSTO.Я хочу иметь связь между тем и пытаюсь найти лучший способ сделать это.В MS docs они упоминают, как представить ваш COM-класс внешним решениям, используя RequestComAddInAutomationService
.Я очень новичок в COM, но я прочитал некоторые онлайн и получил следующее решение.Я прочитал, что вы должны создать надстройку (для x86 в качестве моей версии Outlook, а не AnyCPU), взять созданный файл .tlb
и преобразовать его в .tlh
, используя директиву #import
, а затем #include
файл .tlh
должен иметь соответствующие типы.
ThisAddin.cs
namespace FirstOutlookAddIn
{
public partial class ThisAddIn
{
Outlook.Inspectors inspectors;
private AddInUtilities gUtilities;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
inspectors = this.Application.Inspectors;
inspectors.NewInspector +=
new Microsoft.Office.Interop.Outlook.InspectorsEvents_NewInspectorEventHandler(Inspectors_NewInspector);
}
void Inspectors_NewInspector(Microsoft.Office.Interop.Outlook.Inspector Inspector)
{
Outlook.MailItem mailItem = Inspector.CurrentItem as Outlook.MailItem;
if (mailItem != null)
{
if (mailItem.EntryID == null)
{
gUtilities.SetMailItem(mailItem);
mailItem.Subject = "This text was added by using code";
mailItem.Body = "This text was added by using code";
}
}
}
protected override object RequestComAddInAutomationService()
{
if (gUtilities == null)
gUtilities = new AddInUtilities();
return gUtilities;
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
// Note: Outlook no longer raises this event. If you have code that
// must run when Outlook shuts down, see https://go.microsoft.com/fwlink/?LinkId=506785
}
#region VSTO generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
#endregion
}
}
IAddInUtilities.cs
using System.Runtime.InteropServices;
namespace FirstOutlookAddIn
{
[ComVisible(true)]
public interface IAddInUtilities
{
void MyExportedFunction();
}
}
AddInUtilities.cs
using Outlook = Microsoft.Office.Interop.Outlook;
using System.Runtime.InteropServices;
namespace FirstOutlookAddIn
{
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class AddInUtilities : StandardOleMarshalObject, IAddInUtilities
{
Outlook.MailItem globalMailItem;
public void SetMailItem(Outlook.MailItem item) => globalMailItem = item;
public void MyExportedFunction()
{
globalMailItem.Body = "I was called from outside!";
}
}
}
main.cpp
//#import "FirstOutlookAddIn.tlb" named_guids raw_interfaces_only
#include <iostream>
struct IUnknown; // Workaround for "combaseapi.h(229): error C2187: syntax error: 'identifier' was unexpected here" when using /permissive-
#include <Objbase.h>
#include "Debug\FirstOutlookAddIn.tlh"
int main() {
CoInitializeEx(nullptr, COINIT_MULTITHREADED);
FirstOutlookAddIn::IAddInUtilities* pIFace;
// create the object and obtain a pointer to the sought interface
auto res = CoCreateInstance(
FirstOutlookAddIn::CLSID_AddInUtilities,
nullptr,
CLSCTX_LOCAL_SERVER,
FirstOutlookAddIn::IID_IAddInUtilities,
(LPVOID*)&pIFace);
if (res != S_OK)
{
std::cout << "Failed with: " << res;
}
auto res1 = pIFace->MyExportedFunction(); // use the object
std::cout << "Res: " << res1;
pIFace->Release(); // free the object
CoUninitialize();
}
Проблема заключается вCoCreateInstance
возвращает REGDB_E_CLASSNOTREG Class not registered
.Соответствующее дерево реестра выглядит следующим образом:
HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ Classes \ CLSID {5008A102-08E5-3F59-AADD-03875524CAD0} = FirstOutlookAddIn.AddInUtilities Computer \ HKEYM_ \ WID \ WID \ WALD \ WALDWINS \ \ COW_64_W64 \ WDK \ W64 \ \ \ \ W64 \ \ \ \ \ \ W64 \ \ \ \ W64 \ \ \ W64 \ \5008A102-08E5-3F59-AADD-03875524CAD0} \ InprocServer32:
Компьютер \ HKEY_LOCAL_MACHINE \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ WOW6432Node \ Classes \ CLSID {5008A102-08E5-3F59-AADD0.05 0 0 0 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 0 038 0:
Компьютер \ HKEY_LOCAL_MACHINE \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ WOW6432Node \ Classes \ CLSID {5008A102-08E5-3F59-AADD-03875524CAD0} \ ProgId = FirstOutlookAddIn.Правильно ли я понимаю, что у меня есть возможность загрузки этой библиотеки из Outlook.exe и возможности вызывать в ней функции из внешнего приложения?Заранее спасибо !!!