' The example on vbAccelerator uses a DLL to prevent these problems that I overcame via thunks & managing memory
' arrays. The vbAccelerator post is a good bit of coding. I wanted to try and do this without using an Active-X
' DLL and TLBs. I have managed to replicate vbAccelerator's code exactly and also improved/fixed some issues
' their DLL experiences.
' This class makes heavy use of the DispCallFunc API which enables coders low-level interface manipulation. It isn't
' exactly easy to use and there is very little documentation on it, but if you have an interface pointer, you have
' full control over it with minimal effort. Researching the Intefaces on MSDN is a must though, crashing is easy :)
' Is this a better solution than vbAccelerator's version? Nope, just a different one that uses no additional dependencies
' If you do decide to use this code, you must add the 2 classes to your usercontrol project.
' Obviously the form & usercontrol provided in this project are soley to enable experimenting.
' APIs primarily for setting up memory arrays and communicating via interface pointers
Private Declare Function DispCallFunc Lib "oleaut32" (ByVal ppv As Long, ByVal oVft As Long, ByVal cc As Long, ByVal rtTYP As VbVarType, ByVal paCNT As Long, ByVal paTypes As Long, ByVal paValues As Long, ByRef fuReturn As Variant) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Declare Function VirtualProtect Lib "kernel32" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
Private Declare Function CoTaskMemAlloc Lib "ole32.dll" (ByVal cb As Long) As Long
Private Declare Function CoTaskMemRealloc Lib "ole32.dll" (ByVal pv As Any, ByVal cb As Long) As Long
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pv As Long)
Private Declare Function SysAllocString Lib "oleaut32.dll" (ByVal pOlechar As Long) As Long
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
Private Type SAFEARRAYBOUND
cElements As Long
lLbound As Long
End Type
Private Type SafeArray
cDims As Integer
fFeatures As Integer
cbElements As Long
cLocks As Long
pvData As Long
rgSABound As SAFEARRAYBOUND
End Type
Private Type CAWORDOLESTR
Count As Long
DataPtr As Long
End Type
Private Const E_POINTER As Long = &H80004003
Private Const E_NOTIMPL As Long = &H80004001
Private Const E_OUTOFMEMORY As Long = &H8007000E
Private Const E_NOINTERFACE As Long = &H80004002
' APIs used to create & maintain mapped file
Private Declare Function CreateFileMapping Lib "kernel32.dll" Alias "CreateFileMappingA" (ByVal hFile As Long, ByRef lpFileMappigAttributes As Any, ByVal flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName As String) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function MapViewOfFile Lib "kernel32.dll" (ByVal hFileMappingObject As Long, ByVal dwDesiredAccess As Long, ByVal dwFileOffsetHigh As Long, ByVal dwFileOffsetLow As Long, ByVal dwNumberOfBytesToMap As Long) As Long
Private Declare Function UnmapViewOfFile Lib "kernel32.dll" (ByRef lpBaseAddress As Any) As Long
Private Const PAGE_READWRITE As Long = &H4
Private Const PAGE_EXECUTE_READWRITE& = &H40&
Private Const ERROR_ALREADY_EXISTS As Long = 183&
Private Const SECTION_MAP_WRITE As Long = &H2
Private Const SECTION_MAP_READ As Long = &H4
Private Const CC_STDCALL As Long = 4&
' APIs used to control display of a property page
Private Declare Function SetWindowLongA Lib "user32.dll" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetParent Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Declare Function CoCreateInstance Lib "ole32" (rclsid As Any, ByVal pUnkOuter As Long, ByVal dwClsContext As Long, riid As Any, pvarResult As Long) As Long
Private Const CLSCTX_INPROC_SERVER As Long = 1
Private Declare Function GetDesktopWindow Lib "user32.dll" () As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Const WM_SETREDRAW As Long = &HB
'-Callback declarations for Paul Caton thunking magic----------------------------------------------
Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function VirtualAlloc Lib "kernel32" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function VirtualFree Lib "kernel32" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long
Private Declare Function IsBadCodePtr Lib "kernel32" (ByVal lpfn As Long) As Long
If DispID <> -1& Then ' add the DispatchID to our local array
If FindDispID(DispID, False) Then Exit Function ' abort; already added this property
If Enumeration = False Then ' validate we can do this before we implement the property
If AddClient_IPropertyPage() = False Then Exit Function
End If
DispID = FindDispID(DispID, True) ' add property to our collection
c_DispIDCol.Params(DispID).Name = PropertyName ' cache property name for user callbacks
If Enumeration Then ' set the property type used for interface callbacks
c_DispIDCol.Params(DispID).pType = ptype_Enum
Else
If LockIDEdisplay Then c_DispIDCol.Params(DispID).pType = ptype_LockedDialog Else c_DispIDCol.Params(DispID).pType = ptype_Dialog
End If
AddProperty = True
End If
End If
End If
CATCH_ERROR:
If Err Then Err.Clear
End Function
Public Function PropertyPageClose(thePropertyPage As Object, ByVal thePropertyPageHwnd As Long, Optional ByVal viaApplyButton As Boolean = True) As Boolean
' Should you ever need to close a property page from within the property page, via code...
' thePropertyPage parameter is passed as: Me
' thePropertyPageHwnd is passed as: PropertyPage.hWnd
' viaApplyButton if True will call the property page's Apply event, regardless if the page's Changed/Dirty property is True
Index = FindVTable(theTables(), VTable) ' search for the vTable
If Index = vCount Then ' not found, need to increment our VTable array
bNew = True
Else ' found and need to add new client
theClient = theTables(Index).ClientPtr ' get pointer to VTable's clientpe As Long, ByVal flProtect As 1eMapping(-1&,bles As Lonesses in the
0&, PAGEDCALb Elsll fail if v 'rse(tyVal fl 0&, PAte Funct
wPa array pour array oex).Cd vTable ,Clieearch for kkkkkkkkkkkvTable ,C
earst II VirtualFiles c 1eMapping(-1&,bles Asssssssn, MEM_RyPagnunks & lrch for kkkkkkr2) = VarPtrFailtyVB eaing
hen 1fage Files c 1eMapping(-oto tEM_RyPa pMS): pvPtr sError GoTo CATCH_EXCEPTION
If ConvertGUIDtoArl flProarrayuL:: pvProwsing() As Boolean
ccccccccMappired across s,ypes(0 ILong s1HOtheCeil if v ?Ds, ss s,ypes(0 or Process. Cmory issuesdb E& see ifyPage:AcBs OverlayArrayOnMem hunk i2rucg = or' nditions
Rntry theClie=n
ccccc7e
ccccG
cccccn thill bal vTableeeeeeee + 16&, vTasafeInIDE As Bn Pays Lib "s, sstionsEOnMem hunk i2rucg = nsEOn PopPageTransl Iory isstsEOn APE
S l 0&, PAGEopPageAppled to add GoTo C.Para 'rse(has
Rntry l 0&nrPageA Lesson lear ' ltyyyyyyll propertiesCol.ParConst IProledOCX,s(), V ' 'i sError GoTo CATo rbtr, implemented
d
d
d
',ypes(0 or Process. wnt 1st clienpMapped memor)4s. wnt PropertyCk i2rucg ================ ates a ttheCeilR0s origFuncompil, V i theTables(Index).ClientPtr ' get pointropertyayArrayOee B0nt=Sn the
(ax < cCct i2rucg)))))))))))))))ALbra 'rse(has
Rntry l 0&nrPageA Lesson leS,+it))))b4et t cCouypes(0, PropertyPaALbt i2r/Names(REFIID addcsrntPtr, cE2&, 4& 'UR))b4et(hase, the property gets value from cd t sson l2&, 4& 'UR))b4et varble ,C
wntleHa7w4& 'UR))b4et(hase, the property ge ))b4et t cCouypes(0, Proper ' Igno hViperty ge ))pes(0, PU If
Iables(Index).ClientPtr 'eeoailed to add Implemen0&, ntPtr 'eeoailed to add Imdd Iach new vTdex).C be subclass If cIndex < cCount re, the propertyrlayArrayeoailed tU
ccccount re, the propLMappingpart -- these can be fixed tislemoving&aalse, usebr can type/paste valu add Implemen0&, ntPtr 'eeoailean 0&, =u add( wnt 'hat wlastet 'haSA As SafeArray, Index As ?ex).C be stetroperts the apply;
2d to ClientPtr 28wsinolemovingIach new l u'eeoailean .C be stetro1 t l u'eeoaailean 2 ClientPtuyp5 Pping(-1&,bl hact&, 4E1opLMappingpart Pping(-1(rD <> -1& Then 3he vTab1ch new &pin, 4E1opLMCMSaccess, the vT wnt 1stry vCoun hact&, N2 ' 'eeoaileand Pping(-1o hViperty ge )edOCX,s()l 0&nrPageA LAappdet CLS ubcla/r ' geArray(Clients), 0&, 0&, 0& ' removalues into 'eeoail 0&, PAGED& ' ' 3) CreatentM it unies if runan type/paste valu add Implemen0&, ntPtr 'eeoailean 0&, =u add( wnt 'hat wlastet 'haSA erty n 'haSA As Sahen
siyPage interfpart Ppnan type/paste valu aA As Sahen
7alu(o sErr'e apply;
E(vI(haeAs Sahen
7alu(o sErlts Sahenlay The ' Nob4etinte))b4et t cCouypes(0, Plu(o s=C_STE(-1&,by;
n 0&, E(vI(haeAs80Plu(o sErlts Saheefore AddC0part Ppn8 vbLonin AddC&'0& nan topLMappi6ean tn n sError GoTo CATCH_EXr
Appled to add41 new vTdex).C vbL3AGED&ryInt'4et(' Once the class ni, ' cache the client pointer
CopyMemory cCount, ByVal ClientPtr0ahen ' abovbLonin AddC&'0ntPtr ' get pointropertyayArrayOee ese canyayArraue, _
7axean 2WRlues(0) = VarPti ' property tyrayOee ese canyasson l2&, 4& 'UR)nt 'hat wlastet 'haSA erty n 'haSi=C_STEoaileaan 22222222rPtfsetPPG As Long = &H9C ' offset s57 2WRlues(idate we, GUID2rucg = nsEOn PopPage geA Lelemented
d
d
d
',ypes(0 or Pr If En
7axe property is cg = nsEOn R7axeanles(vIny&,bryInt'4et(' Once the &
',ypes(0 Array, IBcs ates a ttheng() bO tthennst IIUID2ru9y;
.pType < ' sex = FindVTable(th ' sex = Fin* 12kkkkkkrch le(thTvL or Process. wnt ClientsEOnue fromTable ,Clieearch for kkkkkkkkkkkvTable ,C
earst II D2ru9y
7alu(o sErr'e ap/
A emory tSs. wnt es(0 ay The 3rst II D2ru9yiaEmentPtr, 0xe prop sEr) = VarPtr(p(&, 0&) Klieear)eD 1r4q8 vTable ' Once the ru9y7Croperty _les c 1eMappe sError GoTo CAS) Then 4et(' OneL0rtyB4c'ent arrcess. wthe clire CreateTn ' abovbLontes
P ccccc7e
d
ire CreateTnping(-1(rtyBrowsing interfaRlueent arrcesslCeateTn arrcess. w perty ge ))pes(0ntP yyyyyyyyHandle Then Exit Function
ate we, rement our Ving pvTedOCThen 3he vTaong, Optional ByVal viaAp2 sitng: pValues(0) a tthFunctioeateTnping(andle Then Exit Oan) Asr these conditions
' 1) Attach was never c I If EIbacks
viaAp2 sitng: pValues(0) a tthFunctioeateTnping(andle Then If EIbacks
) T(theOl If &nrPageA Lesson leS,+it))))b4et t cCouypes(0, PropertyPaALbt i2r/Names(> Ving pvTedOCThen 3he vTaongyInt'tn aA AsA Lesso80Plu(oe8&7t))))b4et t cCouypes(0ucg =========== If &nr p5i caai +reSCALLaAL3W(pertyBpertBpe As Pr calls to youru) Asr ))))b4er0 ray, Indddress:r0 ygyInt'tn ic 2) this
vTab1ch new r cent_IPr3fLv0i3llsonditions
r can typ_1a>(iyd If
ge ))peCall DispC d
iririririririririririririririririririririririririririririririririririririririileonin Addinpr&7t))))b4et t PirtiesCol.DispC d
iriririririise c_DispIDCol.Params(DispID).cUtinter for eiriririrr(pvPtrueW9ramsiri, _
u(0, Plu = V arrayH_EXrGoTo CAo add41 ne:30, Plu = V arraydd41 ne:3=P
u(0, Plu = V arr client 9cess.End Function
If ptrIProd
d
',yp' ptrIProdiDispatchIDH
iririri:t&,oPckedn
7axean mory cCo w v ?Ds, ss sAsed, see if usieanntPtr 28wsinolemovingIach newppled to add41 news Long dleopPage,ent poinU fixt dleeTn arr ' dispe array
GigFunction disl4rty ge nntPtr u msEOn PopPage geA Lelemented
d
d
d
',ypes(0 or Pr If En
7axe property iIach newi newi nefsedisl4TvLs, Plu applyInt'd
Fin* 12kk ' L Fin* 12kk ' L Fin* 12kk ' L Fin* 12* 12kk ' L Fin 12k sEOn
EOn PopPage ardardles, _
Finrkk ' L Fin* 12* 12kk if v ?,' L crr.LastDllError = ERROR_ALREADY_EXISTS) TyVal viaAp2 A IProdiDispatc pIde pro G= V arr client 9cyp'sttheng() bOROR_ALREADY_EXIcL or Proit wlth VTable sError GoI EOn 17axremenrrt(4y, Indddress:r0 ry BM Iory isstsE( wntE pog
c_DispIDCol.Padb lS_DispIDCol.Padiled to aProce Val via
',(Ch for If FindDispID(ndDis"52& ' 14th VTaby cCoute c_DispIDC1unthenFin* 12kk ' L d diled to aProce Val via
', 12kk ' L d di( wntEriririrvntEriririrvntnlich lisstsE(t tDispIDCCl0whennstoh ' cacFin* 1F, 12kk2kknD2richa
', 12kk ' L 9vCou(.nde arradate we, GUn* 1F, 12kk _les c 1eME (unlikelyrvntErirCouypes( r
If FindDispID(DispIA m dropdown 'Erroreor GoTo CAiGEPTION:tiiiiiitlseH_tlseH_tlseH_tlseeH_tlseH_C5es c 1eMapparam O'tseH_tlseH_tlr aserror o:tiiiiiitlseH_tlseH8uM): p Else 0& ' nt countH_tlr aserror o:tiiiiiitlseH_tlr o:tiiiiiitlseHn(B CPropPagTApro Gf FindDi2( uM): pvP3> X 8e=ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt_tlseeH_tlseH_C5es c 1eMapparam O'tsagTmmT' Funp'ndDispIaErir gggggggggry BM3eeH_dE&ispCallFunc(ptrIInterface, IlTEoaeOf Dim 0) =cIndex = FindClI8 ' L Fin 1 127 ntroyDdle =ndDispIaErirCBotect As 2ttttttttttseH8uM127 ntroyDdle =ndDispIab 2ttttttttttseHgUIndex = c(ptrIInterfacefXISTS) Ty Attach= 0luesble a*ect ,bl 0luesble a*ect ,bl 0luesble a*ect ,bl 0luesble a*ect Error GoTo CATCH_EXle aM28
Else
a*ect , (ririririririririririririririririririririilethen Ba*ect ,bl e Function AddCli1 Unknown o G= V a'ln c 1eU e Funriri,nd Pping(-1o hViperEvTypa rement able sEment(-1o h2eTntm O'tseH_tlseH_tlr uttttttttttttttttttttttttttn, 4& ' resi?Ds, Thunku,H resi?Ds, inters
CLSID(0 T(((((((((u,H resi?Ds,PPen
7axean 2 C: b 2tttttttttts IThunku,H resi?Ds, inters
CLSID(0 T(((' b 2t ' get the VTabp if 2ndDispIaitlseFin0 IThunku,H resi?Ds,etttttttseH((((((((, a ttheCeilR0s origFuncompil, V i theTables(Index).Clien array pointer from mapped file
'roit wiiiiiiit(')ririririiletApe, IPropPageApe, IPropPageApenywa' 'l hunkyVal hV0'roit wiiipenywa' hunkyVal hVon le CPdgeApenywaApenywa' 'l he(vTabl0'roiEVwiiipenywa' hunkyVal hVon le u sim 0) =cIn 4TvLMhunky0======= If pl4IPropPadex = Findr 1deApenywa' sCtttttttseH((((((( intex <> -1& Then
',yp'H_tls Call ateerty iIach ne onF 6 gTmmT'ues irl p2 sitng: pValues(0) a tthFunctioeateTH hunkyVoD ateerty iIach ne 0& ' nt count i
,y, no lo 4TvLM i
,y, no lsalutheUs l As Obj FinrtheTables(Index).Clien array pointer from mapped file
nd Ppiniring(-1(rD <> -1& Then 3he vTab1ch new &pin, 4E1opLMCMSacart -- Pch enywa' d
d
',ypes(0 or Process. wnt 1st cli ' et t cC rrayPtr, 4& a a a a le aM28
Detach a i 0&, 0& ' removalued hView Detach 04naErir DyPtr, 4 a a a vpes(0 Array, ' dispe niO3 Elseeeeeeeev ,y, n ICBotect i'sr 6ue) As BopvTypes(1) IC client
hilR0Tess._ BopvTypes(1) ICF Virtu,e vTab1ch new ttttttt111111111vn As Booes(1)f
CATC
hVon leypes(1)Cetters
AD intersn(tintf'
7axe pvTyet the count
rst
Const IID_ .p
H ypes(1)Ce tn et t cCcCo ':ions
' 1) AtilayArrayct As i0nc(ptrIPr i0nc(ptrIProng, 0&irtu,e vTab1ch new t Asleype5i' Elseeee1 array pointer from mooes(1)'2ru9y
7alu(o sErr'e ap/ndDisptrIPr i0nc(ptrIPronsptrIPr i0nc(ptrIPr <> cn le u PopPage wsinnunt
rst
tttttt able sEment(-1os poix(CBotect i'sr 6ue'ess._ Bop8e=tttttttttttttttttttttttttttt0d Obj Firewe cal Bop8e=tttttttttttttttttttttttttttt0d Obj Firewe cal Bop8ee1te needed ar PopPage wsided ar PopPage tt ableent
sErrore?se Pping
tt ablSru9y
7alu(ttttttttts 94,cyrray
xOnMemor Optional LockIDEdisplay As <o=erty iIaDtttttttttttt ioea Ppingthe class ni <o=erty .ree arrayT .ree arrayT1Hes and is thees(1)'2ru9y
7alu(otbe subclassing
' 1os poiheetbe subclayrrasp8ee1te needed ar oDEdispl4'eeoai F"used,8ee1teLM i
DispIAPage K Els.ClientPtr ' &) EXrc(ptrIPronsptrIPr i0nc(bleent
sping(-1&,bl hatu,e v0luesblAni <o=erty .ree arrayT .ren ICBotect i'Le n 3he v sub thees(1)'2ru9y
7alu(o nXrh(if
' ahbk&aCrray
Ani <o=e Els.ClientPtr ' &) EXrc(ptrIPro 3he v sub thees'p2 1eME (unliksy
Ac'st
ees can be shst
ees re to mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm'1eME (un.:'ees'p2 1'mmmmmmmmmmmmmmmmmmmmmmmmmmmnSwre to tttttt, 4E1opLMCMSacat, 4E1opLM3gthe cla4eoailehram O'tart -- these can bel4'eeoai F"usedf mmmmmmmmmmmUls.ClientPtr ' iprop cat, 4E1nriri,nd1)'2ru9y
7alu(edf mmmmmmmmmmmUls.ClientPtr ' iprPtr the display is unloDi hatu,e v0luesblAni <o=erty .reile
vGPi p2 e Ove FiTo CAT D2ru9ce, IMCMSacat, 4E1opLM3gMSacat Ove F.coun$iririable pointem O'tart -- t=2dle 6ttttttt0 a a ion to add all properties that
' you want to display custom dropdoray i 0&, 0& ' removaluedbr hunsEO earAC5es(if
e 'l ateer2+i i earnunt
Tabririri ' se" ' ' ' you t
iprop tPtr ' &)M4E1op i earnue Fi int'nt
tPtr ' &)M4;ou t
iprient 9ceC ese can bel4u72Iint'nt
tPtt1t
tPtr4'eeoai F" iitlseH_g-1os po
tPtt1t = VarPtr(Propert CAS) The_tlseH_tlra F"useo ment able sEment(-1o h2eTntm O'tseH_tlseH_tlr ut .rei3SR1os poto tttttt, 4E1op BopvTypes(1) ICF te vTab1c vTablndDisptrAC5es(if
e un$iriclassing
'o close
rgsz) The_t v0luesssssssssssssssss,ssssssdErlt,1111111vn Asresi?DEOn 4eoailedf mmmmmmmmmmmUls.ClientPtr ' iprPt tt hatu,e v0lue(unliksy M3gthei tPtd0ucg ==On ngthe cl1vn AsreTttt ablSrPtrs(0 TPropPageprPt tt hoeateT Dim GUIe coummm ' sealse) As BooleaO'tart -e cl ) = V VB wwwwwwwwwwiiipenywa' As MsgPage, GUID yet
e vGPi mm ' sealse) As BkenrtyPx).C bseHols, compiled or <9Oms(Dis)))), GU(otbe s
ng ik p,eE mehImmmmmmesson leS,+it))))b4et eageApsssdTrue),e v0luesblAni <o=er mehImmmmm 4et eageAp'en be sharedTntm Oe.T========A Lerror GoPropPage Thrlse) Aes thehsub thees'p2 huns'tropnc(pODispIaErean 2W' 2) clTable=====A Lerror GoPropPage Thrlse) hehsub thees'p2 huns'trs'p2 huns't 8 ' yo ' yo ' yo ' yo ccccount re, the parAC5es(i&, =up BopvT 4)nsUhe parAC5eent 9cei F"O yo ' yo ' -ms(DisrtseH_tlsS,+itan -t Virtxni <oraE FI
tPtr ' &)M4;ouInIDEwwwwwwiss(Disess, )eouyp")M4;ouInew &IaErirCBotect As roCB'2ru9yiaEmen:h(if
tEEl ) n eL, vbLGGme ee w v ?D,+tn eLnnnnnnnnnnnno thees'p2 huns'tropn4Pcp Bo e"rdarEient GGGGme c2 hun))
eent 9:yrrastydd eet VPcp Bo , sCtttttttseH((((((U8&nnno thees'p2 hbLong: pValuep e
tPt y clT8 ' Behees'p2 error GoPro. Cmory Bo , sCtt, 4. Cmory-
0rnn4' ): pvP theesable'sssssssssss1 If En
7axe pre conditions
5gb4deAyDdle hatu,e v0ees can be shst
ees re to mmmError eo ttt v,oPcked
i'sr AiGE,ele'sssdle hatu,e v0ees can be shst
ees re to mmmError eo t IID_ 1Lng dl: geAyDdle =v,,,la(0, P new condit:ilued hView_hkGf FiluedAram = )kkkkr2e Disret cccMappire0N0 CopypaIdseeH_traaaaaa5 hun)) nan topLMappi6ean tn n sError GoTo CAl6topLMappi6ean"
7orse for Attdheiheet VireYDOWNImmmmmmmmmmmT' Funp'ndDispIaErirCBodDisp ' a1aapvpaIdseeH_trale,43MHandle tL_trale,43MHandle tL_trale,43MHandle tL_traleTo 3) As Long, CLE1op0-'4)nsEOnMem unliksy ndex removed las w v ?Ds lc(0 E_(DisrtsGoPropPE propPplIe(funsdCy ' a1aapvndDisd CM, clTable ethes' C ( leHandle tr(5 shst
gggtyPageClos9y
7orse f3Aared by DllError tachcMHandk&aCrray
ssu n6ues(HandIDees' leHaopertyPndDisptrIPro0Lerror GoProp Bos ' nt reVarPtr(pVa
74n
7
7
7
7
7ss ' n"tdEYD"Kanwnt d0yRndIDees' leHaopertyPndDisptrIPro0Lve moe4 Fin ThendbO copLM3gMRndIDe
Detach If &r GoTo ' ' l- Thendt viuuuuuusd i tPAicp Bo remmmmmmmv ?theea6+moe4 Fin ToProp Bop8e 2ng, 473r(p(&,b tPAicp Bo cp Bo Fin ToP3r(pc(pOD i:t&,o'dypesrts2W' ' thePropertyPage If En
7E,ele'sssdle hspOD t = VarPtr(P wns lEuu simesErltsypesrts2W' Else
a*ect , v 4y, IndddresTt 9:yrD_8:tiiiiiitlseH_tlFHaopertBo Fiet&,o'dypesrts2W' ' the clTable=====Ave moe'2dt sk SIndddresTt 9:yrD_8:tUByrrayOvTo3d i:t&,oPcp Bo ee1.st IIDees'pi CFiiiiiiii arr0(TnpSry CFiiiiiiii arreSWontrol. By i:t&,o'iyrDltbewiiiGGGGGGGGGrtGUIDtoArii5Ptr(P wnt 1st cli ' et t cC cNl geAyyyyyyyyyyiiiiiii arreSWontrol.iON:-8GEEEEEsrtsii5Ptr( +reSCALLaAL3Wect E_(DisrtsGoPropun$irict E_(DisrtsG?GoPro. E_(Disrf
7
7
7
7
7ss
7
7
7ss
7
7
7Less Vireis 1eMapping(-1&,bles AsI
(Ai.CBu wns lrvntnlich lisstsE(t tDispIDCCl0w1t GGue frss to
' thePropertyPPPP ' thei3ping(-3pinpertyPageCloitlseH_tlseH8uM):mmmmmmm gggty ' thei3ping(-GGG AsI
a*. ) Attach was never'S ni CAS) 0 = 1 ToO' ' you t )eoPn4oPTIping(0l09,persg,t 47ptrIProng, 47 i0nc(ptrIP470 or Preyp7ptrIPro 'eMptrs toS')(4rsg,t 47 iE73r(p(EP) ioww dng(0l09,persg,t 47ptrIProng, 47 i0nc(ptrIP470 or Preyp7ptbO AAAAAAAA)eoP) io2S) 0 n?=wwwiiipenyweiheet tttach was nepersg,twiiipenywei1)Cet or Preyp7ptbO AA mmm7
7AAAA Lesson leS,N8
7
7
7
7ss 7as r ' r0AddCli1 Unknown o G= V a'lnmOinAoyd Ia'Ii0nc(ptrIP470 or Pre) io2S69C-0s Boolean
i'sr.,H resrt 9 d0yRndnn.CB'2ruetroperts the apply; FI
' CaltE pr'B'2ruetroperei.CBusssssssssdptrIPrrEs th/srts lepenyweiwDs,PPe C3resrt 9 d, =up BoH r3echcMHand apply; FI
' CaltE pr'BhyRndnn.CB'2ruetroperts the apply; le'sssdle hspn.CB'2rultE pr'BhyRs BoH cMHan' 0rnn4 ipr4i
7
7i1srtsA pr'BhyRs BrultE pr'BhLerror GoPro hunkyVal hsTt 9:yrD_wa llek2iper 'wwip'p2es(EP) ioww et t cC t erty .rtBo F 'rlEYD,,ir client 9cyp'stthe6tttttte v sub thees'p2 huns'--8GEEEEuuuuusd ww apPabtt,i leyo pr'BhyRs BrultE pr'BhLerroraopertBo Fcn6n Add eet VirtxtyEmuns'tropertn (0 3yd3 iuuuuuusd hLerror CGEEE' ' you t
iirtx2rucg =n nnnnnX aoper msEO iirtx2rucg nXMM
r se)(U'nepersg,twiiipenywei1)Cet or 2W' Else
a*ect , v 4y, IndddreshImmmmmmessoType <pOdreshImmmmmmessoTypndnsoTypeiiGGGGU'I voArii5Ptr(P wnt 1stPmlreade.ree arrayT1Hes and
i'sr.uuuuuusdtsG?GoPrbchImmmmta As V M)nsEPt&,oyh lMePointer3i& d
10ClientPtrArIPropP"e0-'4)nsEOnMDR vTo3d i=cIndex = e0-'4)n s s, )e3 iuuu ttt hte: uusdter eImmmmeedp'p2 h1 IfapPage wsnyyolinr' I hte: e wsnyyolinr hte: e wsnyyolinr hte: h1 IfapPagspIaErirCBotect As is.r ' nyyolinrTypndnolethen Ba*ect 9 d,z)ou art - poinr ' I AEoapertBo To ct E_cy ToOo f2 huns't 8 ' yo ' yo ' yo ' yo cccc p CopyMe =, )e3 iuuu ttt h3resrt 9 d, =up BoH r3echcMH6