alternative
[DllImport("ole32.dll")]
static extern int OleGetClipboard([MarshalAs(UnmanagedType.IUnknown)]out object ppDataObj);
original
[DllImport("ole32.dll")]
static extern int OleGetClipboard(out IDataObject ppDataObj);
None.
The original signature requires a definition for the COM version of IDataObject, as defined in objidl.h. The lack of this definition implies that the System.Windows.Forms.IDataObject interface can be used, but this interface, although COM-visible, is not the same as the COM one and results in a System.InvalidCastException.
The alternative posted uses an object, which can then be passed to a System.Windows.Forms.DataObject ctor. Ideally though there should be a complete definition for the COM IDataObject interface (and all of its supporting types).
I find it better to turn off PreserveSig for methods that return an HRESULT and have a trailing out parameter, providing that the HRESULT does not have more that one success code (typically S_OK only). This results in a slightly cleaner syntax where the out parameter becomes the return value and a failing HRESULT results in an exception.
[DllImport("ole32.dll", PreserveSig=false)]
[return: MarshalAs(UnmanagedType.IUnknown)]
static extern object OleGetClipboard();
using System.Diagnostics;
using System.Runtime.Interop;
using System.Windows.Forms;
PreserveSig=true
class Program
{
[DllImport("ole32.dll")]
static extern int OleGetClipboard([MarshalAs(UnmanagedType.IUnknown)]out object ppDataObj);
[STAThread()]
static void Main(string[] args)
{
object unk;
int result = OleGetClipboard(out unk);
Debug.Assert(result == 0);
DataObject data = new DataObject(unk);
foreach (string format in data.GetFormats())
Debug.WriteLine(format);
}
}
PreserveSig=false
class Program
{
[DllImport("ole32.dll", PreserveSig=false)]
[return: MarshalAs(UnmanagedType.IUnknown)]
static extern object OleGetClipboard();
[STAThread()]
static void Main(string[] args)
{
object unk = OleGetClipboard();
DataObject data = new DataObject(unk);
foreach (string format in data.GetFormats())
Debug.WriteLine(format);
}
}
System.Windows.Forms.Clipboard.GetDataObject