私もよくわからない為、詳しくお教えする事はできません。
どなたかわかる方お願い致します。
とりあえず、参照先の内容をど〜にかこ〜にかHSPに移殖してみたサンプルです。
#module
#uselib "kernel32.dll"
#cfunc _LoadLibrary "LoadLibraryA" sptr
#func _FreeLibrary "FreeLibrary" sptr
#deffunc rich_Create int p0, int p1, local a
a=gInfo(3),0,Limit(p0,80,4096),Limit(p1,12,4096)
If(hLib){a.1=Length(iRich)}else{hLib=_LoadLibrary("riched32.dll")}
WinObj "richedit","",$0200,$50b021c4,a.2,a.3 :a.2=stat
If(a.2<0){Return -1} :iRich(a.1)=(a.0<<16)||a.2
Return a.2
#deffunc rich_Destroy onexit
ii=gInfo(3) :ForEach iRich :gSel iRich(cnt)>>16 :ClrObj iRich(cnt)&$ffff :Loop
gSel ii :If(hLib){_FreeLibrary hLib}
Return
#global
#module // ここが本題の部分
#uselib "ole32.dll"
#cfunc _CreateILockBytesOnHGlobal "CreateILockBytesOnHGlobal" int,int,var
#cfunc _StgCreateDocfileOnILockBytes "StgCreateDocfileOnILockBytes" int,int,int,var
#cfunc _OleCreateFromFile "OleCreateFromFile" var,var,var,int,var,int,int,var
#func _OleSetContainedObject "OleSetContainedObject" int,int
#define IID_IUnknown "{00000000-0000-0000-C000-000000000046}"
#define IID_ILockBytes "{0000000A-0000-0000-C000-000000000046}"
#define IID_IStrage "{0000000B-0000-0000-C000-000000000046}"
#define IID_IOleObject "{00000112-0000-0000-C000-000000000046}"
#define IID_IOleClientSite "{00000118-0000-0000-C000-000000000046}"
#define IID_IRichEditOle "{00020D00-0000-0000-C000-000000000046}"
#define CLSID_NULL "{00000000-0000-0000-0000-000000000000}"
#usecom IUnknown IID_IUnknown "{}"
#comfunc IU_QueryInterface 0 var,var
#usecom ILockBytes IID_ILockBytes "{}"
#usecom IStrage IID_IStrage "{}"
#usecom IOleObject IID_IOleObject "{}"
#comfunc IOO_GetUserClassID 15 var
#usecom IOleClientSite IID_IOleClientSite "{}"
#usecom IRichEditOle IID_IRichEditOle "{}"
#comfunc IREO_GetClientSite 3 var
#comfunc IREO_InsertObject 7 var
#define cType In(%1,%2,%3) (((%2)<=(%1))&((%3)>=(%1)))
#define ClrCom(%1) if(vartype(%1)==6){delcom %1:dim %1}
;--IID文字列 => IID構造体(*var, "IID")
#deffunc iid2var array pa, str p0, local a, local b
sDim b,$100,2 :b.1=p0 :a=-1,0,0,StrLen(b.1)
Repeat :If((a==0)||(a.1>=a.3)){Break} :a=Peek(b.1,a.1) :a.1++
If(In(a,$30,$39)||In(a,$41,$46)||In(a,$61,$66)){Poke b.0,a.2,a :a.2++}
Loop :If(a.2<32){Return 0}
Dim pa,4 :lPoke pa,,Int("$"+StrMid(b,,8))
Repeat 2,2 :wPoke pa,cnt*2,Int("$"+StrMid(b,cnt*4,4)) :Loop
Repeat 8,8 :Poke pa,cnt,Int("$"+StrMid(b,cnt*2,2)) :Loop
Return 1
;--オブジェクト埋め込み(hRichEdit, "FileName", [start], [end])
#define global rich_InsertObject(%1,%2,%3=-1,%4=-1) _rich_InsertObject %1,%2,%3,%4
#deffunc _rich_InsertObject int p0, str p1, int p2, int p3, local a, local b, local c
Exist p1 :If(p0==0)||(strsize<1){Return 0} :Dim a,10
SendMsg p0,$043c,0,varptr(a.0) :If(a.0==0){Goto *@f} ;EM_GetOleInterface
NewCom pRichEditOle,IRichEditOle,-1,a.0 :LogMes "pRichEditOle";;;;
If(_CreateILockBytesOnHGlobal(0,1,a.1)){Goto *@f}
NewCom pLockBytes,ILockBytes,-1,a.1 :LogMes "pLockBytes";;;;
If(_StgCreateDocfileOnILockBytes(a.1,$1012,0,a.2)){Goto *@f}
;STGM_SHARE_EXCLUSIVE[$0010] | STGM_CREATE[$1000] | STGM_READWRITE[$0002]
NewCom pStorage,IStrage,-1,a.2 :LogMes "pStrage";;;;
Dim formatEtc,5 :formatEtc=0,0,1,-1,0 ;DVASPECT_CONTENT[$0001], TYMED_NULL[$0000]
LogMes "formatEtc";;;;
IREO_GetClientSite pRichEditOle,a.3 :If(stat){Goto *@f}
NewCom pClientSite,IOleClientSite,-1,a.3 :LogMes "pClientSite";;;;
iid2var clsid,CLSID_NULL :iid2var iid_Unk,IID_IUnknown
sDim b,$200 :CnvStoW b,p1 ;unicode文字列でないとダメ? OLERENDER_DRAW[$0001]
If(_OleCreateFromFile(clsid,b,iid_Unk,$0001,formatEtc,a.3,a.2,a.4)){Goto *@f}
NewCom pUnk,IUnknown,-1,a.4 :LogMes "pUnk";;;;
iid2var iid_OO,IID_IOleObject
IU_QueryInterface pUnk,iid_OO,a.5 :If(stat){Goto *@f}
NewCom pObject,IOleObject,-1,a.5 :LogMes "pObject";;;;
_OleSetContainedObject a.5,1
IOO_GetUserClassID pObject,clsid :If(stat){Goto *@f}
LogMes "get clsid";;;;
Dim reobject,14 :reobject.0=56 ;cbStruct
MemCpy reobject,clsid,16,8 ;clsid
reobject. 1=-1 ;cp = REO_CP_SELECTION[$ffffffff]
reobject.11=1 ;dvaspect = DVASPECT_CONTENT[$0001]
reobject.12=1|2 ;dwFlags = REO_RESIZABLE[$0001] | REO_BELOWBASELINE[$0002]
reobject.13=0 ;dwUser = 0
reobject. 6=a.5 ;poleobj = pObject
reobject. 8=a.3 ;polesite = pClientSite
reobject. 7=a.2 ;pstg = pStorage
reobject. 9=0,0 ;sizel = SIZEL{ 0 }
;参照元とは異なり指定位置(選択範囲)に挿入
SendMsg p0,$00b0,varptr(a.6),varptr(a.7) ;EM_GetSel
If(p2>=0){a.6=p2} :If(p3>=a.6){a.7=p3}else{If(a.6>a.7){a.7=a.6}}
SendMsg p0,$00b1,a.6,a.7 ;EM_SetSel
IREO_InsertObject pRichEditOle,reobject :a.8=(stat==0)
If(a.8){LogMes "InsertObject"};;;;
*@ :ClrCom pObject :ClrCom pUnk :ClrCom pClientSite
ClrCom pStorage :ClrCom pLockBytes :ClrCom pRichEditOle
Return a.8
#global
imgTV=Dir_TV+"btn_hsptv.bmp"
txtTV=Dir_TV+"..\\doclib\\hsptv_api.txt"
*start
Screen 0,640,480 :SysColor 15 :BoxF
Pos 4,4 :rich_Create 632,444 :hRich=ObjInfo(stat,2)
Dim i,15 :i.0=60,$40000000,0,0,0,$ff8020 ;CFM_Color
SendMsg hRich,$0444,,varptr(i) ;EM_SetCharFormat
SendMsg hRich,$0443,0,$202020 ;EM_SetBkgndColor
Exist imgTV :If(strsize>0){PicLoad imgTV,1}
Exist txtTV :If(strsize>0){
sDim txt,strsize+1 :bLoad txtTV,txt,strsize
SendMsg hRich,$00c2,1,varptr(txt) ;EM_ReplaceSel
SendMSg hRich,$00b1 ;EM_SetSel (先頭へ)
}
Pos 556,448 :ObjSize 80,24 :Button gosub "埋め込み",*btn_Insert
STOP
*btn_Insert
rich_InsertObject hRich,imgTV
Return
COMやらOLEやらは特に不得手なので、何か色々間違ってそうです…