Yes that's something we were working on as Drag and Drop doesn't seem to display content directly and it's hard to figure out why.
Other works on that in different languages often have the same behaviour.
Nevertheless if you D&D in Word, save as rtf and open it it with AHK RichEdit will work just fine.
Copy pasting content just copies the content, and does not embed the file.
BUT we have a solution to be able to Insert a in-place display object directly from the Editor.
And with that you can have all the different combinaison (Icon or Display, Embedd or Link !)
Code: Select all
; ================================================================================================================================
; Insert files as OLE objects
; How to Use OLE in Rich Edit Controls <- msdn.microsoft.com/en-us/library/windows/desktop/dd387916(v=vs.85).aspx
; InsertMode : Embedded / Link
; DisplayMode : Display / Icon
; ================================================================================================================================
RN_InsertObject(HRE, FilePath,InsertMode="Embedded",DisplayMode="Display") {
; EM_GETOLEINTERFACE := 0x43C
HR := DllCall("SendMessage", "Ptr", HRE, "UInt", 0x043C, "Ptr", 0, "PtrP", IRichEditOle, "UInt")
If (HR = 0) {
ErrorLevel := Format("0x{:08X}", HR)
Return False
}
; OutputDebug, EM_GETOLEINTERFACE - %ErrorLevel% - %IRichEditOle%
; msdn.microsoft.com/en-us/library/windows/desktop/aa378977(v=vs.85).aspx
HR := DllCall("Ole32.dll\CreateILockBytesOnHGlobal", "Ptr", 0, "Int", 1, "PtrP", ILockBytes, "UInt")
If (HR) {
ErrorLevel := Format("0x{:08X}", HR)
ObjRelease(IRichEditOle)
Return False
}
; OutputDebug, CreateILockBytesOnHGlobal - %ErrorLevel% - %ILockBytes%
; msdn.microsoft.com/en-us/library/windows/desktop/aa380324(v=vs.85).aspx
; STGM_READWRITE = 0x02, STGM_SHARE_EXCLUSIVE = 0x10, STGM_CREATE = 0x1000
HR := DllCall("Ole32.dll\StgCreateDocfileOnILockBytes", "Ptr", ILockBytes, "UInt", 0x1012, "UInt", 0, "PtrP", IStorage, "UInt")
If (HR) {
ErrorLevel := Format("0x{:08X}", HR)
ObjRelease(ILockBytes)
ObjRelease(IRichEditOle)
Return False
}
; OutputDebug, StgCreateDocfileOnILockBytes - %ErrorLevel% - %IStorage%
GetClientSite := NumGet(NumGet(IRichEditOle + 0, "UPtr") + (A_PtrSize * 3), "UPtr")
HR := DllCall(GetClientSite, "Ptr", IRichEditOle, "PtrP", IOleClientSite, "UInt")
If (HR) {
ErrorLevel := Format("0x{:08X}", HR)
ObjRelease(IStorage)
ObjRelease(ILockBytes)
ObjRelease(IRichEditOle)
Return False
}
; OutputDebug, GetClientSite - %ErrorLevel% - %IOleClientSite%
VarSetCapacity(FORMATETC, A_PtrSize = 8 ? 32 : 20, 0)
if (DisplayMode="Icon")
NumPut( 4, FORMATETC, A_PtrSize = 8 ? 16 : 8 , "UInt") ; DVASPECT_ICON
else
NumPut( 1, FORMATETC, A_PtrSize = 8 ? 16 : 8 , "UInt") ; DVASPECT_CONTENT
NumPut(-1, FORMATETC, A_PtrSIze = 8 ? 20 : 12, "Int") ; all data
NumPut( 0, FORMATETC, A_PtrSize = 8 ? 24 : 16, "UInt") ; TYMED_NULL
VarSetCapacity(CLSID_NULL, 16, 0)
VarSetCapacity(IID_IOleObject, 16, 0)
DllCall("Ole32.dll\CLSIDFromString", "WStr", "{00000112-0000-0000-C000-000000000046}", "Ptr", &IID_IOleObject)
OLERENDER_DRAW := 1
if (InsertMode="Link")
HR := DllCall("Ole32.dll\OleCreateLinkToFile", "WStr", FilePath, "Ptr", &IID_IOleObject, "UInt", OLERENDER_DRAW, "Ptr", &FORMATETC, "Ptr", IOleClientSite, "Ptr", IStorage, "PtrP", IOleObject, "UInt")
else
HR := DllCall("Ole32.dll\OleCreateFromFile", "Ptr", &CLSID_NULL, "WStr", FilePath, "Ptr", &IID_IOleObject, "UInt", OLERENDER_DRAW, "Ptr", &FORMATETC, "Ptr", IOleClientSite, "Ptr", IStorage, "PtrP", IOleObject, "UInt")
If (HR) {
ErrorLevel := Format("0x{:08X}", HR)
ObjRelease(IStorage)
ObjRelease(ILockBytes)
ObjRelease(IOleClientSite)
ObjRelease(IRichEditOle)
Return False
}
; OutputDebug, OleCreateFromFile - %ErrorLevel% - %IOleObject%
DllCall("Ole32.dll\OleSetContainedObject", "Ptr", IOleObject, "UInt", 1, "UInt")
; OutputDebug, OleSetContainedObject - %ErrorLevel%
VarSetCapacity(CLSID_USER, 16, 0)
GetUserClassID := NumGet(NumGet(IOleObject + 0, "UPtr") + (A_PtrSize * 15), "UPtr")
HR := DllCall(GetUserClassID, "Ptr", IOleObject, "Ptr", &CLSID_USER, "UInt")
If (HR) {
ErrorLevel := Format("0x{:08X}", HR)
ObjRelease(IStorage)
ObjRelease(ILockBytes)
ObjRelease(IOleClientSite)
ObjRelease(IOleObject)
ObjRelease(IRichEditOle)
Return False
}
; CLSID := Format("{:016X} {:016X}", NumGet(CLSID_USER, "Int64"), NumGet(CLSID_USER, 8, "Int64"))
; OutputDebug, GetUserClassID - %ErrorLevel% - %CLSID%
SizeOfREOBJECT := A_PtrSize = 8 ? (A_PtrSize * 9) : (A_PtrSize * 10) + 16
VarSetCapacity(REOBJECT, SizeOfREOBJECT, 0)
Addr := &REOBJECT
Addr := NumPut(SizeOfREOBJECT, Addr + 0, "UInt")
Addr := NumPut(0xFFFFFFFF, Addr + 0, "UInt") ; REO_CP_SELECTION
Addr := NumPut(NumGet(CLSID_USER, 0, "Int64"), Addr + 0, "Int64")
Addr := NumPut(NumGet(CLSID_USER, 8, "Int64"), Addr + 0, "Int64")
Addr := NumPut(IOleObject, Addr + 0, "UPtr")
Addr := NumPut(IStorage, Addr + 0, "UPtr")
Addr := NumPut(IOleClientSite, Addr + 0, "UPtr")
Addr += 8 ; sizel = 0
if (DisplayMode="Icon")
Addr := NumPut(4, Addr + 0, "UInt") ; DVASPECT_ICON
else
Addr := NumPut(1, Addr + 0, "UInt") ; DVASPECT_CONTENT
Addr := NumPut(11, Addr + 0, "UInt") ; REO_RESIZABLE | REO_BELOWBASELINE|REO_DYNAMICSIZE
InsertObject := NumGet(NumGet(IRichEditOle + 0, "UPtr") + (A_PtrSize * 7), "UPtr")
HR := DllCall(InsertObject, "Ptr", IRichEditOle, "Ptr", &REOBJECT, "UInt")
ObjRelease(ILockBytes)
ObjRelease(IStorage)
ObjRelease(IOleClientSite)
ObjRelease(IRichEditOle)
ObjRelease(IOleObject)
Return !(ErrorLevel := Format("0x{:08X}", HR))
}