2014-04-02 16 views
5

Attualmente sto implementando un oggetto helper del browser che consentirebbe di trascinare le e-mail dall'outlook alla pagina di Internet Explorer.Trascina/rilascia da Outlook a Internet Explorer tramite BHO non funziona su macchine x32/86

Sto seguendo l'approccio descritto nel seguente post: Implementing a Drag-and-Drop function from MS Outlook into our web application. Ho funzionato, ma solo su macchine x64. Sulle x32/86 macchine sto ottenendo l'eccezione nel seguente pezzo di codice (ovviamente ho sostituito vero nome del file inserendo con una finta per semplicità):

DropFiles df = new DropFiles(); 

string filename = @"D:\projects\hello.txt"; 
byte[] binaryData = Encoding.Unicode.GetBytes(filename); 

binaryData = binaryData.Concat(new byte[] { 0, 0 }).ToArray(); 

IntPtr pointerToGlobalMemory = Marshal.AllocHGlobal(Marshal.SizeOf(df) + binaryData.Length); 

df.Files = Marshal.SizeOf(df); 
df.Wide = true; 
Marshal.StructureToPtr(df, pointerToGlobalMemory, true); 
IntPtr newPointer = new IntPtr(pointerToGlobalMemory.ToInt32() + Marshal.SizeOf(df)); 

Marshal.Copy(binaryData, 0, newPointer, binaryData.Length); 

var descriptorFormat = new COMInterop.FORMATETC(); 
descriptorFormat.cfFormat = HdropDescriptorId; // 15 
descriptorFormat.ptd = IntPtr.Zero; 
descriptorFormat.dwAspect = COMInterop.DVASPECT.DVASPECT_CONTENT; 
descriptorFormat.lindex = -1; 
descriptorFormat.tymed = COMInterop.TYMED.TYMED_HGLOBAL; 

var td = new COMInterop.STGMEDIUM(); 
td.unionmember = pointerToGlobalMemory; 
td.tymed = COMInterop.TYMED.TYMED_HGLOBAL; 

dataObject.SetData(ref descriptorFormat, ref td, true); 

In esecuzione l'ultimo ling di questo codice (in realtà impostando il falso descrittore HDROP) ottengo la seguente eccezione: "Struttura FORMATETC non valida (Eccezione da HRESULT: 0x80040064 (DV_E_FORMATETC))".

Qualcuno ha riscontrato un problema descritto o ha un'idea di quale può essere il motivo di questo problema?

Per essere più specifici sull'ambiente, sto riscontrando questo problema su Win7 a 32 bit con IE 10, ma sono piuttosto sicuro che il motivo, in particolare in quella macchina, sia a 32 bit.

risposta

1

È necessario implementare il proprio IDataObject e passarlo all'IDropTarget.Drop originale invece di dirottare un IDataObject esistente proveniente da Outlook.

+0

Sì, dopo aver implementato i miei metodi DataObject e di sovrascrittura, GetData e QueryGetData hanno iniziato a funzionare. Grazie mille! –

Problemi correlati