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(); + } +}