Custom IDropTarget problem by hosting mshtml

  • Thread starter Thread starter Guest
  • Start date Start date
G

Guest

Hi there

In my app I host the webbrowser. If I return my own implementation in
GetDropTarget my methods are never called ( if i return the original
dropTarget or NOTIMPLEMENTED everything works fine)

Framework 1.1

please help

ps to contact me replace -aT-
d.mohl-aT-hico.com
 
dom,

Have you implemented IDocHostUIHandler? You will get control there for
GetDropTarget.

Paste the code so that i can investigate, if it doesnt work.


Shak.
 
Yes, I implemented the IDocHostUIHandler

Here the relevant codeparts

the GetDropTarget will be called but DropTarget.OleDragEnter is never called
public int GetDropTarget(Interop.IOleDropTarget pDropTarget, out
Interop.IOleDropTarget ppDropTarget)

{

if (_dropTarget == null)

{

HtmlEditor editor = (_hostControl as HtmlEditor);

if (editor != null)

{

DataObjectConverter converter = editor.DataObjectConverter;

if (converter != null)

{

_dropTarget = new DropTarget(editor, converter, pDropTarget);

}

}

}

ppDropTarget = _dropTarget as Interop.IOleDropTarget;

if (ppDropTarget != null)

{

return Interop.S_OK;

}

return Interop.E_NOTIMPL;

}

protected sealed class DropTarget : Interop.IOleDropTarget

{

private HtmlControl _owner;

private DataObject _currentDataObj;

private IntPtr _currentDataObjPtr;

private Interop.IOleDropTarget _originalDropTarget;

private DataObjectConverter _converter;

private DataObjectConverterInfo _converterInfo;



public DropTarget(HtmlControl owner, DataObjectConverter converter,
Interop.IOleDropTarget originalDropTarget)

{

_owner = owner;

_converter = converter;

_originalDropTarget = originalDropTarget;

}



#region Drag and Drop

public int OleDragEnter(IntPtr pDataObj, int grfKeyState, long pt, out int
pdwEffect)

{

pdwEffect = Interop.DROPEFFECT_NONE;

DataObject dataObject = new
DataObject(Marshal.GetObjectForIUnknown(pDataObj));

_converterInfo = _converter.CanConvertToHtml(dataObject);

if (_converterInfo == DataObjectConverterInfo.CanConvert)

{

_currentDataObj = new DataObject(DataFormats.Html, String.Empty);

IntPtr i = Marshal.GetIUnknownForObject(_currentDataObj);

Guid guid = new Guid("0000010E-0000-0000-C000-000000000046");

Marshal.QueryInterface(i, ref guid, out _currentDataObjPtr);

Marshal.Release(i);

return _originalDropTarget.OleDragEnter(_currentDataObjPtr, grfKeyState, pt,
out pdwEffect);

}

if (_converterInfo == DataObjectConverterInfo.Disabled)

{

pdwEffect = Interop.DROPEFFECT_NONE;

}

else if (_converterInfo == DataObjectConverterInfo.Unhandled)

{

return _originalDropTarget.OleDragEnter(pDataObj, grfKeyState, pt, out
pdwEffect);

}

return 0;

}

public int OleDragOver(int grfKeyState, long pt, out int pdwEffect)

{

if (_converterInfo != DataObjectConverterInfo.Disabled)

{

return _originalDropTarget.OleDragOver(grfKeyState, pt, out pdwEffect);

}

pdwEffect = Interop.DROPEFFECT_NONE;;

return 0;

}

public int OleDragLeave()

{

_converterInfo = DataObjectConverterInfo.Disabled;

if (_currentDataObj == null)

{

return 0;

}

_currentDataObj = null;

Marshal.Release(_currentDataObjPtr);

_currentDataObjPtr = IntPtr.Zero;

return _originalDropTarget.OleDragLeave();

}

public int OleDrop(IntPtr pDataObj, int grfKeyState, long pt, out int
pdwEffect)

{

Form form;

pdwEffect = Interop.DROPEFFECT_NONE;

int i = 0;

Control control = _owner;

if (control != null)

{

control = control.Parent;

form = control as Form;

if (form == null)

{

return 0;

}

form.BringToFront();

return 0;

}

if (_converterInfo == DataObjectConverterInfo.CanConvert)

{

DataObject dataObject = new
DataObject(Marshal.GetObjectForIUnknown(pDataObj));

if (_converter.ConvertToHtml(dataObject, _currentDataObj))

{

IntPtr j = Marshal.GetIUnknownForObject(_currentDataObj);

Guid guid = new Guid("0000010E-0000-0000-C000-000000000046");

Marshal.QueryInterface(j, ref guid, out _currentDataObjPtr);

i = _originalDropTarget.OleDrop(_currentDataObjPtr, grfKeyState, pt, out
pdwEffect);

Marshal.Release(_currentDataObjPtr);

_currentDataObj = null;

_currentDataObjPtr = IntPtr.Zero;

}

else

{

pdwEffect = Interop.DROPEFFECT_NONE;

}

}

else if (_converterInfo == DataObjectConverterInfo.Unhandled)

{

i = _originalDropTarget.OleDrop(pDataObj, grfKeyState, pt, out pdwEffect);

}

_converterInfo = DataObjectConverterInfo.Disabled;

return i;

}

}
 
Back
Top