Add some more oom helpers
authorAndre Heinecke <aheinecke@intevation.de>
Fri, 14 Oct 2016 08:10:24 +0000 (10:10 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Fri, 14 Oct 2016 08:10:24 +0000 (10:10 +0200)
* src/oomhelp.cpp (get_strong_reference): New obtain a strong
reference through the application object.
(invoke_oom_method_with_params): New. Useful helper.
(invoke_oom_method): Use invoke_oom_method_with_params.

--
The get_strong_reference code is left over from experiments how
to fix the occassional crash when sending. Didn't work but it
might be useful in the future.

src/oomhelp.cpp
src/oomhelp.h

index 32c83f9..8e107c5 100644 (file)
@@ -1165,6 +1165,40 @@ get_object_by_id (LPDISPATCH pDisp, REFIID id)
   return disp;
 }
 
   return disp;
 }
 
+LPDISPATCH
+get_strong_reference (LPDISPATCH mail)
+{
+  VARIANT var;
+  VariantInit (&var);
+  DISPPARAMS args;
+  VARIANT argvars[2];
+  VariantInit (&argvars[0]);
+  VariantInit (&argvars[1]);
+  argvars[1].vt = VT_DISPATCH;
+  argvars[1].pdispVal = mail;
+  argvars[0].vt = VT_INT;
+  argvars[0].intVal = 1;
+  args.cArgs = 2;
+  args.cNamedArgs = 0;
+  args.rgvarg = argvars;
+  LPDISPATCH ret = NULL;
+  if (!invoke_oom_method_with_parms (
+      GpgolAddin::get_instance()->get_application(),
+      "GetObjectReference", &var, &args))
+    {
+      ret = var.pdispVal;
+      log_oom ("%s:%s: Got strong ref %p for %p",
+               SRCNAME, __func__, ret, mail);
+    }
+  else
+    {
+      log_error ("%s:%s: Failed to get strong ref.",
+                 SRCNAME, __func__);
+    }
+  VariantClear (&var);
+  return ret;
+}
+
 LPMESSAGE
 get_oom_message (LPDISPATCH mailitem)
 {
 LPMESSAGE
 get_oom_message (LPDISPATCH mailitem)
 {
@@ -1230,7 +1264,8 @@ get_oom_base_message (LPDISPATCH mailitem)
 }
 
 int
 }
 
 int
-invoke_oom_method (LPDISPATCH pDisp, const char *name, VARIANT *rVariant)
+invoke_oom_method_with_parms (LPDISPATCH pDisp, const char *name,
+                              VARIANT *rVariant, DISPPARAMS *params)
 {
   HRESULT hr;
   DISPID dispid;
 {
   HRESULT hr;
   DISPID dispid;
@@ -1242,7 +1277,7 @@ invoke_oom_method (LPDISPATCH pDisp, const char *name, VARIANT *rVariant)
       DISPPARAMS dispparams = {NULL, NULL, 0, 0};
 
       hr = pDisp->Invoke (dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
       DISPPARAMS dispparams = {NULL, NULL, 0, 0};
 
       hr = pDisp->Invoke (dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
-                          DISPATCH_METHOD, &dispparams,
+                          DISPATCH_METHOD, params ? params : &dispparams,
                           rVariant, &execpinfo, NULL);
       if (hr != S_OK)
         {
                           rVariant, &execpinfo, NULL);
       if (hr != S_OK)
         {
@@ -1256,6 +1291,12 @@ invoke_oom_method (LPDISPATCH pDisp, const char *name, VARIANT *rVariant)
   return 0;
 }
 
   return 0;
 }
 
+int
+invoke_oom_method (LPDISPATCH pDisp, const char *name, VARIANT *rVariant)
+{
+  return invoke_oom_method_with_parms (pDisp, name, rVariant, NULL);
+}
+
 LPMAPISESSION
 get_oom_mapi_session ()
 {
 LPMAPISESSION
 get_oom_mapi_session ()
 {
index 65a489f..8654505 100644 (file)
@@ -218,6 +218,18 @@ get_oom_message (LPDISPATCH mailitem);
 LPMESSAGE
 get_oom_base_message (LPDISPATCH mailitem);
 
 LPMESSAGE
 get_oom_base_message (LPDISPATCH mailitem);
 
+/* Get a strong reference for a mail object by calling
+   Application.GetObjectReference with type strong. The
+   documentation is unclear what this acutally does.
+   This function is left over from experiments about
+   strong references. Maybe there is a use for them.
+   The reference we use in the Mail object is documented
+   as a Weak reference. But changing that does not appear
+   to make a difference.
+*/
+LPDISPATCH
+get_strong_reference (LPDISPATCH mail);
+
 /* Invoke a method of an outlook object.
    returns true on success false otherwise.
 
 /* Invoke a method of an outlook object.
    returns true on success false otherwise.
 
@@ -228,6 +240,20 @@ get_oom_base_message (LPDISPATCH mailitem);
 int
 invoke_oom_method (LPDISPATCH pDisp, const char *name, VARIANT *rVariant);
 
 int
 invoke_oom_method (LPDISPATCH pDisp, const char *name, VARIANT *rVariant);
 
+/* Invoke a method of an outlook object.
+   returns true on success false otherwise.
+
+   rVariant should either point to a propery initialized
+   variant (initinalized wiht VariantInit) to hold
+   the return value or a pointer to NULL.
+
+   parms can optionally be used to provide a DISPPARAMS structure
+   with parameters for the function.
+   */
+int
+invoke_oom_method_with_parms (LPDISPATCH pDisp, const char *name,
+                              VARIANT *rVariant, DISPPARAMS *params);
+
 /* Try to obtain the mapisession through the Application.
   returns NULL on error.*/
 LPMAPISESSION
 /* Try to obtain the mapisession through the Application.
   returns NULL on error.*/
 LPMAPISESSION