2014-04-02 6 views
5

Aktualnie implementuję obiekt pomocnika przeglądarki, który umożliwia przeciąganie wiadomości e-mail z perspektywy na stronę przeglądarki internetowej.Przeciągnij/upuść z programu Outlook do przeglądarki Internet Explorer za pośrednictwem BHO nie działa na maszynach x32/86

Stosuję podejście opisane w następującym poście: Implementing a Drag-and-Drop function from MS Outlook into our web application. Mam to działa, ale tylko na maszynach x64. Na X32/86 maszyn Dostaję wyjątek w następujący fragment kodu (oczywiście kiedy zastąpiłem prawdziwą nazwę pliku z włożeniem fałszywych jeden dla prostoty):

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); 

Na wykonującego ostatniego dnia ling ten kod (w rzeczywistości ustawiając fałszywy deskryptor HDROP) otrzymuję następujący wyjątek: "Niepoprawna struktura FORMATETC (wyjątek z HRESULT: 0x80040064 (DV_E_FORMATETC))".

Czy ktoś napotkał opisany problem lub ma pojęcie, co może być przyczyną tego problemu?

Aby być bardziej szczegółowym na temat środowiska - mam problem z win7 32 bit z IE 10, ale jestem prawie pewien, że powodem szczególnie w tym komputerze jest 32-bitowy.

Odpowiedz

1

Musisz zaimplementować własny IDataObject i przekazać go do oryginalnego IDropTarget.Drop zamiast przejąć istniejący obiekt IDataOject pochodzący z programu Outlook.

+0

Tak, po wdrożeniu mojej własnej DataObject i nadpisaniu metod GetData i QueryGetData zaczęło działać. Wielkie dzięki! –

Powiązane problemy