diff --git a/GreenshotPlugin/GreenshotPlugin.csproj b/GreenshotPlugin/GreenshotPlugin.csproj
index eb956765e..bac1fe128 100644
--- a/GreenshotPlugin/GreenshotPlugin.csproj
+++ b/GreenshotPlugin/GreenshotPlugin.csproj
@@ -64,6 +64,7 @@
+
diff --git a/GreenshotPlugin/Interop/COMWrapper.cs b/GreenshotPlugin/Interop/COMWrapper.cs
index 956a79915..3a4f9f8c4 100644
--- a/GreenshotPlugin/Interop/COMWrapper.cs
+++ b/GreenshotPlugin/Interop/COMWrapper.cs
@@ -18,6 +18,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
+
using System;
using System.Reflection;
using System.Runtime.InteropServices;
@@ -49,17 +50,17 @@ namespace Greenshot.Interop {
///
/// Type of the COM object, set on constructor after getting the COM reference
///
- private Type _COMType;
+ private readonly Type _COMType;
///
/// The type of which method calls are intercepted and executed on the COM object.
///
- private Type _InterceptType;
+ private readonly Type _InterceptType;
///
/// The humanly readable target name
///
- private string _TargetName;
+ private readonly string _TargetName;
#endregion
[DllImport("ole32.dll")]
@@ -73,7 +74,7 @@ namespace Greenshot.Interop {
///
/// Gets a COM object and returns the transparent proxy which intercepts all calls to the object
///
- /// Interface which defines the method and properties to intercept
+ /// Interface which defines the method and properties to intercept
/// Transparent proxy to the real proxy for the object
/// The must be an interface decorated with the attribute.
public static T GetInstance() {
@@ -183,6 +184,7 @@ namespace Greenshot.Interop {
}
} catch (Exception e) {
LOG.WarnFormat("Error {1} creating object for {0}", progId, e.Message);
+ throw;
}
}
if (comObject != null) {
@@ -290,6 +292,25 @@ namespace Greenshot.Interop {
return default(T);
}
+ ///
+ /// Wrap a com object as COMWrapper
+ ///
+ /// An object to intercept
+ /// Interface which defines the method and properties to intercept
+ /// Transparent proxy to the real proxy for the object
+ public static T Wrap(object comObject) {
+ Type type = typeof (T);
+ if (null == comObject) {
+ throw new ArgumentNullException("comObject");
+ }
+ if (null == type) {
+ throw new ArgumentNullException("type");
+ }
+
+ COMWrapper wrapper = new COMWrapper(comObject, type, type.FullName);
+ return (T)wrapper.GetTransparentProxy();
+ }
+
///
/// Wrap an object and return the transparent proxy which intercepts all calls to the object
///
diff --git a/GreenshotPlugin/Interop/IDispatch.cs b/GreenshotPlugin/Interop/IDispatch.cs
index a9f53a6c0..db8139b52 100644
--- a/GreenshotPlugin/Interop/IDispatch.cs
+++ b/GreenshotPlugin/Interop/IDispatch.cs
@@ -1,14 +1,44 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
+/*
+ * Greenshot - a free and open source screenshot tool
+ * Copyright (C) 2007-2014 Thomas Braun, Jens Klingen, Robin Krom
+ *
+ * For more information see: http://getgreenshot.org/
+ * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+using System;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.CustomMarshalers;
+
namespace Greenshot.Interop {
- [ComImport, Guid("00020400-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
- public interface IDispatch {
- void Reserved();
+ [ComImport, Guid("00020400-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsDual)]
+ public interface IDispatch : IUnknown {
[PreserveSig]
- int GetTypeInfo(uint nInfo, int lcid, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(TypeToTypeInfoMarshaler))] out Type typeInfo);
+ int GetTypeInfoCount(out int count);
+
+ [PreserveSig]
+ int GetTypeInfo([MarshalAs(UnmanagedType.U4)] int iTInfo, [MarshalAs(UnmanagedType.U4)] int lcid, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(TypeToTypeInfoMarshaler))] out Type typeInfo);
+
+ [PreserveSig]
+ int GetIDsOfNames(ref Guid riid, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)]
+ string[] rgsNames, int cNames, int lcid, [MarshalAs(UnmanagedType.LPArray)] int[] rgDispId);
+
+ [PreserveSig]
+ int Invoke(int dispIdMember, ref Guid riid, uint lcid, ushort wFlags, ref System.Runtime.InteropServices.ComTypes.DISPPARAMS pDispParams,
+ out object pVarResult, ref System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo, IntPtr[] pArgErr);
}
}
diff --git a/GreenshotPlugin/Interop/IOleWindow.cs b/GreenshotPlugin/Interop/IOleWindow.cs
index b71b52b5c..f08150497 100644
--- a/GreenshotPlugin/Interop/IOleWindow.cs
+++ b/GreenshotPlugin/Interop/IOleWindow.cs
@@ -18,6 +18,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
+
using System;
using System.Runtime.InteropServices;
diff --git a/GreenshotPlugin/Interop/IUnknown.cs b/GreenshotPlugin/Interop/IUnknown.cs
new file mode 100644
index 000000000..1974ce5cd
--- /dev/null
+++ b/GreenshotPlugin/Interop/IUnknown.cs
@@ -0,0 +1,36 @@
+/*
+ * Greenshot - a free and open source screenshot tool
+ * Copyright (C) 2007-2014 Thomas Braun, Jens Klingen, Robin Krom
+ *
+ * For more information see: http://getgreenshot.org/
+ * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace Greenshot.Interop {
+ [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00000000-0000-0000-C000-000000000046")]
+ public interface IUnknown {
+ IntPtr QueryInterface(ref Guid riid);
+
+ [PreserveSig]
+ UInt32 AddRef();
+
+ [PreserveSig]
+ UInt32 Release();
+ }
+}