Hi Alex
Here are my implementations. ShowContextMenu is the first method in
IDocHostUIHandler.
<code>
' IDocHostUIHandler interface
<ComVisible(True), ComImport(),
Guid("bd3f23c0-d43e-11cf-893b-00aa00bdce1a"), _
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)> _
Public Interface IDocHostUIHandler
<PreserveSig()> Function ShowContextMenu(ByVal dwID As Integer, ByRef
ppt As tagPOINT, _
<MarshalAs(UnmanagedType.IUnknown)> ByVal pcmdtReserved As Object, _
<MarshalAs(UnmanagedType.IDispatch)> ByVal pdispReserved As Object) As
HRESULT
<PreserveSig()> Function GetHostInfo(ByRef pInfo As DOCHOSTUIINFO) As
HRESULT
<PreserveSig()> Function ShowUI(ByVal dwID As Integer, ByVal
pActiveObject As IOleInPlaceActiveObject, _
ByVal pCommandTarget As IOleCommandTarget, ByVal pFrame As
IOleInPlaceFrame, ByVal pDoc As IOleInPlaceUIWindow) As HRESULT
<PreserveSig()> Function HideUI() As HRESULT
<PreserveSig()> Function UpdateUI() As HRESULT
<PreserveSig()> Function EnableModeless(ByVal fEnable As Boolean) As
HRESULT
<PreserveSig()> Function OnDocWindowActivate(ByVal fActivate As Boolean)
As HRESULT
<PreserveSig()> Function OnFrameWindowActivate(ByVal fActivate As
Boolean) As HRESULT
<PreserveSig()> Function ResizeBorder(ByRef prcBorder As tagRECT, ByVal
pUIWindow As IOleInPlaceUIWindow, ByVal fFrameWindow As Boolean) As HRESULT
<PreserveSig()> Function TranslateAccelerator(ByRef lpMsg As MSG, ByRef
pguidCmdGroup As Guid, ByVal nCmdID As Integer) As HRESULT
<PreserveSig()> Function GetOptionKeyPath(ByRef pbstrKey As IntPtr,
ByVal dw As Integer) As HRESULT
<PreserveSig()> Function GetDropTarget(ByVal pDropTarget As IDropTarget,
ByRef ppDropTarget As IDropTarget) As HRESULT
<PreserveSig()> Function
GetExternal(<MarshalAs(UnmanagedType.IDispatch)> ByRef ppDispatch As Object)
As HRESULT
<PreserveSig()> Function TranslateUrl(ByVal dwTranslate As Integer,
ByVal strURLIn As String, ByRef pstrURLOut As String) As HRESULT
<PreserveSig()> Function FilterDataObject(ByVal pDO As IDataObject,
ByRef ppDORet As IDataObject) As HRESULT
End Interface
Public Enum OLECMDTEXTF
OLECMDTEXTF_NONE = 0
OLECMDTEXTF_NAME = 1
OLECMDTEXTF_STATUS = 2
End Enum
' OLECMD
<StructLayout(LayoutKind.Sequential)> _
Public Structure OLECMD
Public cmdID As Int32
Public cmdf As Int32
End Structure
' OLECMDTEXT
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
Public Class OLECMDTEXT
Public cmdtextf As OLECMDTEXTF
Public cwActual As Int32
Private cwBuf As Int32 = 256 'Make sure this is the same as SizeConst
below
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
Public text As String
End Class
<StructLayout(LayoutKind.Explicit)> _
Public Class OLEVARIANT
<FieldOffset(0)> Public vt As System.Int16
<FieldOffset(2)> Public wReserved1 As System.Int16
<FieldOffset(4)> Public wReserved2 As System.Int16
<FieldOffset(6)> Public wReserved3 As System.Int16
<FieldOffset(8)> Public lVal As Integer
<FieldOffset(8)> Public iVal As Short
<FieldOffset(8)> Public bstrVal As IntPtr
<FieldOffset(8)> Public pUnkVal As IntPtr
<FieldOffset(8)> Public pArray As IntPtr
<FieldOffset(8)> Public pvRecord As IntPtr
<FieldOffset(12)> Public pRecInfo As IntPtr
Public Sub Clear()
VariantClear(Me)
End Sub 'Clear
Public Sub LoadString(ByVal Value As String)
' Identify this as a BSTR
vt = CType(vt Or VarEnum.VT_BSTR, Short)
bstrVal = Marshal.StringToBSTR(Value)
End Sub
Public Function ToNativeObject() As Object
Dim p As IntPtr
Try
'Allocate a buffer to hold the data in this OLEVARIANT
p = Marshal.AllocCoTaskMem(Marshal.SizeOf(Me.GetType()))
Marshal.StructureToPtr(Me, p, False)
Return Marshal.GetObjectForNativeVariant(p)
Finally
'Called no matter what
Marshal.FreeCoTaskMem(p)
End Try
End Function
<DllImport("Oleaut32.dll", PreserveSig:=False)> _
Private Shared Sub VariantClear(ByVal var As OLEVARIANT)
End Sub
End Class 'OLEVARIANT
' IOleCommandTarget interface
<ComVisible(True), ComImport(),
Guid("b722bccb-4e68-101b-a2bc-00aa00404770"), _
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Public Interface IOleCommandTarget
Sub QueryStatus(ByRef pguidCmdGroup As Guid, ByVal cCmds As Int32, _
<InAttribute(), Out(), MarshalAs(UnmanagedType.LPArray,
SizeParamIndex:=1)> ByVal prgCmds() As OLECMD, <InAttribute(), Out()> ByVal
pCmdText As OLECMDTEXT)
Sub Exec(ByRef pguidCmdGroup As Guid, ByVal nCmdId As Int32, _
ByVal nCmdExecOpt As Int32, ByVal pvaIn As OLEVARIANT, ByVal pvaOut
As OLEVARIANT)
End Interface
</code>
Let me know if I have missed anything else.
HTH
Charles