Ŀ¼
ÕæÊÇÏë²»µ½ÏµÁÐÖ®Ò»£¨VBµ½µ×ΪÎÒÃÇ×öÁËʲô£©????£¨02£© ÕæÊÇÏë²»µ½ÏµÁÐÖ®¶þ£¨VB¿û»¨±¦µä¡ªÖ¸Õë¼¼Êõ£©????£¨11£© ÕæÊÇÏë²»µ½ÏµÁÐÖ®Èý£¨VBÖ¸Õë¿û»¨±¦µäÖ®º¯ÊýÖ¸Õ룩??£¨22£© ÕæÊÇÏë²»µ½ÏµÁÐÖ®ËÄ£¨VBÖ¸Õë¿û»¨±¦µäÖ®SafeArray£©??£¨27£© ÕæÊÇÏë²»µ½ÏµÁÐÖ®Î壨¸ßЧ×Ö´®Ö¸ÕëÀࣩ????????£¨37£© ÕæÊÇÏë²»µ½ÏµÁÐÖ®Áù£¨ÓÐÓõļ¼ÊõºÍûÓõÄÖ¸Õ룩????£¨41£© Matthew CurlandµÄVBº¯ÊýÖ¸Õëµ÷ÓÃÊÕ²Ø????????£¨45£©
1
ÿ´Î¿´´óʦµÄ¶«Î÷µ½Á˾«²ÊÖ®´¦£¬ÎҾͻáÅݸ½Ð¾ø£º\ÍÛàç£¬ÕæÊÇÏë²»µ½£¡\¡£ÔÚ¾¹ýºÜ¶à´ÎÕâÖָп®Ö®ºó£¬ÎÒ·¢ÏÖÖ»ÒªÎÒÃǶ¯ÁËÄԽÎÒÃÇ×Ô¼ºÒ²ÄÜÓÐÈñðÈËÏë²»µ½µÄ¶«Î÷¡£ÓÚÊÇÏëµ½Òª°ÑÕâЩÏë²»µ½µÄ¶«ÄóöÀ´ºÍ´ó¼ÒÒ»Æð·ÖÏí£¬Ï£ÍûÅ×שÒýÓñ£¬ÄÜÒý³ö¸ü¶àÈÃÈËÏë²»µ½µÄ¶«Î÷¡£
ÕæÊÇÏë²»µ½ÏµÁÐÖ®Ò»£ºVBµ½µ×ΪÎÒÃÇ×öÁËʲô£¿
¹Ø¼ü×Ö£ºVB¡¢µ×²ã¡¢WIN32¡¢API¡¢COM
ÄѶȣºÖм¶
ÒªÇó£ºÊìϤVB£¬»áÓÃVCµ÷ÊÔÆ÷£¬Á˽âWIN32 SDK¡¢COM¡£
VBÒ»Ö±ÒÔÀ´±»ÈÏΪÓÐÒÔÏÂÓÅȱµã£ºÓŵãÊÇÉÏÊÖ¿ì¡¢¿ª·¢Ð§Âʸߣ»È±µãÊÇÄÜÁ¦ÓÐÏÞ£¬ÔËÐÐЧÂʵ͡£ÕâÕýÊÇÓÐЩÈí¼þ°ÑVB×öΪÊ×Ñ¡ÓïÑÔ£¬¶øÓÐЩÈí¼þ¿Ï¶¨²»»áÓÃVB×öµÄÔÒò¡£¶øºÜ¶àVC£¬DELPHIµÄ³ÌÐòÔ±¶¼ÈÏΪVBÀï¸ã¿ª·¢²»×ÔÓÉ£¬ËüÈÃÎÒÃÇ×öʱäÈÝÒ×µÄͬʱ£¬Ò²ÈÃÎÒÃÇ·¢»ÓµÄÓàµØÔ½À´Ô½Ð¡¡£µÄÈ·£¬¼òµ¥ºÍ¹¦ÄÜÇ¿´óÕâÁ½Õß±¾Éí¾ÍÊÇÒ»¶Ôì¶Ü¡£ÄÇÅÂÒ»ÐдúÂ벻д£¬½ö½öÆð¶¯ÔËÐÐÒ»¸ö¿Õ´°ÌåÕâÑù¼òµ¥¶¯×÷£¬VBÔÚµ×ϾÍΪÎÒÃÇ×öÁË´óÁ¿¸´ÔӵŤ×÷£¨¾ö²»½ö½öÊÇ×¢²á´°¿ÚÀà¡¢ÏÔʾ´°¿Ú¡¢Æð¶¯ÏûϢѻ·Õâô¼òµ¥£©£¬ÕâЩ¹¤×÷¶Ô³ÌÐòÔ±ÊÇ͸Ã÷µÄ¡£ÎÒÃÇÔÚ¸ÐлVB¿ª·¢Ð¡×é¶ÔÎÒÃdzÌÐòÔ±ÌåÌùÈë΢µÄͬʱ£¬²»½ûÒ²ÒªÔð¹ÖΪʲôÔÚÎĵµÖжÔÕâЩµ×²ãµÄ¶¯×÷Ö»×ÖδÌᣬËäÈ»ÕâЩ¶¯×÷¶Ô×îÖյijÌÐòÒ²Ðí²¢ÎÞÓ°Ï죬µ«ÎÒÃÇÓµÓÐÖªÇéȨ£¬¸üºÎ¿öÕâЩ¶¯×÷ÓÐʱµÄÈ·»áÓ°ÏìÎÒÃǵŤ×÷£¨ÎÒ½«ÔÚ±¾ÏµÁкóÃæµÄ¡¶VB¶àÏ̡߳·ÖÐ̸µ½ÕâÖÖÓ°Ï죩¡£
È»¶ø£¬ËùÓÐÏ£Íû´Ó±¾Îĵõ½\δ¹«¿ª¼¼ÊõÃØÃÜ\µÄÅóÓÑÄ㽫»áºÜʧÍû£¬ÒòΪÎÒÄܹ»ÖªµÀµÄºÍÄãÒ»Ñù¶à£¬ÎÒÃÇËùÄÜ×öµÄÒ»ÇоÍÊÇÕ¾ÔÚÍâÃæÀ´²ÂVBÔÚÀïÃæ×öÁËʲô£¿ËùÒÔÎÒ¾ö²»ÊÇÒª´ø´ó¼ÒÒ»ÆðÈ¥½«VB·´Ïò¹¤³Ì£¬¶øÊÇÏëͨ¹ý²ÂÏëVBµÄÄÚ²¿¹¤×÷À´½«Ò»Ð©ÔÀ´±È½ÏÄ£ºýµÄ¸ÅÄî¸ãÇå³þ¡£×÷Ϊһ¸öϵÁеĵÚһƪÎÄÕ£¬ËüµÄÄ¿µÄÊÇΪÁ˺óÃæµÄÉîÈë´òÏ»ù´¡£¬ËùÒÔÎÒ»áÔÚÐèÒªµÄʱºòÖ¸³öÎÒÃDZØÐëÕÆÎÕµÄ֪ʶµã£¬Èç¹ûÄã²»Çå³þ£¬Ç뼰ʱµØÑ§Ï°Ïà¹ØÊé¼®À´²¹¿Î£¬¾ßÌå¼û¡¶²Î¿¼ÊéÄ¿¡·¡£
×îºó£¬ÒªÉùÃ÷ÎÒÔÚ±¾ÎÄÖÐËù×öµÄ¸÷ÖÖʵÑéºÍÍÆ¶Ï½öÊÇÎÒ¸öÈ˵Ĺ۵㣬²»Äܱ£Ö¤ÆäÕýÈ·ÐÔ£¬²¢ÇÒ²»³Ðµ£ÈκÎÏà¹ØµÄ·¨ÂÉÔðÈΡ£
ºÃ£¬¿ªÊ¼°É£¡Ê×ÏÈ×¼±¸ºÃÎÒÃǵÄÎäÆ÷£¬ÎÒÏÂÃæÒªÊ¹ÓõŤ¾ßÖ÷ÒªÓУºVB6ÖÐÎÄÆóÒµ°æ+SP5£¨·Ï»°£©£¬»¹ÓÐSPY++¡¢Dependency WalkºÍOLE Viewer£¨ÒÔϼò³ÆSPYºÍDEPENDºÍOLEVIEW£¬SPYÔÚVB¹âÅ̵Äcommon\\tools\\vb\\ϵÄSPYĿ¼ÖУ¬OLEVIEWÊÇÆäÏÂOLETOOLSĿ¼ÖеÄOLEVIEW.EXE£¬×¢ÒâÆäÏ»¹ÓÐÒ»¸öOLE2VW32.EXE¹¦ÄÜÀàËÆ£¬²»¹ý±¾ÎÄËùÖ¸µÄÊÇOLEVIEW.EXE£¬»¹DenpendÔÚÆäϵÄUnsupprt\\DEPENDÀ¡£»¹ÒªÓÃÓÃ
2
VC£¨ÉÏÃæÌáµÄ¹¤¾ßÔÚVCÀïÓУ©£¬ÒòΪÎÒÃÇ»¹Òª¿´¿´VBÉú³ÉµÄ´úÂ룬¸ãVB¸ß¼¶¿ª·¢µÄÅóÓÑÒ»¶¨Òª»áÓÃVCµ÷ÊÔÆ÷£¬¶®µã»ã±à¸üºÃ¡£µ±È»£¬±¾ÎĵÄÖØµã²»ÔÚÕâ¶ù£¬ËùÒÔûÓÐVCÒ²²»Òª½ô¡£
´ò¿ªVB6н¨Ò»±ê×¼EXE¹¤³Ì£¬ÔÚ\¹¤³Ì\ÒýÓÃ\¶Ô»°¿òÀïÓ¦¸ÃÒÑÓÐËĸöÒýÓ㬼òµ¥µã¾ÍÊÇ£º1¡¢Visual Basic For Application(VBA) 2¡¢VBÔËÐÐʱ¶ÔÏó¿â 3¡¢VB¶ÔÏó¿â 4¡¢OLE×Ô¶¯»¯¡£Ç°ÃæÈý¸öÊÇÈκÎVB¹¤³Ì¶¼±ØÐëµÄ£¬ÄãÏë²»Òª¶¼²»ÐУ¬²»ÐÅÄãÊÔ×ÅÈ¥µô¶ÔËüÃǵÄÒýÓá£ÄÇôÕâÈý¸öºËÐÄÀàÐÍ¿â¸÷ÓÐʲôÓã¬ÔÚ×îÖÕÉú³ÉµÄ¿ÉÖ´ÐгÌÐòÖаçÑÝÔõÑùµÄ½ÇÉ«£¬ÕâÊDZ¾ÎÄÒª·ÖÎöµÄµÚÒ»¸öÎÊÌâ¡£
1£©VB¡¢VBA¡¢VBSµÄÇø±ðÄã¸ãÇå³þÁËÂð£¿
Ê×ÏÈVBS²»Ó¦¸ÃºÍVB¡¢VBA·ÅÔÚÒ»Æð±È½Ï£¬ËüÊÇ΢Èí°´ÕÕ×Ô¼º¶¨ÒåµÄActiveX Scripting¹æ·¶ÍêÈ«´ÓÍ·¿ªÊ¼Ð´³ÉµÄ½Å±¾ÓïÑÔ£¬ËäÈ»ËüµÄÓï·¨½á¹¹ºÍVB·Ç³£ÏàËÆ£¬µ«VBS½ö½öÒÀ¿¿×Ô¶¯»¯¶ÔÏóÀ´À©³äÆä¹¦ÄÜ£¨Ö»ÓкóÆÚ°ó¶¨£©£¬Ëü²»ÄÜÓÃimplementsÀ´ÊµÏÖ½Ó¿Ú£¬²»¿ÉÄÜÔÚVBSÀïÖ±½ÓʹÓÃAPI£¬Ã»ÓÐVarPtrÕâÑùÄܵõ½Ö¸ÕëµÄº¯Êý£¬¶øVBSȱÉÙµÄÕâЩ¹¦ÄÜÕýÊÇVBºÍVBAËùÌØÓеġ£µ±È»£¬Õâ²»ÊÇ˵VBS²»ÈçVB»òVBA£¬WindowsÒѾΪVBSÌṩÁË×㹻ǿ´óµÄ¹¦ÄÜ£¬ÎÒÃÇ¿ÉÒÔÓÃVBSÀ´×ö½Å±¾COM×é¼þ£¬¶øÇÒ½è×Ô¶¯»¯¶ÔÏóµÄÄÜÁ¦VBS¿ÉÒÔ˵ÄÜÁ¦ÎÞÏÞ£¬ËùÒÔÓв¡¶¾ÓÃVBSÀ´Ð´£¬¶Ô³ÌÐòÔ±À´ËµVBS×îÖØÒªµÄ¹¦ÄÜιýÓÚ¿ÉÒÔ¸ø×Ô¼ºµÄÈí¼þÌṩºê¹¦ÄÜ£¬¾ÍÏóVCÖÐÌṩµÄVBSºê¹¦ÄÜÄÇÑù¡£×¢Ò⣬VBSÊÇFreeµÄ£¬ÕâºÍÔÚOfficeÖÐʹÓÃVBAÀ´Ìṩºê¹¦Äܲ»Í¬£¬Òª¼¯³ÉVBAÐèÒª¼Û¸ñ²»µÍµÄÐí¿ÉÖ¤·ÑÓ㬹ØÓڽű¾ÓïÑԿɲμûMSDNÖÐPlatform SDK\\Tools and Languages\\Scripting¡££¨ÔÚ±¾ÏµÁкóÃæµÄÎÄÕ¡¶½Å±¾¹¦ÄÜ¡·ÖÐÎÒ»áʵ×öÒ»¸öÓÃVBSÀ´Ìṩºê¹¦ÄܵÄСÈí¼þ£©
ÄÇôVBºÍVBAÓÖÓÐʲô²»Í¬ÄØ£¿ºÃ°É£¬ÑÛ¼ûΪʵ£¬¿ªÊ¼ÎÒÃǵÄʵÑé°É£¡
Èç¹û×°ÁËOffice 2000ÒÔÉϰ汾£¬ÄÇô´ò¿ªOLEVIEW£¬µã»÷FileϵÄView TypeLib²é¿´Î»ÓÚE:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6ϵÄVBE6.dllµÄÀàÐͿ⣬ÔÙÓÃͬÑùµÄ·½·¨¿´¿´MSVBVM60.dllµÄÀàÐͿ⣬Äã»á·¢ÏÖËüÃǵÄÀàÐÍ¿â»ù±¾ÉÏһģһÑù£¬³ýÁËVBE6¶àÁËÒ»¸öVBEGlobal½Ó¿ÚºÍʵÏÖÕâ¸ö½Ó¿ÚµÄGlobal¶ÔÏó£¬Õâ¸öGlobal¶ÔÏóÎÒÃÇÒ²¿ÉÒÔÔÚVBA±à³Ì»·¾³£¨±ÈÈçÓÃWORDµÄVB±à¼Æ÷£©ÖÐÓöÔÏóä¯ÀÀÆ÷¿´µ½¡£ËüÓжþ¸ö·½·¨LoadºÍUnLoad£¬»¹ÓÐÒ»¸öUserFormsÊôÐÔ£¬ÕâÊÇÒòΪVBA6ʹÓÃMS Form 2.0 FormÉè¼ÆÆ÷(FM20.dll)À´Éè¼ÆºÍʹÓÃUserForm´°Ì壨¶øÔÚVB6ÖУ¬ÎÒÃÇ¿ÉÒÔʹÓöà¸öÉè¼ÆÆ÷¡£±ÈÈçͨ¹ýʹÓÃMS Form 2.0 FormÉè¼ÆÆ÷£¬ÎÒÃǾÍÄÜÔÚVBÖÐʹÓÃVBAËùʹÓõÄUserFormÓû§´°Ì壩¡£ºÍVBAµÄGlobal¶ÔÏóÀàËÆ£¬ÔÚVBÖÐÒ²ÓÐGLobal¶ÔÏ󣬴ÓVBµÄ¶ÔÏóä¯ÀÀÆ÷ÖпÉÒÔÖªµÀËüÔÚvb6.olbÕâ¸öÀàÐÍ¿âÖУ¬Õâ¸öÀàÐÍ¿â¾ÍÊÇÿ¸ö¹¤³Ì¶¼±ØÐëÒýÓõÄVB¶ÔÏó¿â£¬ËùÓеÄVBÄÚÖöÔÏó¶¼ÔÚÕâÀï¡£¶øVBAµÄUserFormÖÐʹÓõĶÔÏó¶¼ÔÚFM20.dllÖС£
³ýÁËÉÏÊö²»Í¬Í⣬VBºÍVBA»¹ÓÐÒ»¸ö×î´óµÄ²»Í¬£¬¾ÍÊÇVBA²»ÄÜÉú³ÉEXE¿ÉÖ´ÐÐÎļþ£¬µ«¿ÉÒÔ²ÂÏëÔÚIDE»·¾³ÖÐVBAºÍVB¶¼Òª°Ñ´úÂë±àÒë³Ép-codeÀ´Ö´ÐУ¬ºóÃæÎÒ½«ÓÃʵÑéÀ´Ö¤Ã÷µÄÈ·ÊÇÕâÑù£¬ËäÈ»ÔÚ¾ßÌåµÄʵÏÖÉÏVBºÍVBAÓкܴóµÄ²»Í¬¡£
´ÓÉÏÃæµÄ·ÖÎöÉÏ¿ÉÒÔ¿´µ½VBºÍVBA»¹ÊÇÓкܴó²»Í¬µÄ£¬ÕâÖÖ²»Í¬Ö÷ÒªÌåÏÖÔÚ±à³Ì»·¾³ºÍ¶ÔÏó½á¹¹ÉÏ£¬µ«ÔÚ±¾ÖÊÉÏËüÃÇÖ®¼äÈ´ÓÐ×Ų»¿É¸îÉáµÄѪԴ¹ØÏµ¡£Èç¹û¸Õ²ÅÄã×ÐϸµØ¹Û²ì
3
ÁËMSVBVM60.dllµÄÀàÐͿ⣬Äã¾Í»á·¢ÏÖÈçÏÂµÄÆ¬¶Ï£º
// Generated .IDL file (by the OLE/COM Object Viewer)
[
dllname(\
uuid(35BFBDA0-2BCC-1069-82D5-00DD010EDFAA),
helpcontext(0x000f6ec4)
]
module Strings {
[entry(0x60000000), helpcontext(0x000f665f)]
short _stdcall Asc([in] BSTR String);
[entry(0x60000001), helpcontext(0x000f6e9f)]
BSTR _stdcall _B_str_Chr([in] long CharCode);
¡¡¡¡¡
}
ʲô£¿ÔÚMSVBVM60.dllÖеĶÔÏóÆä·½·¨È´¶¨ÒåÔÚVBA6.DLLÖУ¿£¡VB°²×°Ä¿Â¼Ï²»¾ÍÓиöVBA6.DLLÂð£¿ÔÙÓÃOLEVIEW¿´¿´Ëü£¬ÍÛàç£¬ÕæÊÇÏë²»µ½Ëü¾ÓÈ»ºÍMSVBVM60.DLLµÄһģһÑù¡£Ôõô»ØÊ£¿¸Ï¿ìÔÙÄóöDEPENDÀ´¿´¿´VBA6.dll¡¢MSVBVM60.dllºÍVBE6.dllÕâÈý¸öDLLµÄÊä³öº¯Êý¡£¹þ£¬ÓÖÓÐз¢ÏÖ£¬ÎÒÃÇ¿ÉÒÔ·¢ÏÖÔÚÈý¸öDLLµÄÊä³öº¯ÊýÖдӱàºÅ512µ½717¾ø´ó²¿·Ö¶¼ÊÇһģһÑùµÄһЩÒÔrtc¿ªÍ·µÄº¯Êý£¬±ÈÈç595µÄrtcMsgBox£¨rtcÊÇʲô£¿Ó¦¸ÃÊÇRun Time Component? Control? Code?ÓÐËÖªµÀÂ𣿣©£¬Õâ˵Ã÷Èý¸öDLL¶¼ÓÐ×ÅÏàͬµÄÔËÐÐʱVBAº¯Êý¡£
ÎÒÃÇÔÙÓÃDEPENDÀ´¹Û²ìÒ»ÏÂVB6.EXE, ÎÒÃÇ¿ÉÒÔ·¢ÏÖVB6.EXEÒýÈëÁËVBA6.DLLÖÐһЩËüÌØÓеÄÒÔEbºÍTip¿ªÍ·µÄº¯Êý£¬´ÓÕâЩº¯ÊýµÄÃû³ÆÉÏ¿ÉÒÔ·¢ÏÖËüÃǵŦÄܶ¼ÊÇIDEÏà¹ØµÄ£¬±ÈÈç79µÄEbShowCodeºÍ82µÄTipDeleteModule¡£VB6.EXEǡǡûÓÐÒýÈëÈκÎrtc¿ªÍ·µÄº¯Êý£¨×¢ÒâÒ»£©¡£ÎÒÃÇÔÙÀ´¿´¿´MSVBVM60.DLL£¬Ëæ±ãÕÒÒ»¸öÓÃÁËMsgBoxº¯ÊýµÄ±àÒëºóµÄÎļþ£¬ÓÃDEPENDÀ´¹Û²ìËü£¬¾Í»á·¢ÏÖËüÒýÈëMSVBVM60.DLLÊä³öµÄ595ºÅrtcMsgBoxº¯Êý£¨×¢Òâ¶þ£©¡£²¢ÇÒÒýÈëMSVBVM60.DLLÖкܶàÒÔÏ»®Ïß¿ªÍ·µÄº¯Êý£¬±ÈÈç__vbaVarAbs£¨×¢ÒâÈý£©¡£Æäʵ´ÓÕâ¸öÈý¸ö\×¢Òâ\ÖÐÎÒÃÇÒѾ¿ÉÒÔ½øÐÐһЩ²ÂÏ룬ÎÞÂÛ¶Ô´í£¬Äã¿ÉÒÔÏÈÏëÏë¡£
4
Èç¹ûÄãûÓиú×ÅÎÒ×öʵÑ飬¶ø½ö½öÊÇ¿´ÕâÆªÎÄյϰ£¬ÎÒ²ÂÏëÄãÓ¦¸ÃÓеã»èÁË¡£Èç¹ûÄã×Ô¼º¶¯ÊÖ×öÁËÕâЩʵÑ飬ÏÖÔÚÄãÓ¦¸Ã³äÂúÁËÒÉÎʶø¼±ÊÌ¿´µ½½áÂÛ¡£ËùÒÔÇëÒ»¶¨ÒªÇ×ÊÖÊÔÒ»ÊÔ£¬Ñ§Ï°Ñо¿ÎÊÌâµÄ·½·¨±È¿´½áÂÛ¸üÖØÒª¡£
µ½ÕâÀïÖÁÉÙÎÒÃÇ¿ÉÒԵóö½áÂÛ£ºVBºÍVBA±¾¾ÍÊÇͬ×ڵĽãÃã¬Ö»²»¹ý½ã½ãVBµÄ¹¦·òÒª±ÈÃÃÃÃVBAÀúº¦Ð©¡£²»¹ý½ã½ãÖ»»áµ¥´ò¶À¶·ÊÇŮǿÈË£»ÃÃÃÃÈ´Ö»»á°ø´ó¿î¡£½ã½ãÓÐÉúÓýÄÜÁ¦£¬ÊÇÕæÕýµÄÅ®ÈË£»ÃÃÃÃÈ´²»»áÉúáÌ£¬µ«ÉîÆ×Ïà·òÖ®µÀ£¬Ò»·¬½Ìµ¼Ö¸»Ó֮ϿÉʹËýÀϹ«ÔöÉ«²»ÉÙ£¬¶øVBSÄØ£¬Ò²ÊÇ´ó»§È˼ҵÄÅ®¶ù£¬²»¹ýûÓÐVBºÍVBA½ãÃÃÓÅÐãµÄѪͳ£¬½¿Ð¡Ááçç¸É²»µÃ´Ö»îÖ»ÄÜÖ¸»ÓЩ×Ô¶¯Ìý»°µÄ¶ÔÏóÀ´¸É»î£¬ËýÀÖÓÚÖúÈËÆ·µÂºÃ²»ÏóVBAÄÇÑùÖ»ÈÏ´ó¿î£¬VB¡¢VBA¡¢vbsÈý¸öÅ®ÈËÎÒ¶¼Ï²»¶¡£
2)Native Code(±¾µØ´úÂë)µ½µ××öÁËʲô£¿
´òÆð¾«Éñ£¬ÎÒÃÇÔÙÉîÈëÒ»²½¡£ÓÃOLEVIEWµÃµ½µÄÀàÐͿ⻹²»ÄÜÕýÈ·µÄ·´Ó³¸÷¶ÔÏó·½·¨¶ÔÓ¦µÄDLLÖеĺ¯ÊýÈë¿Ú£¬ÄãÓ¦¸ÃÒѾ·¢ÏÖÓÃOLEVIEWµÃµ½µÄIDLÎļþÖи÷¸ö·½·¨µÄentryÊôÐÔÖµ¶¼ÊÇ0x600000XXÕâÑùµÄ¼Ù¶«Î÷¡£ÒªµÃµ½ÀàÐÍ¿âÖи÷·½·¨ÔÚDLLÖеÄÕæÕýÈë¿Ú£¬ÎÒÃÇÐèÒª×Ô¼ºÀ´Ð´¶Î³ÌÐò¡£
¼´Ê¹ÔÚVBÖÐÎÒÃÇÒ²¿ÉÒԷdz£ÈÝÒ׵ػñÈ¡ÀàÐÍ¿âÐÅÏ¢£¬ÔÙ¼ÓÉϵãCOM³õʼ»¯ºÍµ÷ÓôúÂ룬ÎÒÃǾÍÄÜÓÃ×Ô¼ºµÄ´úÂëʵÏÖVB6²ÅÒýÈëµÄCallByNameº¯Êý£¨ÔÚ±¾ÏµÁкóÃæµÄ¡¶Hack COM¡·ÖÐÎÒ»á¸üÉîÈë̸̸COM£¬×÷ΪһÃûVB³ÌÐòÔ±¶ÔCOMµÄÀí½â·Ç³£ÖØÒª£©¡£ÓÉÓÚ±¾ÎĵĹؼü²»ÊÇÖ¸µ¼ÈçºÎÔÚVBÀïʹÓÃÀàÐͿ⣬ËùÒÔÏÂÃæÌṩµÄ·½·¨¾¡Á¿´Ó¼ò¡£
н¨Ò»¸ö±ê×¼EXE¹¤³Ì£¬Ìí¼Ó¶ÔTypeLib InfomationµÄÒýÓã¬ÔÚFormÖзÅÒ»¸öÃûΪlblInfoµÄ±êÇ©£¬È»ºóÌí¼ÓÈçÏ´úÂë:
'³ÌÐò1
Private Sub Form_Load()
Dim oTLInfo As TypeLibInfo
Dim oMemInfo As MemberInfo
Dim sDllName As String
Dim sOrdinal As Integer
Set oTLInfo = TLI.TypeLibInfoFromFile(\
5
lblInfo = \Ä£¿é°üº¬ÒÔÏ·½·¨£º\
For Each oMemInfo In oTLInfo.TypeInfos.NamedItem(\
With oMemInfo
.GetDllEntry sDllName, vbNullString, sOrdinal
lblInfo = lblInfo & .Name _
& \¶¨ÒåÔÚ\ÖУ¬\
& \Æä±àºÅΪ\
& vbCrLf
End With
Next
End Sub
ÔËÐÐÒÔºóÎÒÃǾͿÉÒÔÖªµÀMATHÄ£¿éÖеÄAbs·½·¨¶¨ÒåÔÚVBA6.DLLÖУ¬Æä±àºÅΪ656¡£ÔÚDEPENDÖв鿴VBA6.DLLÖбàºÅΪ656µÄº¯Êý£¬¹ûÈ»¾ÍÊÇrtcAbsVar£¬ÓÃVBE6.DLLÊÔÊÔ½á¹ûÏàͬ¡£
»¹¼ÇµÃÇ°ÃæµÄ×¢ÒâÒ»°É£¬VB6.EXEûÓÐÒýÈërtc¿ªÍ·µÄº¯ÊýÕâ˵Ã÷ÔÚIDE»·¾³ÖÐÖ´ÐеÄVBA·½·¨Êµ¼ÊÉÏÊÇͨ¹ýCOMµ÷ÓÃVBA¶ÔÏó¿âÖеķ½·¨£¨¸ú×Ùp-codeÊÇØ¬ÃΣ¬ËùÒÔÎÒÎÞ·¨ÑéÖ¤ËüÓõÄÊÇʲô°ó¶¨·½Ê½£©¡£¶ø×¢Òâ¶þÖÐÌáµ½µÄ×îÖÕ¿ÉÖ´ÐгÌÐòÖÐÒýÈëÁËrtcMsgBox£¬ÈçÎÒÃÇËùÁÏ×îÖյijÌÐò»áÖ±½Óµ÷ÓÃËü£¬ÕâÒª±ÈCOMµ÷ÓÿìÒ»µã£¬µ«ÔÚ¸ú×Ù×îÖÕ³ÌÐòʱ£¬ÎÒ·¢ÏÖrtcMsgBoxÄÚ²¿È´ÊǾ¹ýÁ˶þÍòÎåǧÀﳤÕ÷ºó²Å»áÈ¥µ÷ÓÃMessageBoxAÕâ¸öAPI£¬Æä¼äÓжà´Î¶ÔÆäËü¶ÔÏóµÄCOMµ÷Óã¬Âý£¡¿ÉÄÜÊÇÒòΪÏÔʾµÄÊÇģ̬¶Ô»°¿ò£¬ÔÚ¶à½ø³Ì¶àÏ̻߳·¾³ÓкܶàÐèÒª¿¼ÂǵÄÒòËØ°É£¬Èç¹ûÄãÊÇ·è¿ñÔÚÒâЧÂʵijÌÐòÔ±£¬ÄãÓ¦¸ÃÊÔÊÔÓÃAPIÀ´ÖØÐ´MsgBox£¬¾ø¶Ô¿ì²»ÉÙ¡£ÔÙÀ´¿´¿´×¢ÒâÈý£¬ÈÃÎÒÃǰÑÒÔϵijÌÐò±àÒë³ÉʹÓñ¾µØ´úÂëµÄ\³ÌÐò2.EXE\£¨ÎªÁ˺óÃæµÄʵÑ飬¿ÉÒÔÔÚ¹¤³ÌÊôÐԵıàÒëÑ¡ÏÖн«ËüÉè³É\ÎÞÓÅ»¯\ºÍ\Éú³É
6
·ûºÅ»¯µ÷ÊÔÐÅÏ¢\³ÌÐò2.EXE\£©£º
'³ÌÐò2
Private Declare Sub DebugBreak Lib \
Private Sub Main()
Dim i As Long, j As Long
Dim k
i = &H1234
DebugBreak
k = 1234
j = Abs(k)
j = Abs(i)
MsgBox \
j = VarPtr(i)
End Sub
ÓÃDEPEND¹Û²ì\³ÌÐò2.EXE\£¬ÎÒÃÇ¿ÉÒÔ·¢ÏÖ\³ÌÐò2.EXE\²¢Ã»ÓÐÈçÎÒÃÇÔ¤ÆÚµÄÒ»ÑùÔÚÒýÈë595µÄrtcMsgBoxµÄͬʱÒýÈë656µÄrtcAbsVar£¬Ïà·´ËüÒýÈëÁË__vbaVarAbsºÍ__vbaI4Abs£¬¿´¿´º¯ÊýÃû¾ÍÖªµÀÒ»¸öÕë¶ÔµÄÊÇVariant£¬Ò»¸öÕë¶ÔµÄÊÇlong¡£Õâ˵Ã÷VBÔÚ×îÖÕÉú³ÉµÄ´úÂëÖжÔÏóAbsÕâÑùµÄ¿ÉÒÔ½øÒ»²½Õë¶Ô²»Í¬ÀàÐÍÓÅ»¯µÄVBAº¯Êý½øÐÐÁËÏàÓ¦µÄ´¦Àí£¬¹Û²ìÒ»ÏÂËùÓÐÒÔ__vba¿ªÍ·µÄº¯Êý¾ø´ó²¿·Ö¶¼ÊÇÄÇЩ×î»ù±¾×î³£ÓõÄVBAº¯Êý£¬¿ÉÒÔ˵__vba¿ªÍ·µÄVBAº¯ÊýÊÇrtc¿ªÍ·µÄVBAº¯ÊýµÄÓÅ»¯°æ±¾£¬ËüÃÇ»ù±¾ÉÏÊÇVB¿ª·¢Ð¡×éÖØÐÂдµÄ£¬¾ø´ó¶àÊýÔÚº¯ÊýÄÚ²¿ÊµÏÖ×ÔÉí¹¦ÄÜ£¬¶ørtc¿ªÍ·µÄº¯Êý´ó¶àÊýÊǵ÷ÓÃCOM·þÎñ¶ÔÏóÀ´Íê³É¹¤×÷¡£´ÓÕâô¶à__vba¿ªÍ·µÄº¯ÊýÉÏ¿ÉÒÔ¿´³öVBС×éÔÚNative Code£¨±¾µØ´úÂ룩µÄÓÅ»¯ÉÏÏÂÁ˲»ÉÙ¹¦·ò£¬Õâ¾ö¶Ô²»ÊÇ´µÅ£¡£ËüµÄÈ·¸ß¶ÈÓÅ»¯Á˲»ÉÙ¿ÆÑ§¼ÆËãÏà¹ØµÄº¯Êý£¬ÒÔABSΪÀýNative CodeÒª±Èp-code¿ì4±¶ÒÔÉÏ¡£µ«ÊDz¢²»ÊÇËùÓеļÆË㺯Êý¶¼¾¹ýÁËÕâÑùµÄÓÅ»¯£¬±ÈÈçRndº¯Êý£¬Ëü¾ÍûÓжÔÓ¦µÄ__vba¿ªÍ·µÄÓÅ»¯º¯Êý£¬¶øÊÇÖ±½Ó¶ÔÓ¦µ½rtcRandomNextº¯ÊýÉÏ£¬ËäÈ»rtcRandomNextÒ²ÒѾÓÅ»¯¹ý£¬µ«ÄÚ²¿ÒÀÈ»ÓÃÁËCOMµ÷Ó㬻¹ÊDz»Èç×Ô¼ºÖØÐ´µÄ¿ì£¬ÎÒ²»Ã÷°×ΪʲôVB¿ª·¢Ð¡×éûÓп¼ÂÇΪËüдһ¸ö¶ÔÓ¦µÄ__vbaRnd¡£
²»ÒªÒÔΪÉÏÃæµÄ·ÖÎöûÓÐÒâÒ壬ÒòΪÎÒÃÇ¿ÉÒÔ´ÓÏÖÏó¿´±¾ÖÊ£¬Ò²¿ÉÒÔ´Ó±¾ÖÊÀ´½âÊÍÏÖÏó¡£±ÈÈçÎÒÃÇÔÙ×öÒ»¸öʵÑ飬¸øÄãµÄ´úÂë¼ÓÈëÒ»¸öÀàÄ£¿é£¬Äã¿ÉÒÔÊÔÊÔÉùÃ÷Ò»¸öºÍÄÚ²¿·½·¨Í¬Ãû
7
µÄ¹«Óеķ½·¨£¨ÕâÊÇÒ»¸öºÜÓÐÓõļ¼Êõ£¬ÔÚ±¾ÏµÁкóÃæµÄ¡¶´íÎó´¦Àí¡·ÖÐÎÒÃÇ»áÓõ½ÕâÖÖ·½·¨£©£¬±ÈÈçÎÒÃÇ¿ÉÒÔÉùÃ÷Ò»¸öPublic Function Rnd(x) as single£¬Í¬ÑùÎÒÃÇ¿ÉÒÔ×Ô¼ºÐ´Ò»¸öͬÃûµÄMsgBox¡£µ«ÊÇÄãÊÔÊÔÄܲ»ÄÜÉùÃ÷Ò»¸öPublic Function abs(x) £¬ÕâʱVB¿Ï¶¨»áµ¯³öÒ»¸öĪÃûÆäÃîµÄ±àÒë´íÎóÌáʾ¿ò¸æËßÄã\ȱÉÙ±êʶ·û\£¬ÕâÖÖ´íÎó·¢ÉúÔÚÄãµÄº¯ÊýÃûºÍVB¹Ø¼ü×Ö³åÍ»µÄʱºò¡£µ«ÊÇΪʲôͬÑùÊÇMATHÄ£¿éÖеĺ¯Êý£¬absÊǹؼü×Ö£¬rndÈ´²»ÊÇ£¬VBÎĵµÀïÊDz»»á¸æËßÄãΪʲôµÄ£¬µ«Èç¹ûÄãÈÏÕæµÄ¿´ÁËÎÒÉÏÃæµÄʵÑé·ÖÎö£¬ÎÒÃǾÍÄܲÂÏëÕâÊÇÒòΪVB¶ÔÐèÒª½øÒ»²½ÓÅ»¯µÄº¯ÊýÒѾ×öÁ˸߶ÈÓÅ»¯´¦Àí£¬VB¿ª·¢Ð¡×éΪÁ˱£»¤ËûÃǵÄÀͶ¯³É¹û£¬²¢ÏÔʾËûÃǶÔ×Ô¼ºÓÅ»¯¼¼ÊõµÄ×ÔÐÅ£¬¶ø½ûÖ¹ÎÒÃÇÖØÐ´ÕâЩº¯Êý£¬Í¬Ê±VB¿ª·¢Ð¡×éÒ²³ÐÈÏ»¹ÓÐЩº¯ÊýÓдý½øÒ»²½ÓÅ»¯£¬ËùÒÔ×¼ÐíÎÒÃÇÖØÐ´Ö®¡£ÔÚÕâÀïÎÒÒªÌá³öÒ»¸öΰ´óµÄ²ÂÏ룺·²ÊÇÄܹ»±»ÖØÐ´µÄº¯Êý¾ÍÄܹ»±»ÓÅ»¯£¬¾ÍÏó·²ÊÇ´óÓÚ2µÄżÊý¾ÍÄܹ»±»·Ö½â³ÉÁ½¸öÖÊÒòÊýµÄºÍÒ»Ñù¡£
˵µ½ÓÅ»¯£¬»¹Ó¦¸Ã̸̸ֱ½ÓAPIµ÷ÓúÍʹÓÃAPIÀàÐÍ¿âµÄ²î±ð£¬»¹±ØÐë̸̸VBËùʹÓõĺó¶ËÓÅ»¯Æ÷£¨ºÍVCÓõÄÊÇÒ»ÑùµÄÓÅ»¯Æ÷£©£¬»¹Ïë̸̸ÈçºÎ¾¡×î´ó¿ÉÄÜÀ´Ê¹ÓÃvTable°ó¶¨??£¨×¼±¸ÔÚ±¾ÏµÁÐÖÐÁíдһƪ¡¶ÓÅ»¯¡·À´Ì¸ÕâЩÎÊÌ⣩¡£
¿´Á˱¾µØ´úÂ룬ÎÒÃÇÔÙÀ´¿´¿´p-code£¬ÒªÊÇÄã¿´ÁËMSDNÖйØÓÚp-codeµÄÔÀí£¬Äã¿Ï¶¨»áÍ·´ó¡£Æ½ÐĶøÂÛp-codeÕæÊÇÒ»¸öÁ˲»ÆðµÄ¼¼Êõ£¬´úÂë´óСƽ¾ù¿ÉÒÔËõС50%¡£ÎÒÃǰѳÌÐò2±àÒë³Ép-code¿´¿´£¬»¹ÊÇÓÃDEPENDÀ´¹Û²ì£¬·¢ÏÖËü²¢Ã»ÓÐÒýÈë__vba¿ªÍ·º¯Êý£¨Ã»ÓÐʹÓÃÓÅ»¯µÄVBAº¯Êý£¿£©£¬È´ÒýÈëÁËCallEngineÕâÑùµÄ¶«Î÷£¨¿Ï¶¨ÊÇΪÁ˵÷ÓÃp-codeαÂë½âÊÍÒýÇæ£©£¬¶øÇÒºÍNative CodeÒ»Ñù¶¼ÒýÈëÁËrtcMsgBox£¨±àÒëÉú³ÉµÄp-codeÔÚµ÷ÓÃMsgBoxʱӦ¸Ã±ÈÔÚIDE»·¾³ÖÐÔËÐеÄp-code¿ì£©¡£
Èç¹ûÄãÆÈ²»¼°´ýµØÔËÐÐÁ˳ÌÐò2£¬Äã¾Í»á·¢ÏÖËü½«µ¯³öÒ»¸öÓ¦ÓóÌÐò´íÎó¶Ô»°¿ò£¬Ëµ³ÌÐò·¢ÉúÒì³£¡£±ðÅ£¬ÕâÊÇÒòΪµ÷ÓÃÁËDebugBreakÕâ¸öAPIµÄÔµ¹Ê£¬Õâ¸öAPIÆäʵ¾ÍÊDzúÉúÒ»¸öInt 3Öжϣ¬Ê¹µÃÎÒÃÇÄܹ»ÖжϳÌÐòÖ´ÐС£Èç¹ûÄã×°ÁËVCÕâÑùµÄÖ§³Ö¼´Ê±µ÷ÊԵĵ÷ÊÔÆ÷£¬Äã¿ÉÒÔÔÚ´íÎó¶Ô»°¿òÖеã»÷\È¡Ïû\£¬ÕâÑù¿ÉÒÔÆð¶¯µ÷ÊÔÆ÷À´µ÷ÊÔ³ÌÐò¡£ÎÒ¾ÍÊÇÕâÑù¸ú×Ù³ÌÐòÔËÐеġ£Èç¹ûÄãÏë¿´¿´VBÉú³ÉµÄ³ÌÐò·´»ã±à´úÂë¿ÉÒÔ×Ô¼ºÊÔÊÔ£¬ÎÒÃÇ¿ÉÒÔÓÃͬÑùµÄ¼¼ÊõÔÚVB»òVBAµÄIDEÖÐÀ´ÖжϳÌÐòÖ´ÐУ¬±ÈÈçÎÒÃÇÍêÈ«¿ÉÒÔÔÚWordµÄVB±à¼Æ÷ÖÐÔËÐÐÉÏÃæ³ÌÐò2µÄ´úÂ룬´Ó¶øÖжÏÓÚWordµÄ½ø³ÌÖУ¬²¢¿É¹Û²ìµ½VBAÉú³ÉµÄp-code´úÂë¡£±ÈÈçVBºÍVBAÔÚIDEÖÐÉú³ÉµÄp-code´úÂë¾Í»á·¢ÏÖËüÃÇÕâ¼äÓкܴóµÄ²»Í¬¡£
ËùÒÔ£¬IDEÖÐÔËÐеijÌÐòºÍ×îÖÕÉú³ÉµÄ³ÌÐòÊÇÍêÈ«²»Í¬µÄ¡£ÓÃSPY++¿´¿´ÄãÔÚIDEÖÐÔËÐеĴ°Ì壬Äã»á·¢ÏÖËüÔÚVBµÄÖ÷Ïß³ÌÏ£¬Ò²¾ÍÊÇ˵ÔÚIDEÖÐÄãÓóÌÐò×ö³öµÄ´°ÌåºÍVB IDE¹¤×÷´°¿ÚÒ»ÑùÊôÓÚVB IDE£¬ÄãµÄ³ÌÐòÔÚIDEÖÐÔËÐÐʱÉêÇëµÄ×ÊÔ´Ò²ÊôÓÚVB IDE¡£ÓÐЩ³ÌÐòÔÚIDEÖÐÔËÐлáÈÃIDEËÀµô£¨ÔÚVB5ÖÐд´¿API¶àÏ߳̾ÍǧÍò±ðÔÚIDEÖÐÔËÐУ¬¶¨ËÀÎÞÒÉ£¬Ïà±ÈÖ®ÏÂVB6µÄIDE½¡×³µÃ¶à£©¡£»¹ÓÐЩ³ÌÐò¿ÉÄÜÔÚIDEÖÐÄÜÕý³£¹¤×÷£¬µ«Éú³ÉEXEºó¾Í¹¤×÷²»ÁË¡£×ÜÖ®£¬ÔÚдϵͳ³ÌÐòʱҪ¿¼Âǵ½ÕâÖÖ²»Í¬¿ÉÄÜÒýÆðµÄÎÊÌâ¡£
3)VBµÄ±àÒë¼¼Êõ£¬ÒªÎÒÔõô¿äÄ㣬ÓÖÒªÎÒÔõôÂîÄã¡£
8
¿´ÁËÉÏÃæ¶ÔNative CodeµÄ¸ß¶ÈÆÀ¼Û£¬Äã¿ÉÄÜ»á¶ÔVB×ö³öµÄ¶«Î÷¸üÓÐÐÅÐÄÁË£¬Ñü°å¸üÖ±ÁË¡£Êǵģ¬×÷ΪVB³ÌÐòԱûÓÐʲôÐèÒªº¦Ðߵģ¬Ò»¸ö¹¦Á¦ÉîºñµÄVB³ÌÐòÔ±ÀíÓ¦ÄÃ±ÈÆÕͨVC³ÌÐòÔ±¸ü¶àµÄ¹¤×Ê£¬ÒòΪËûµÄÉú²úÁ¦ÊÇVC³ÌÐòÔ±µÄºÃ¼¸±¶£¬¶ø×ö³öµÄ³ÌÐòÔÚÖÊÁ¿ÉϺÍVC×öµÄÏà²îÎÞ¼¸¡£
ÉõÖÁÓдóʦ¿ªÍæÐ¦ËµVBµÄÄÚÖöÔÏó¾ÍÊÇÓÃVBд³öµÄ£¬±ÈÈçÎÒÃÇ¿ÉÒÔ×Ô¼ºÐ´Form.cls¡¢Label.ctl£¬ºÇºÇ£¬ÎÒÃÇ»¹Õæ²»ÄÜÅųýÕâÖÖ¿ÉÄÜÐÔ£¨ËäÈ»ÓÃVB²»¿ÉÄÜÖ±½ÓÉú³Évb6.olb£©¡£Èç¹ûÕæÊÇÕâÑù£¬¿´À´VBС×é×Ô¼º¶¼¶Ô×Ô¼ºµÄ±àÒëÓÅ»¯¼¼Êõ·Ç³£ÓÐÐÅÐÄ¡£
ʵ¼ÊÉÏÎÒÃÇ¿´¿´VB°²×°Ä¿Â¼ÏµÄC2.exeµÄÊôÐÔ£¬ÔÙ¿´¿´VCµÄC2.DLLµÄÊôÐÔ£¬¾Í»á·¢ÏÖËüÃÇÊÇͬһ¸ö¶«Î÷£¬Í¬ÑùLink.exeÒ²ÊÇVCµÄ£¬ËùÒÔÎÒÃÇÍêÈ«¿ÉÒÔ¶ÔVB³ÌÐòµÄºó¶ËÓÅ»¯±àÒëÆ÷ÒÔ¼°Áª½á·ÅÐÄÁË¡£ËüÃǸù±¾¾ÍÊÇVC¿ª·¢Ð¡×é¶«Î÷£¬»òÕßVB¡¢VC¶¼ÊÇͬһ¸ö±àÒëÆ÷¿ª·¢Ð¡×éÔÚ×ö±àÒëÄ£¿é¡£×ÜÖ®£¬ÎÒÃÇ¿ÉÒÔ׳×ŵ¨ËµÎÒÃÇVB×öµÄ³ÌÐòÆä¶þ´ÎÓÅ»¯ºÍÁª½áÓõÄÊǺÍVCÒ»ÑùµÄ¼¼Êõ£¬ºÙºÙ£¬ÄãÓеÄÎÒÒ²ÓУ¬ÎÒÓеÄÄãûÓе썴¿Êô¹î±ç£©¡£
»¹ÓУ¬Ã»ÓÐÈκαàÒëÆ÷±ÈVB±àÒëÆ÷¸ü¿ì£¬ÒòΪÔÚIDEÖÐVB¾ÍÊÇÒ»ÖÖ½âÊÍÐÍÓïÑÔ£¬Õâ²ÅÊÇVB¿ª·¢Ð§ÂʸߵĹؼü£¬¿ìµÃ¼¸ºõ¸Ð¾õ²»µÃ±àÒë¹ý³Ì¡£ÆäÇëÇóʱ±àÒ룬ºǫ́±àÒë¼¼Êõ¸üÊÇÒ»Ö»¶ÀÐ㣬À÷º¦°¡£¡ÏëÏë¿´£¬±ðµÄÓïÑԵijÌÐòÔ±ÓжàÉÙʱ¼ä»¨ÔÚÁ˵ȴý´úÂë±àÒëºÍÖØÐÂÁª½áÉϰ¡£¡
²»Òª¸ßÐ˵ÃÌ«Ô磬ÒòΪ×îÖÕµÄÄ¿µÄ»¹ÊÇÒªÉú³É¿ÉÖ´ÐÐÎļþ¡£ÔÚVBÖÐûÓзֿé±àÒëºÍÔöÁ¿Áª½áµÄ¹¦ÄÜ£¬VBÔÚÉú³É¿ÉÖ´ÐгÌÐòʱ×ÜÊDZàÒëËùÓÐÄ£¿é²¢ÍêÈ«ÖØÐÂÁª½á£¬¶øÔÚ±ðµÄ±àÒëÓïÑÔÖÐÎÒÃÇ¿ÉÒÔ½ö±àÒë×î½üÐ޸ĹýµÄÎļþ£¨·Ö¿é±àÒ룩£¬Áª½áʱ½«ÐÂÉú³ÉµÄ´úÂ븽ÔÚ¿ÉÖ´ÐгÌÐòµÄºóÃæ£¬²¢½«ÔÀ´µÄ´úÂð±ê¼ÇΪ×÷·Ï£¨ÔöÁ¿Áª½á£¬×îÖյĿÉÖ´ÐгÌÐò»áÔ½À´Ô½´ó£¬µ«Áª½áʱ¼ä´ó´óËõ¶Ì£©¡£×öʵÑé¿´¿´£¬»á·¢ÏÖÔÚVBÖÐÿ´ÎÉú³É¿ÉÖ´ÐÐÎļþËù»¨Ê±¼ä¶¼ÊÇÏàͬµÄ¡£ÎÒ²»ÖªVB¿ª·¢Ð¡×éΪʲô²»Ìṩ·Ö¿é±àÒëºÍÔöÁ¿Áª½áµÄ¹¦ÄÜ£¬¿ÉÄÜVB¿ª·¢Ð¡×éÈÏΪÉú³É¿ÉÖ´ÐÐÎļþÔÚVBÖв»ÊǾ³£Òª×öµÄ¹¤×÷¡£µ«ÊÇʵ¼ÊÉÏÕâÖÖÀíÓÉÊÇ˵²»¹ýÈ¥µÄ£¬ÒòΪÈçÇ°ÃæËù˵IDEÖÐÔËÐгÌÐòºÍ×îÖÕ³ÌÐòÓкܴó²»Í¬£¬ÈçÎÒÃÇÒª¾³£±àÒë³ö¿ÉÖ´ÐÐÎļþ²ÅÄÜÕæÕý¶ÔËü½øÐÐProfile£¬ÓÖÈçÎÒÃÇÒªµ÷ÊÔ¶àÏ̳߳ÌÐò²»ÄÜÔÚVB IDEÖÐ×ö£¬ÔÚÕâЩÇé¿öÏÂÿ´ÎÐ޸ĺó¶¼ÒªÖØÐÂÉú³É¿ÉÖ´ÐÐÎļþ£¬ÎÒÃÇÀË·ÑÁ˲»ÉÙʱ¼äÈ¥±àÒëÒѱàÒë¹ýµÄ´úÂ룬Áª½áÒÑÁª½á¹ýµÄ³ÌÐò¡£ÎÒ²ÂÏëÕâÊÇÒòΪVBÉú³É¿ÉÖ´ÐгÌÐòʱ½øÐÐÁËÈ«¾ÖÓÅ»¯£¬ËùÒÔ±ØÐëµÃÈ«²¿ÖØÐ±àÒëÁª½á¡£µ«Ìṩһ¸öÐµĹ¦ÄÜÈÃÎÒÃÇÄܹ»Éú³É²»½øÐÐÈ«¾ÖÓÅ»¯µÄ¿ÉÒÔ·Ö¿é±àÒëµÄµ÷ÊÔ°æ±¾£¬¶ÔVb¿ª·¢Ð¡×éÓ¦¸Ã²»ÊÇÄÑʰɣ¡£¨ÎÒÓÐÒ»¸ö±äͨµÄ½â¾ö·½°¸£¬»¹ÔÚÊÔÑéÖУ©
ÔÚÀ´¿´¿´VB6°²×°Ä¿Â¼ÏµÄVBAEXE6.lib£¬ÔõôֻÓÐ1k´óÒ»µã£¬¿ÉÒÔ²ÂÏëÀïÃæÓ¦¸Ã²»»áÓдúÂ룬¶à°ëÊÇЩÏóvTableÕâÑùµÄº¯ÊýµØÖ·Ìø×ª±í£¬»òÕßÊÇЩȫ¾Ö³£Á¿£¬ÎÒÒ²²»ÖªµÀ¡£µ«ÖÁÉÙ˵Ã÷VB¿ÉÒÔÓþ²Ì¬Áª½á¿âÁË£¬ÎªÊ²Ã´²»°ÑÕâ¸ö¹¦ÄÜÌṩ¸øÎÒÃÇ£¬ÈÃÎÒÃÇÓиü¶àµÄÑ¡Ôñ¡£
ÔÙ×ö¸öʵÑé¿´¿´£¬×öÒ»¸ö±ê×¼EXE¹¤³Ì£¬ÀïÃæÖ»ÓÐÒ»¸ö±ê׼ģ¿é£¬Ä£¿éÀïÃæÖ»Ò»¸öSub Main£¬Sub MainÀïÃæÊ²Ã´Ò²Ã»ÓУ¬½«ËüÉú³ÉΪEXEÎļþ¡£¿´¿´£¬à룬ÓÐ16k¶à¡£ÄãÒªÊÇÓÐʱ¼ä¸ú×ÙÕâ¸öʲôҲ²»×öµÄ³ÌÐò¿´¿´£¬¾Í»áÖªµÀËüÒª×öºÜ¶àÊ£¬³õʼ»¯ErrºÍApp¶ÔÏó£¬×¼±¸COMµ÷Óã¬×¼±¸VB¡¢VBA¶ÔÏó¿â£¬ÉõÖÁΪʹÓÃActiveX¿ØÖÆÒ²×öÁË×¼±¸£¬ºÙºÙ£¬¿´·þ
9
Îñ¶àÖܵ½¡£Äã±ØÐëµÃÓÃVB¶ÔÏó¿âÖеĿØÖÆ£¬²»ÓÃÒ²²»ÐС£ÄãÔÙ¶àÕÒ¼¸¸öEXE¹¤³Ì¿´¿´£¬ÓкܶණÎ÷Ïàͬ£¬¶¼ÊÇÒ»¸öÄ£×Ó×ö³öµÄ£¬¶øÇÒÄãûÓÐÑ¡ÔñÄ£×Ó×ÔÓÉ¡£ActiveX¹¤³ÌÒ²ÊÇÒ»Ñù£¬¶¼ÊÇDualË«½Ó¿Ú£¬Äã×öµÄActiveX¿ØÖƶ¼±ØÐëÒª¶ãÔÚÒ»¸öExtender ObjectºóÃæ¡£Êǵģ¬ÔÚVBÀïÓкܶණÎ÷ÄãûÓÐÑ¡ÔñµÄ×ÔÓÉ¡£Èç¹ûÐèÒªÕâÖÖ×ÔÓÉҪô²»ÓÃVB£¬ÒªÃ´¾ÍµÃ²ÉȡһЩδ¹«¿ªµÄ·Ç¹Ù·½µÄ¹Å¹ÖµÄ¼¼ÇÉ£¨±¾ÏµÁÐÎÄÕÂ×îÖØÒªµÄÄ¿µÄÖ®Ò»£¬¾ÍÊǽéÉÜÕâÑùµÄ·Ç¹Ù·½¼¼ÇÉ£©¡£
ÕâÓÖµ½ÎÄÕ¿ªÍ·ËµµÄ£¬VBÈÃÎÒÃÇ×öÊÂÇé±äµÃÈÝÒ×µÄͬʱҲÈÃÎÒÃÇʧȥÁ˲»ÉÙ×ÔÓÉ¡£ÔÚ×îÖÕ´úÂëµÄÉú³ÉÉÏÔòÒ²²ÉÈ¡Á˹«Ê½»¯µÄ×ö·¨¡£µ±È»£¬ÎÒÃÇÓ¦¸ÃÈ«ÃæµØÀ´¿´´ýÕâ¸öÎÊÌ⣬ÈçͬÉú²úÏßÉÏÉú²úµÄ¶«Î÷²»Ò»¶¨±ÈÊÖ¹¤µÄ¾«Ö£¬ÈºÑøµÄ¼ÒÇݲ»ÈçҰζºÃ³ÔµÄµÀÀíÒ»Ñù£¬Èç¹ûÐèÒª¾«ÖµÄҰ棬Òâζןü¶àµÄÀͶ¯ºÍ¸ü´óµÄ³É±¾£¬ÕâºÍVBËù×·ÇóµÄ¸üÈÝÒ׸ü±ãÒ˵ÄÄ¿±êÊÇÏàÎ¥±³µÄ¡£
4)VB³ÌÐòÔ±Ò²µÃÓÐHACK¾«Éñ¡£
±¾ÎĵÄ×îºóÕâ¸ö±êÌâÊÇÑÏÖØÀëÌâÁË£¬µ«ÎÒÏëÔÚ´ËΪ±¾ÏµÁÐÎÄÕ¶¨ÏÂÒ»¸ö³äÂúHACK¾«ÉñµÄ»ùµ÷¡£HACK¾«ÉñÊÇʲô£¿Ã»ÓÐ׼ȷµÄ¶¨Ò壬ÎÒµÄÀí½âÊÇ£ºHACK¾«Éñ = ×ÜÏë̽Ѱδ֪ÁìÓòµÄºÃÆæÐÄ + ·²ÊÂ×ÜÏëÖªµÀΪʲôµÄÑо¿Óû + ×ÜÏëÄóö×Ô¼ºµÄ¶«Î÷µÄ´´Ð¾«Éñ + ½â¾öÎÊÌâµÄÄÍÐĺͺãÐÄ¡£ VBµÄ³ÌÐòÔ±Ò²Ò»ÑùÐèÒªÕâÖÖ¾«Éñ¡£
×îºó£¬ÎÒÃǶ¼ÖªµÀVB¿ª·¢Ð¡×éÒѾ´ïÉÏ.NETµÄ¿ì³µ·ÉÆðÀ´ÁË£¬²»Äܲ»ËµVB6ÒÔºóÔÙûÓÐVBµÄа汾ÁË¡£Î¢ÈíÒѾÓÃ.NETΪÎÒÃÇ»®³öÁËеÄȦ×Ó£¬VB.NETÊÇÕâ¸öÐÂȦ×ÓÀïµÄвúÎï¡£ÔÚȦ×ÓÀïÃæÎÒÃÇÄܹ»·ÉµÃ¸ü¸ß£¬µ«ÊÇȦ×ÓÍâÃæµÄÌì¿Õ¸ü´ó£¬ËùÒÔÎÒÒÀÈ»ÀÖÒâÕ¾ÔÚȦ×ÓÍ⣬ò¯³ÏµØÆíµ»ÕæÕýµÄVB7µÄµ®Éú£¬°¢ÃÅ¡£
10
ÿ´Î¿´´óʦµÄ¶«Î÷µ½Á˾«²ÊÖ®´¦£¬ÎҾͻáÅݸ½Ð¾ø£º\ÍÛàç£¬ÕæÊÇÏë²»µ½£¡\¡£ÔÚ¾¹ýºÜ¶à´ÎÕâÖָп®Ö®ºó£¬ÎÒ·¢ÏÖÖ»ÒªÎÒÃǶ¯ÁËÄԽÎÒÃÇ×Ô¼ºÒ²ÄÜÓÐÈñðÈËÏë²»µ½µÄ¶«Î÷¡£ÓÚÊÇÏëµ½Òª°ÑÕâЩÏë²»µ½µÄ¶«ÄóöÀ´ºÍ´ó¼ÒÒ»Æð·ÖÏí£¬Ï£ÍûÅ×שÒýÓñ£¬ÄÜÒý³ö¸ü¶àÈÃÈËÏë²»µ½µÄ¶«Î÷¡£
VBÕæÊÇÏë²»µ½ÏµÁÐÖ®¶þ£ºVB¡¶¿û»¨±¦µä¡·--Ö¸Õë¼¼Êõ ¹Ø¼ü×Ö£ºVB¡¢Ö¸Õë¡¢¶¯Ì¬ÄÚ´æ·ÖÅ䡢ЧÂÊ¡¢°²È« ÄѶȣºÖм¶ÖÁ¸ß¼¶
ÒªÇó£ºÊìϤVB£¬ÕÆÎÕ»ù±¾µÄC£¬Á˽â»ã±à£¬Á˽âÄÚ´æ·ÖÅäÔÀí¡£
Ïëµ±Äê¶«·½²»°Ü£¬ºÚľÑÂÃÜÊÒÒ»Õ½£¬½öƾһ¸ùÐ廨Õë¶ÀÕ½ËÄ´ó¸ßÊÖ£¬Éñ³ö¹íû£¬¿°³ÆÌìÏÂÎäÁÖµÚÒ»¸ßÊÖ¡£ÈôÏë³ÉΪVBÀïµÄ¶«·½²»°Ü£¬ÊìϰVB¡¶¿û»¨±¦µä¡·£¬ÕÆÎÕVBÖ¸Õë¼¼Êõ£¬ÄËÊDz»¶þµÄ·¨ÃÅ¡£
ÓûÁ·Éñ¹¦£¬Òýµ¶??£¬ÆäÊµÕÆÎÕVBÖ¸Õë¼¼Êõ£¬²¢²»ÐèÒªÄÇôʹ¿à¡£ÒòΪ˵´©ÁË£¬Ò²¾ÍÄÇô¼¸ÕУ¬ÔÙÇÚ¼ÓÁ·Ï°£¬ÖÕ¿ÉÖÁÉñ³ö¹íû֮¾³¡£·Ï»°ÉÙ˵£¬ÈÃÎÒÃÇÏÈ´ÓÖ¸ÕëµÄ¶¨Òå˵Æð¡£
Ò»¡¢Ö¸ÕëÊÇʲô£¿
²»ÐèҪȥÕÒʲô±ê×¼µÄ¶¨Ò壬Ëü¾ÍÊÇÒ»¸ö32λÕûÊý£¬ÔÚCÓïÑÔºÍÔÚVBÀï¶¼¿ÉÒÔÓÃLongÀàÐÍÀ´±íʾ¡£ÔÚ32λWindowsƽ̨ÏÂËüºÍÆÕͨµÄ32볤ÕûÐÍÊýûÓÐʲô²»Í¬£¬Ö»²»¹ýËüµÄÖµÊÇÒ»¸öÄÚ´æµØÖ·£¬ÕýÊÇÒòΪÕâ¸öÕûÊýÏóÕëÒ»ÑùÖ¸ÏòÒ»¸öÄÚ´æµØÖ·£¬ËùÒÔ¾ÍÓÐÁËÖ¸ÕëµÄ¸ÅÄî¡£
ÓÐͳ¼Æ±íÃ÷£¬ºÜ´óÒ»²¿·Ö³ÌÐòȱÏݺÍÄÚ´æµÄ´íÎó·ÃÎÊÓйء£ÕýÊÇÒòΪָÕëÖ±½ÓºÍÄÚ´æ´ò½»µÀ£¬ËùÒÔÖ¸ÕëÒ»Ö±ÒÔÀ´±»¿´³ÉÒ»¸öΣÏյĶ«Î÷¡£ÒÔÖÁÓÚ²»ÉÙÓïÑÔ£¬ÈçÖøÃûµÄJAVA£¬¶¼²»Ìṩ¶ÔÖ¸Õë²Ù×÷µÄÖ§³Ö£¬ËùÓеÄÄÚ´æ·ÃÎÊ·½ÃæµÄ´¦Àí¶¼ÓɱàÒëÆ÷À´Íê³É¡£¶øÏóCºÍC++£¬Ö¸ÕëµÄʹÓÃÔòÊÇ»ù±¾¹¦£¬Ö¸Õë¸øÁ˳ÌÐòÔ±¼«´óµÄ×ÔÓÉÈ¥ËæÐÄËùÓûµØ´¦ÀíÄÚ´æ·ÃÎÊ£¬ºÜ¶à·Ç³£ÇÉÃîµÄ¶«Î÷¶¼ÒªÒÀ¿¿Ö¸Õë¼¼ÊõÀ´Íê³É¡£
¹ØÓÚһß߼¶µÄ³ÌÐòÉè¼ÆÓïÑÔÊDz»ÊÇÓ¦¸ÃÈ¡ÏûÖ¸Õë²Ù×÷£¬¹ØÓÚûÓÐÖ¸Õë²Ù×÷Ëã²»ËãÒ»ÃÅÓïÑÔµÄÓŵ㣬ÎÒÔÚÕâÀï²»ÌÖÂÛ£¬ÒòΪ»¥ÁªÍøÉϹØÓÚÕâ·½ÃæµÄûÓнá¹ûµÄÌÖÂÛ£¬ÒѾÔì³ÉÁËÕ¼Óü¸¸öGBµÄ×ÊÔ´¡£ÎÞÂÛ×îÖÕÄãÊDz»ÊÇҪ϶¨¾öÐÄÐÞϰָÕë¼¼Êõ¡¶¿û»¨±¦µä¡·£¬Á˽âÕâÃŹ¦·ò×ÜÊÇÓÐÒæ´¦µÄ¡£
×¢Ò⣺ÔÚVBÀ¹Ù·½ÊDz»¹ÄÀøÊ¹ÓÃʲôָÕëµÄ£¬±¾ÎÄËù½²µÄÈκζ«Î÷Äã¶¼±ðÖ¸ÍûÈ¡µÃ¹Ù·½µÄ¼¼ÊõÖ§³Ö£¬Ò»Çж¼Òª¿¿ÎÒÃÇ×Ô¼ºµÄŬÁ¦£¬Ò»Çж¼¸ü´Ì¼¤£¡ ÈÃÎÒÃÇ¿ªÊ¼ÉñÆæµÄVBÖ¸Õë̽ÏÕ°É£¡
¶þ¡¢À´¿´¿´Ö¸ÕëÄÜ×öʲô£¿ÓÐʲôÓã¿
ÏÈÀ´¿´Á½¸ö³ÌÐò£¬³ÌÐòµÄ¹¦Äܶ¼Êǽ»»»Á½¸ö×Ö´®£º ¡¾³ÌÐòÒ»¡¿£º'±ê×¼µÄ×ö·¨SwapStr
Sub SwapStr(sA As String, sB As String) Dim sTmp As String
sTmp = sA: sA = sB: sB = sTmp End Sub
¡¾³ÌÐò¶þ¡¿£º'ÓÃÖ¸ÕëµÄ×ö·¨SwapPtr
Private Declare Sub CopyMemory Lib \Alias \_ (Destination As Any, Source As Any, ByVal Length As Long)
11
Sub SwapPtr(sA As String, sB As String) Dim lTmp As Long
CopyMemory lTmp, ByVal VarPtr(sA), 4
CopyMemory ByVal VarPtr(sA), ByVal VarPtr(sB), 4 CopyMemory ByVal VarPtr(sB), lTmp, 4 End Sub
ÄãÊDz»ÊÇÒÔΪµÚÒ»¸ö³ÌÐòÒª¿ì£¬ÒòΪËü¿´×żòµ¥¶øÇÒ²»Óõ÷ÓÃAPI£¨µ÷ÓÃAPIÐèÒª¶îÍâµÄ´¦Àí£¬VBÎĵµÃ÷È·Ö¸³ö´óÁ¿µ÷ÓÃAPI½«½µµÍ³ÌÐòÐÔÄÜ£©¡£µ«ÊÂʵÉÏ£¬ÔÚVB¼¯³É»·¾³ÖÐÔËÐУ¬³ÌÐò¶þÒª±È³ÌÐòÒ»¿ìËÄ·ÖÖ®Ò»£»¶ø±àÒë³É±¾»ú´úÂë»òp-code£¬³ÌÐò¶þ»ù±¾ÉÏÒª±È³ÌÐòÒ»¿ìÒ»±¶¡£ÏÂÃæÊÇÁ½¸öº¯ÊýÔÚ±àÒë³É±¾»ú´úÂëºó£¬ÔËÐв»Í¬´ÎÊýËù»¨Ê±¼äµÄ±È½Ï£º ÔËÐÐ100000´Î£¬SwapStrÐèÒª170ºÁÃ룬SwapPtrÐèÒª90ºÁÃë¡£ ÔËÐÐ200000´Î£¬SwapStrÐèÒª340ºÁÃ룬SwapPtrÐèÒª170ºÁÃë¡£ ÔËÐÐ2000000´Î£¬SwapStrÐèÒª3300ºÁÃ룬SwapPtrÐèÒª1500ºÁÃë¡£
µÄÈ·£¬µ÷ÓÃAPIÊÇÐèÒª¶îÍâÖ¸ÁîÀ´´¦Àí£¬µ«ÊÇÓÉÓÚʹÓÃÁËÖ¸Õë¼¼Êõ£¬ËüûÓнøÐÐÁÙʱ×Ö´®µÄ·ÖÅäºÍ¿½±´£¬Òò´ËËÙ¶ÈÌá¸ßÁ˲»ÉÙ¡£
ÔõôÑù£¬Ïë²»µ½°É£¡C/C++³ÌÐòÔ±ÄÇôÒÀÀµÖ¸Õ룬ÎÞ·ÇÒ²ÊÇÒòΪʹÓÃÖ¸ÕëÍùÍùÄܸüÖ±½ÓµÄÈ¥´¦ÀíÎÊÌâµÄ¸ùÔ´£¬¸üÓмÝÔ¦Ò»ÇеĿì¸Ð¡£ËûÃDz»ÊDz»ÖªµÀʹÓÃÖ¸ÕëµÄΣÏÕ£¬ËûÃDz»ÊDz»Ô¸Ò⿪ÎÀÐǶ¨Î»ÎÞ¼¶±äËÙµÄÆû³µ£¬Ö»ÊÇÆïĦÍиüÓпì¸Ð£¬¶øÓÐЩµØ·½Ö»ÓÐĦÍвÅ×ߵùýÈ¥¡£ ºÍÔÚCÀïÀàËÆ£¬ÔÚVBÀïÎÒÃÇʹÓÃÖ¸ÕëÒ²²»¹ýÈý¸öÀíÓÉ£º Ò»ÊÇЧÂÊ£¬ÕâÊÇÒ»ÖÖ̬¶ÈÒ»ÖÖ×·Çó£¬ÔÚVBÀïÒ²Ò»Ñù£»
¶þÊDz»Äܲ»Óã¬ÒòΪ²Ù×÷ϵͳÊÇCдµÄ£¬Ëüʱ¿Ì¶¼ÔÚÌáÐÑÎÒÃÇËüÐèÒªÖ¸Õ룻
ÈýÊÇÍ»ÆÆÏÞÖÆ£¬VBÏëÕÕÁÏÎÒÃǵÄÒ»ÇУ¬VB¸øÁËÎÒÃǺÜÇ¿µÄÀàÐͼì²é£¬VBÏóÎÒÃÇÀÏÂèÒ»Ñù£¬¶ÔÎÒÃǹØÐĵ½ÓÐʱÎÒÃÇ»áÊܲ»ÁË£¬Ïëż¶û²»ÌýÂèÂèµÄ»°Âð£¿ÄãÐèÒªÖ¸Õ룡
µ«ÓÉÓÚȱÉٹٷ½µÄ¼¼ÊõÖ§³Ö£¬ÔÚVBÀָÕë±äµÃºÜÉñÃØ¡£Òò´ËÔÚCÀïһЩ»ù±¾µÄ¼¼Êõ£¬ÔÚVBÀï¾Í±äµÃ±È½ÏÀ§ÄÑ¡£±¾ÎĵÄÄ¿µÄ¾ÍÊÇÒªÌṩ¸ø´ó¼ÒÒ»ÖÖ¼òµ¥µÄ·½·¨£¬À´½«C´¦ÀíÖ¸ÕëµÄ¼¼ÊõÄõ½VBÀïÀ´£¬²¢¸æËßÄãʲôÊÇ¿ÉÐеģ¬Ê²Ã´¿ÉÐе«±ØÐëҪСÐĵģ¬Ê²Ã´ÊÇ¿ÉÄܵ«²»¿ÉÐеģ¬Ê²Ã´ÊǸù±¾¾Í²»¿ÉÄܵġ£
Èý¡¢ ³ÌÒ§½ðµÄÈý°å¸«
Êǵ쬳ÌÐò¶þ»ù±¾ÉϾÍÒѾÈÃÎÒÃÇ¿´µ½VBÖ¸Õë¼¼ÊõµÄÄ£ÑùÁË¡£×ܽáһϣ¬ÔÚVBÀïÓÃÖ¸Õë¼¼ÊõÎÒÃÇÐèÒªÕÆÎÕÈýÑù¶«Î÷£ºCopyMemory£¬VarPtr/StrPtr/ObjPtr, AdressOf. Èý°Ñ¸«Í·£¬³ÌÒ§½ðµÄÈý°å¸«£¬ÔÚVBÀïHackµÄ¹¤¾ß¡£ 1¡¢CopyMemory
¹ØÓÚCopyMemoryºÍBruce McKinney´óʦµÄ´«Ææ£¬MSDNµÄKnowledge BaseÖоÍÓÐÎÄÕ½éÉÜ£¬Äã¿ÉÒÔËÑË÷\µÄÎÄÕ¡£ÕýÊÇÕâλ´óʦ¸ø32λµÄVB´øÀ´ÁËÕâ¸ö¿ÉÒÔÒÆ¶¯ÄÚ´æµÄAPI£¬Ò²ÕýÊÇÓÐÁËÕâ¸öAPI£¬ÎÒÃDzÅÄÜÀûÓÃÖ¸ÕëÍê³ÉÎÒÃÇÔÀ´Ïë¶¼²»¸ÒÏëµÄһЩ¹¤×÷£¬¸ÐлBruce McKinneyΪÎÒÃÇ´øÀ´ÁËVBµÄÖ¸Õë¸ïÃü¡£
ÈçCopyMemoryµÄÉùÃ÷£¬ËüÊǶ¨ÒåÔÚKernel32.dllÖеÄRtlMoveMemoryÕâ¸öAPI£¬32λCº¯Êý¿âÖеÄmemcpy¾ÍÊÇÕâ¸öAPIµÄ°ü×°£¬ÈçMSDNÎĵµÖÐËùÑÔ£¬ËüµÄ¹¦ÄÜÊǽ«´ÓSourceÖ¸ÕëËùÖ¸´¦¿ªÊ¼µÄ³¤¶ÈΪLengthµÄÄڴ濽±´µ½DestinationËùÖ¸µÄÄÚ´æ´¦¡£Ëü²»»á¹ÜÎÒÃǵijÌÐòÓÐûÓжÁд¸ÃÄÚ´æËùÓ¦ÓеÄȨÏÞ£¬Ò»µ«ËüÏë¶Áд±»ÏµÍ³Ëù±£»¤µÄÄÚ´æÊ±£¬ÎÒÃǾͻáµÃµ½ÖøÃûµÄAccess Violation Fault(ÄÚ´æÔ½È¨·ÃÎÊ´íÎó)£¬ÉõÖÁ»áÒýÆð¸üÖøÃûµÄgeneral protection
12
(GP) fault£¨Í¨Óñ£»¤´íÎó£© ¡£ËùÒÔ£¬ÔÚ½øÐб¾ÏµÁÐÎÄÕÂÀïµÄʵÑéʱ£¬Çë×¢ÒâËæÊ±±£´æÄãµÄ³ÌÐòÎļþ£¬ÔÚVB¼¯³É»·¾³Öн«\¹¤¾ß\Ñ¡Ïî\ÖеÄ\»·¾³\Ñ¡ÏÀïµÄ\Æô¶¯³ÌÐòʱ\ÉèΪ\±£´æ¸Ä±ä\£¬²¢¼ÇסÔÚ\Á¢¼´\´°¿ÚÖÐÖ´ÐÐΣÏÕ´úÂë֮ǰһ¶¨Òª±£´æÎÒÃǵŤ×÷³É¹û¡£
2¡¢VatPtr/StrPtr/ObjPtr
ËüÃÇÊÇVBÌṩ¸øÎÒÃǵĺñ¦±´£¬ËüÃÇÊÇVBAº¯Êý¿âÖеÄÒþ²Øº¯Êý¡£ÎªÊ²Ã´ÒªÒþ²Ø£¿ÒòΪVB¿ª·¢Ð¡×飬²»¹ÄÀøÎÒÃÇÓÃÖ¸ÕëÂï¡£
ʵ¼ÊÉÏÕâÈý¸öº¯ÊýÔÚVBÔËÐÐʱ¿âMSVBVM60.DLL£¨»òMSVBVM50.DLL£©ÖÐÊÇͬһ¸öº¯ÊýVarPtr£¨¿É²Î¼ûÎÒÔÚ±¾ÏµÁеÚһƪÎÄÕÂÀï½éÉܵķ½·¨£©¡£ Æä¿âÐͿⶨÒåÈçÏ£º
[entry(\
long _stdcall VarPtr([in] void* Ptr); [entry(\
long _stdcall StrPtr([in] BSTR Ptr); [entry(\
long _stdcall ObjPtr([in] IUnknown* Ptr); ¼´È»ËüÃÇÊÇVBÔËÐÐʱ¿âÖеÄͬһ¸öº¯Êý£¬ÎÒÃÇÒ²¿ÉÒÔÔÚVBÀïÓÃAPI·½Ê½ÖØÐÂÉùÃ÷Õ⼸¸öº¯Êý£¬ÈçÏ£º
Private Declare Function ObjPtr Lib \ (var As Object) As Long
Private Declare Function VarPtr Lib \ _ (var As Any) As Long
£¨Ã»ÓÐStrPtr£¬ÊÇÒòΪVB¶Ô×Ö·û´®´¦Àí·½Ê½Óе㲻ͬ£¬Õâ·½ÃæµÄÎÊÌâÌ«¶à£¬ÔÚ±¾ÏµÁÐÖÐÁíÓÃһƪ¡¶VB×Ö·û´®È«¹¥ÂÔ¡·À´Ïê̸¡£
˳±ãÌáһϣ¬Ìý˵VB.NETÀïûÓÐÕ⼸¸öº¯Êý£¬µ«Ö»Òª»¹Äܵ÷ÓÃAPI£¬ÎÒÃǾͿÉÒÔÊÔÊÔÉÏÃæµÄ¼¸¸öÉùÃ÷£¬ÕâÑùÔÚVB.NETÀïÎÒÃÇÒ»Ñù¿ÉÒÔ½øÐÐÖ¸Õë²Ù×÷¡£
µ«ÊÇÇë×¢Ò⣬Èç¹ûͨ¹ýAPIµ÷ÓÃÀ´Ê¹ÓÃVarPtr£¬Õû¸ö³ÌÐò¶þSwapPtr½«±ÈÔÀ´Ê¹ÓÃÄÚÖÃVarPtrº¯ÊýʱÂý6±¶¡££©
Èç¹ûÄãϲ»¶ÅÙ¸ùÎʵף¬ÄÇôÏÂÃæ¾ÍÊÇVarPtrº¯ÊýÔÚCºÍ»ã±àÓïÑÔÀïµÄÑù×Ó£º ÔÚCÀïÑù×ÓÊÇÕâÑùµÄ£º long VarPtr(void* pv){ return (long)pv; }
Ëù¶Ô¾ÍµÄ»ã±à´úÂë¾ÍÁ½ÐУº
mov eax,dword ptr [esp+4]
ret 4 'µ¯³öÕ»Àï²ÎÊýµÄÖµ²¢·µ»Ø¡£
Ö®ËùÒÔÈôó¼ÒÁ˽âVarPtrµÄ¾ßÌåʵÏÖ£¬ÊÇÏë¸æËß´ó¼ÒËüµÄ¿ªÏú²¢²»´ó£¬ÒòΪËüÃDz»¹ýÁ½ÌõÖ¸Á¼´Ê¹¼ÓÉϲÎÊý¸³Öµ¡¢Ñ¹Õ»ºÍµ÷ÓÃÖ¸ÁÕû¸ö»ñȡָÕëµÄ¹ý³ÌÒ²¾ÍÁùÌõÖ¸Áî¡£µ±È»£¬Í¬ÑùµÄ¹¦ÄÜÔÚCÓïÑÔÀÓÉÓÚÓïÑÔµÄÖ±½ÓÖ§³Ö£¬½öÐèÒªÒ»ÌõÖ¸Áî¼´¿É¡£µ«ÔÚVBÀËüÒѾËãÊÇ×î¿ìµÄº¯ÊýÁË£¬ËùÒÔÎÒÃÇÍêÈ«²»Óõ£ÐÄʹÓÃVarPtr»áÈÃÎÒÃÇʧȥЧÂÊ£¡ËÙ¶ÈÊÇʹÓÃÖ¸Õë¼¼ÊõµÄ¸ù±¾ÒªÇó¡£
Ò»¾ä»°£¬VarPtr·µ»ØµÄÊDZäÁ¿ËùÔÚ´¦µÄÄÚ´æµØÖ·£¬Ò²¿ÉÒÔ˵·µ»ØÁËÖ¸Ïò±äÁ¿ÄÚ´æÎ»ÖõÄÖ¸Õ룬ËüÊÇÎÒÃÇÔÚVBÀï´¦ÀíÖ¸Õë×îÖØÒªµÄÎäÆ÷Ö®Ò»¡£
13
3¡¢ByValºÍByRef
ByVal´«µÝµÄ²ÎÊýÖµ£¬¶øByRef´«µÝµÄ²ÎÊýµÄµØÖ·¡£ÔÚÕâÀÎÒÃDz»ÓÃÈ¥Çø±ð´«Ö¸Õë/´«µØÖ·/´«ÒýÓõIJ»Í¬£¬ÔÚVBÀËüÃǸù±¾¾ÍÊÇÒ»¸ö¶«Î÷µÄÈýÖÖ²»Í¬Ëµ·¨£¬¼´Ê¹VBµÄÎĵµÀïÒ²Óеط½ÔÚ»ìÓÃÕâЩÊõÓµ«ÔÚC++ÀïµÄÈ·ÒªÇø·ÖÖ¸ÕëºÍÒýÓã© ³õ´Î½Ó´¥ÉÏÃæµÄ³ÌÐò¶þSwapPtrµÄÅóÓÑ£¬Ò»¶¨Òª¸ãÇåÔÚÀïÃæµÄCopyMemoryµ÷ÓÃÖУ¬ÔÚʲôµØ·½Òª¼ÓByVal£¬Ê²Ã´µØ·½²»¼Ó£¨²»¼ÓByVal¾ÍÊÇʹÓÃVBȱʡµÄByRef£© ׼ȷµÄÀí½â´«ÖµºÍ´«µØÖ·£¨Ö¸Õ룩µÄÇø±ð£¬ÊÇÔÚVBÀïÕýȷʹÓÃÖ¸ÕëµÄ»ù´¡¡£ ÏÖÔÚÒ»¸ö×î¼òµ¥µÄʵÑéÀ´¿´Õâ¸öÎÊÌ⣬ÈçÏÂÃæµÄ³ÌÐòÈý£º ¡¾³ÌÐòÈý¡¿£º'Ìå»áByValºÍByRef Sub TestCopyMemory() Dim k As Long k = 5
Note: CopyMemory ByVal VarPtr(k), 40000, 4 Debug.Print k End Sub
ÉÏÃæ±êºÅNote´¦µÄÓï¾äµÄÄ¿µÄ£¬Êǽ«k¸³ÖµÎª40000£¬µÈͬÓÚÓï¾äk=40000£¬Äã¿ÉÒÔÔÚ\Á¢¼´\´°¿ÚÊÔÑéһϣ¬»á·¢ÏÖkµÄÖµµÄÈ·³ÉÁË40000¡£ ʵ¼ÊÉÏÉÏÃæÕâ¸öÓï¾ä£¬·Òë³É°×»°£¬¾ÍÊÇ´Ó±£´æ³£Êý40000µÄÁÙʱ±äÁ¿´¦¿½±´4¸ö×Ö½Úµ½±äÁ¿kËùÔÚµÄÄÚ´æÖС£
ÏÖÔÚÎÒÃÇÀ´¸Ä±äÒ»¸öNote´¦µÄÓï¾ä£¬Èô¸Ä³ÉÏÂÃæµÄÓï¾ä£º Note2: CopyMemory ByVal VarPtr(k), ByVal 40000, 4
Õâ¾ä»°µÄÒâ˼¾Í³ÉÁË£¬´ÓµØÖ·40000¿½±´4¸ö×Ö½Úµ½±äÁ¿kËùÔÚµÄÄÚ´æÖС£ÓÉÓÚµØÖ·40000ËùÔÚµÄÄÚ´æÎÒÃÇÎÞȨ·ÃÎÊ£¬²Ù×÷ϵͳ»á¸øÎÒÃÇÒ»¸öAccess ViolationÄÚ´æÔ½È¨·ÃÎÊ´íÎ󣬸æËßÎÒÃÇ\ÊÔͼ¶ÁȡλÖÃ0x00009c40´¦ÄÚ´æÊ±³ö´í£¬¸ÃÄÚ´æ²»ÄÜΪ'Read'\¡£ ÎÒÃÇÔٸijÉÈçϵÄÓï¾ä¿´¿´¡£
Note3: CopyMemory VarPtr(k), 40000, 4
Õâ¾ä»°µÄÒâ˼¾Í³ÉÁË£¬´Ó±£´æ³£Êý40000µÄÁÙʱ±äÁ¿´¦¿½±´4¸ö×Ö½Úµ½µ½±£´æ±äÁ¿kËùÔÚÄÚ´æµØÖ·ÖµµÄÁÙʱ±äÁ¿´¦¡£Õâ²»»á³ö³öÄÚ´æÔ½È¨·ÃÎÊ´íÎ󣬵«kµÄÖµ²¢Ã»Óб䡣 ÎÒÃÇ¿ÉÒ԰ѳÌÐò¸Ä¸ÄÒÔ¸üÇå³þµÄÐÝÏÖÕâÖÖÇø±ð£¬ÈçÏÂÃæµÄ³ÌÐòËÄ£º ¡¾³ÌÐòËÄ¡¿£º'¿´¿´ÎÒÃǵĶ«Î÷±»¿½±´µ½ÄĶùÈ¥ÁË Sub TestCopyMemory()
Dim i As Long, k As Long k = 5
i = VarPtr(k)
NOTE4: CopyMemory i, 40000, 4 Debug.Print k Debug.Print i i = VarPtr(k)
NOTE5: CopyMemory ByVal i, 40000, 4 Debug.Print k End Sub
³ÌÐòÊä³ö£º 5
14
40000 40000
ÓÉÓÚNOTE4´¦Ê¹ÓÃȱʡµÄByVal£¬´«µÝµÄÊÇiµÄµØÖ·£¨Ò²¾ÍÊÇÖ¸ÏòiµÄÖ¸Õ룩£¬ËùÒÔ³£Á¿40000¿½±´µ½Á˱äÁ¿iÀÒò´ËiµÄÖµ³ÉÁË40000£¬¶økµÄֵȴûÓб仯¡£µ«ÊÇ£¬ÔÚNOTE4ǰÓУºi=VarPtr(k)£¬±¾ÒâÊÇÒª°Ñi±¾Éí×öΪһ¸öÖ¸ÕëÀ´Ê¹Óá£Õâʱ£¬ÎÒÃDZØÐëÈçNOTE5ÄÇÑùÓÃByValÀ´´«µÝÖ¸Õëi£¬ÓÉÓÚiÊÇÖ¸Ïò±äÁ¿kµÄÖ¸Õ룬ËùÒÔ×îºó³£Á¿40000±»¿½±´Á˱äÁ¿kÀï¡£
Ï£ÍûÄãÒѾÀí½âÁËÕâÖÖÇø±ð£¬ÔÚºóÃæÎÊÌâµÄÌÖÂÛÖУ¬ÎÒ»¹»áÔÙ̸µ½Ëü¡£
4¡¢AddressOf
ËüÓÃÀ´µÃµ½Ò»¸öÖ¸ÏòVBº¯ÊýÈë¿ÚµØÖ·µÄÖ¸Õ룬²»¹ýÕâ¸öÖ¸ÕëÖ»ÄÜ´«µÝ¸øAPIʹÓã¬ÒÔʹµÃAPIÄܻص÷VBº¯Êý¡£
±¾ÎIJ»×¼±¸ÏêϸÌÖÂÛº¯ÊýÖ¸Õ룬¹ØÓÚËüµÄʹÓÃÇë²Î¿¼VBÎĵµ¡£
5¡¢ÄÃÀ´Ö÷Òå¡£
ʵ¼ÊÉÏ£¬ÓÐÁËCopyMemory£¬VarPtr£¬AddressOfÕâÈý°Ñ¸«Í·£¬ÎÒÃÇÒѾ¿ÉÒÔ½«CÀï»ù±¾µÄÖ¸Õë²Ù×÷ÄùýÀ´ÁË¡£
ÈçÏÂÃæµÄC³ÌÐò°üÀ¨Á˴󲿷ֻù±¾µÄÖ¸ÕëÖ¸Õë²Ù×÷£º struct POINT{ int x; int y; };
int Compare(void* elem1, void* elem2){} void PtrDemo(){ //Ö¸ÕëÉùÃ÷:
char c = 'X'; //ÉùÃ÷Ò»¸öcharÐͱäÁ¿ char* pc; long* pl; //ÉùÃ÷ÆÕָͨÕë POINT* pPt; //ÉùÃ÷½á¹¹Ö¸Õë void* pv; //ÉùÃ÷ÎÞÀàÐÍÖ¸Õë
int (*pfnCastToInt)(void *, void*);//ÉùÃ÷º¯ÊýÖ¸Õë: //Ö¸Õ븳ֵ£º
pc = &c; //½«±äÁ¿cµÄµØÖ·Öµ¸³¸øÖ¸Õëpc pfnCompare = Compare; //º¯ÊýÖ¸Õ븳ֵ¡£ //Ö¸Õëȡֵ£º
c = *pc; //½«Ö¸ÕëpcËùÖ¸´¦µÄÄÚ´æÖµ¸³¸ø±äÁ¿c //ÓÃÖ¸Õ븳ֵ£º
*pc = 'Y' //½«'Y'¸³¸øÖ¸ÕëpcËùÖ¸ÄÚ´æ±äÁ¿Àï¡£ //Ö¸ÕëÒÆ¶¯£º pc++; pl--; }
ÕâЩ¶ÔÖ¸Õë²Ù×÷ÔÚVBÀï¶¼ÓеÈͬµÄ¶«Î÷£¬
Ç°ÃæÌÖÂÛByValºÍByRefÊ±ÔøËµ¹ý´«Ö¸ÕëºÍ´«µØÖ·ÊÇÒ»»ØÊ£¬Êµ¼ÊÉϵ±ÎÒÃÇÔÚVBÀïÓÃȱʡµÄByRefÉùÃ÷º¯Êý²ÎÊýʱ£¬ÎÒÃÇÒѾ¾ÍÉùÃ÷ÁËÖ¸Õë¡£ ÈçÒ»¸öCÉùÃ÷µÄº¯Êý£ºlong Func(char* pc)
15
Æä¶ÔÓ¦µÄVBÉùÃ÷ÊÇ£ºFunction Func(pc As Byte) As Long Õâʱ²ÎÊýpcʹÓÃȱʡµÄByRef´«µØÖ··½Ê½À´´«µÝ£¬ÕâºÍCÀïÓÃÖ¸ÕëÀ´´«µÝ²ÎÊýÊÇÒ»Ñù¡£ ÄÇôÔõô²ÅÄÜÏóCÀïÄÇÑùÃ÷È·µØÉùÃ÷Ò»¸öÖ¸ÕëÄØ£¿
ºÜ¼òµ¥£¬ÈçǰËù˵£¬ÓÃÒ»¸ö32볤ÕûÊýÀ´±í´ïÖ¸Õë¾ÍÐС£ÔÚVBÀï¾ÍÊÇÓÃLongÐÍÀ´Ã÷È·µØÉùÃ÷Ö¸Õ룬ÎÒÃDz»ÓÃÇø·ÖÊÇÆÕָͨÕë¡¢ÎÞÀàÐÍÖ¸Õ뻹ÊǺ¯ÊýÖ¸Õ룬ͨͨ¶¼¿ÉÓÃLongÀ´ÉùÃ÷¡£¶ø¸øÒ»¸öÖ¸Õ븳ֵ£¬¾ÍÊǸ³¸øËüÓÃVarParµÃµ½µÄÁíÒ»¸ö±äÁ¿µÄµØÖ·¡£¾ßÌå¼û³ÌÐòÎå¡£ ¡¾³ÌÐòÎå¡¿£ºÍ¬CÒ»Ñù£¬¸÷ÖÖÖ¸Õë¡£ Type POINT X As Integer Y As Integer End Type
Public Function Compare(elem1 As Long, elem2 As Long) As Long '
End Function
Function FnPtrToLong(ByVal lngFnPtr As Long) As Long FnPtrToLong = lngFnPtr End Function Sub PtrDemo()
Dim l As Long, c As Byte, ca() As Byte, Pt As POINT
Dim pl As Long, pc As Long, pv As Long, pPt As Long, pfnCompare As Long c = AscB(\
pl = VarPtr(l) '¶ÔÓ¦CÀïµÄlong¡¢intÐÍÖ¸Õë pc = VarPtr(c) '¶ÔÓ¦char¡¢shortÐÍÖ¸Õë pPt = VarPtr(Pt) '½á¹¹Ö¸Õë
pv = VarPtr(ca(0)) '×Ö½ÚÊý×éÖ¸Õ룬¿É¶ÔÓ¦ÈκÎÀàÐÍ£¬Ò²¾ÍÊÇvoid* pfnCompare = FnPtrToLong(AddressOf Compare) 'º¯ÊýÖ¸Õë CopyMemory c, ByVal pc, LenB(c) 'ÓÃÖ¸Õëȡֵ
CopyMemory ByVal pc, AscB(\ÓÃÖ¸Õ븳ֵ pc = pc + LenB(c) : pl = pl - LenB(l) 'Ö¸ÕëÒÆ¶¯ End Sub
ÎÒÃÇ¿´µ½£¬ÓÉÓÚVB²»Ö±½ÓÖ§³ÖÖ¸Õë²Ù×÷£¬ÔÚVBÀïÓÃÖ¸ÕëȡֵºÍÓÃÖ¸Õ븳ֵ¶¼±ØÐëÓÃCopyMemoryÕâ¸öAPI£¬¶øµ÷ÓÃAPIµÄ´ú¼ÛÊDZȽϸߵģ¬Õâ¾Í¾ö¶¨ÁËÎÒÃÇÔÚVBÀïʹÓÃÖ¸Õë²»ÄÜÏóÔÚCÀïÄÇÑù×ÔÓÉºÍÆµ·±£¬ÎÒÃDZØÐëÒª¿¼ÂÇÖ¸Õë²Ù×÷µÄ´ú¼Û£¬ÔÚºóÃæµÄ\Ö¸ÕëÓ¦ÓÃ\ÎÒÃÇ»áÔÙ±ä̸Õâ¸öÎÊÌâ¡£
³ÌÐòÎåÖйØÓÚº¯ÊýÖ¸ÕëµÄÎÊÌâÇë²Î¿¼VBÎĵµ£¬ÎÞÀàÐÍÖ¸Õëvoid*»áÔÚÏÂÃæ\¹ØÓÚAnyµÄÎÊÌâ\Àï˵¡£
³ÌÐòÎå»ù±¾ÉÏÒѾ°üÀ¨ÁËÎÒÃÇÄÜÔÚVBÀï½øÐеÄËùÓÐÖ¸Õë²Ù×÷£¬½ö´Ë¶øÒÑ¡£
ÏÂÃæÓÐÒ»¸öС²âÊÔÌ⣬Èç¹ûÏÖÔÚÄã¾ÍŪ¶®ÁËÉÏÃæ³ÌÒ§½ðµÄÈý°å¸«£¬Äã¾ÍÓ¦¸ÃÄÜ×öµÃ³öÀ´¡£ ÉÏÃæÌáµ½¹ý£¬VB.NETÖÐûÓÐVarPtr£¬ÎÒÃÇ¿ÉÒÔÓÃÉùÃ÷APIµÄ·½Ê½À´ÒýÈëMSVBVM60.DLLÖеÄVarPtr¡£ÏÖÔÚµÄÎÊÌâÈç¹û²»ÓÃVBµÄÔËÐÐʱDLLÎļþ£¬ÄãÄܲ»ÄÜ×Ô¼ºÊµÏÖÒ»¸öObjPtr¡£´ð°¸ÔÚÏÂÒ»½Úºó¸ø³ö¡£
ËÄ¡¢Ö¸ÕëʹÓÃÖÐӦעÒâµÄÎÊÌâ
16
1¡¢¹ØÓÚANYµÄÎÊÌâ
Èç¹ûÒÔÒ»¸öÀÏʦµÄÉí·ÝÀ´Ëµ»°£¬ÎÒ»á˵£º×îºÃÓÀÔ¶Ò²²»ÒªÓÃAny£¡Êǵģ¬ÎÒû˵´í£¬ÊÇÓÀÔ¶£¡ËùÒÔÎÒûÓаÑËü·ÅÔÚ³ÌÒ§½ðµÄÈý°å¸«Àï¡£µ±È»£¬Õâ¸öÎÊÌâºÍÊDz»ÊÇÓ¦¸ÃʹÓÃÖ¸ÕëÕâ¸öÎÊÌâÒ»Ñù»áÒý·¢Ò»³¡Ã»Óнá¹ûµÄÌÖÂÛ£¬ÎÒ¸æËßÄãµÄÖ»ÊÇÒ»¸ö¹Ûµã£¬ÒòΪÓÐʱÎÒÃÇ»áΪÁËЧÂÊÉϵÄÒ»µãµãÌá¸ß»òÏë͵һµãµãÀÁ¶øÈ¥ÓÃAny£¬µ«ÕâÑù×öÐèÒªÒª³Ðµ£·çÏÕ¡£
Any²»ÊÇÒ»¸öÕæÕýµÄÀàÐÍ£¬ËüÖ»ÊǸæËßVB±àÒëÆ÷·ÅÆú¶Ô²ÎÊýÀàÐ͵ļì²é£¬ÕâÑù£¬ÀíÂÛÉÏ£¬ÎÒÃÇ¿ÉÒÔ½«ÈκÎÀàÐÍ´«µÝ¸øAPI¡£
AnyÔÚʲôµØ·½ÓÃÄØ£¿ÈÃÎÒÃÇÀ´¿´¿´£¬ÔÚVBÎĵµÀïµÄÊÇÔõô˵µÄ£¬ÏÖÔÚ¾ÍÇë´ò¿ªMSDN(Visual Studio 6×Ô´øµÄ°æ±¾)£¬·µ½\Îĵµ\ʹÓÃVisual Basic\²¿¼þ¹¤¾ßÖ¸ÄÏ\·ÃÎÊDLLºÍWindows API\²¿·Ö£¬ÔÙ¿´¿´\½« C ÓïÑÔÉùÃ÷ת»»Îª Visual Basic ÉùÃ÷\ÕâÒ»½Ú¡£ÎĵµÀï¸æËßÎÒÃÇ£¬Ö»ÓÐCµÄÉùÃ÷ΪLPVOIDºÍNULLʱ£¬ÎÒÃDzÅÓÃAny¡£Êµ¼ÊÉÏÈç¹ûÄãÔ¸Òâ³Ðµ£·çÏÕ£¬ËùÓеÄÀàÐÍÄã¶¼¿ÉÒÔÓÃAny¡£µ±È»£¬Ò²¿ÉÒÔÈçÎÒËù˵£¬ÓÀÔ¶²»ÒªÓÃAny¡£
ΪʲôҪÕâÑù£¿ÄÇΪʲôVB¹Ù·½»¹ÒªÌṩAny£¿ÊÇÐÅÎҵ쬻¹ÊÇÐÅVB¹Ù·½µÄ£¿ÓÐʲôµÀÀí²»ÓÃAny£¿
ÈçÇ°ÃæËù˵£¬VB¹Ù·½²»¹ÄÀøÎÒÃÇʹÓÃÖ¸Õë¡£ÒòΪVBËù±ê°ñµÄÓŵãÖ®Ò»£¬¾ÍÊÇûÓÐΣÏÕµÄÖ¸Õë²Ù×÷£¬ËùÒÔµÄÄÚ´æ·ÃÎʶ¼ÊÇÊÜVBÔËÐÐʱ¿â¿ØÖƵġ£ÔÚÕâÒ»µãÉÏ£¬JAVAÓïÑÔÒ²ÓÐ×ÅͬÑùµÄ±ê°ñ¡£µ«ÊÇ£¬Í¬JAVAÒ»Ñù£¬VBÒª±ÜÃâʹÓÃÖ¸Õë¶øµÃµ½¸ü¸ßµÄ°²È«ÐÔ£¬¾Í±ØÐëÒª¿Ë·þûÓÐÖ¸Õë¶ø´øÀ´µÄÎÊÌâ¡£VBÒѾ¾¡×î´óµÄŬÁ¦À´Ê¹ÎÒÃÇÔ¶ÀëÖ¸ÕëµÄͬʱӵÓÐÇ¿ÀàÐͼì²é´øÀ´µÄ°²È«ÐÔ¡£µ«ÊDzÙ×÷ϵͳÊÇCдµÄ£¬ÀïÃæµ½´¦¶¼ÐèÒªÖ¸Õ룬ÓÐЩָÕëÊÇûÓÐÀàÐ͵쬾ÍÊÇC³ÌÐòÔ±³£ËµµÄ¿ÉŵÄvoid*ÎÞÀàÐÍÖ¸Õë¡£ËüûÓÐÀàÐÍ£¬Òò´ËËü¿ÉÒÔ±íʾËùÓÐÀàÐÍ¡£ÈçCopyMemoryËù¶ÔÓ¦µÄÊÇCÓïÑÔµÄmemcpy£¬ËüµÄÉùÃ÷ÈçÏ£º void *memcpy( void *dest, const void *src, size_t count );
ÒòmemcpyǰÁ½¸ö²ÎÊýÓõÄÊÇvoid*£¬Òò´ËÈκÎÀàÐ͵IJÎÊý¶¼¿ÉÒÔ´«µÝ¸øËû¡£
Ò»¸öÓÃCµÄ³ÌÐòÔ±£¬Ó¦¸ÃÖªµÀÔÚCº¯Êý¿âÀïÕâÑùµÄvoid*²¢²»ÉÙ¼û£¬Ò²Ó¦¸ÃÖªµÀËüÓжàΣÏÕ¡£ÎÞÂÛ´«µÝʲôÀàÐ͵ıäÁ¿Ö¸Õë¸øÉÏÃæmemcpyµÄvoid*£¬C±àÒëÆ÷¶¼²»»á±¨´í»ò¸øÈκξ¯¸æ¡£
ÔÚVBÀï´ó¶àÊýʱºò£¬ÎÒÃÇʹÓÃAny¾ÍÊÇΪÁËʹÓÃvoid*£¬ºÍÔÚCÀïÒ»Ñù£¬VBÒ²²»¶ÔAny½øÐÐÀàÐͼì²é£¬ÎÒÃÇÒ²¿ÉÒÔ´«µÝÈκÎÀàÐ͸øAny£¬VB±àÒëÆ÷Ò²¶¼²»»á±¨´í»ò¸øÈκξ¯¸æ¡£
µ«³ÌÐòÔËÐÐʱ»á²»»á³ö´í£¬¾ÍÒª¿´Ê¹ÓÃËüʱÊDz»ÊÇСÐÄÁË¡£ÕýÒòΪÔÚCÀïºÜ¶à´íÎóÊǺÍvoid*Ïà¹ØµÄ£¬ËùÒÔ£¬C++¹ÄÀøÎÒÃÇʹÓÃsatic_cast
˵ÁËÕâô¶àC/C++£¬ÆäʵÎÒÊÇÏë¸æËßËùÓÐVBµÄ³ÌÐòÔ±£¬ÔÚʹÓÃAnyʱ£¬ÎÒÃDZØÐëºÍC/C++³ÌÐòԱʹÓÃvoid*Ò»ÑùÒª¸ß¶ÈСÐÄ¡£
VBÀïûÓÐsatic_castÕâÖÖ¶«Î÷£¬µ«ÎÒÃÇ¿ÉÒÔÔÚ´«µÝÖ¸ÕëʱÃ÷È·µÄʹÓÃlongÀàÐÍ£¬²¢ÇÒÓÃVarPtrÀ´È¡µÃ²ÎÊýµÄÖ¸Õ룬ÕâÑùÖÁÉÙÒѾÃ÷È·µØÖ¸³öÎÒÃÇÔÚʹÓÃΣÏÕµÄÖ¸Õë¡£Èç³ÌÐò¶þ¾¹ýÕâÑùµÄ´¦Àí¾Í³ÉÁËÏÂÃæµÄ³ÌÐò£º ¡¾³ÌÐòÎå¡¿£º'ʹÓøü°²È«µÄCopyMemory£¬Ã÷È·µÄʹÓÃÖ¸Õ룡
Private Declare Sub CopyMemory Lib \Alias \(ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long) Sub SwapStrPtr2(sA As String, sB As String) Dim lTmp As Long
Dim pTmp As Long, psA As Long, psB As Long
17
pTmp = VarPtr(lTmp): psA = VarPtr(sA): psB = VarPtr(sB) CopyMemory pTmp, psA, 4 CopyMemory psA, psB, 4 CopyMemory psB, pTmp, 4 End Sub
×¢Ò⣬ÉÏÃæCopyMemoryµÄÉùÃ÷£¬ÓõÄÊÇByValºÍlong£¬ÒªÇ󴫵ݵÄÊÇ32λµÄµØÖ·Öµ£¬µ±ÎÒÃǽ«Ò»¸ö±ðµÄÀàÐÍ´«µÝ¸øÕâ¸öAPIʱ£¬±àÒëÆ÷»á±¨´í£¬±ÈÈçÏÖÔÚÎÒÃÇÓÃÏÂÃæµÄÓï¾ä£º ¡¾³ÌÐòÁù¡¿£º'ÓеãÏó¡¾³ÌÐòËÄ¡¿£¬µ«½«³£Á¿40000»»³ÉÁËֵΪ1µÄ±äÁ¿.
Private Declare Sub CopyMemory Lib \Alias \(ByVal Destination As Long, ByVal Source As Long, Length As Long) Sub TestCopyMemory()
Dim i As Long£¬k As Long, z As Interger k = 5 : z = 1 i = VarPtr(k)
'ÏÂÃæµÄÓï¾ä»áÒýÆðÀàÐͲ»·ûµÄ±àÒë´íÎó£¬ÕâÊǺÃÊ£¡ 'CopyMemory i, z, 4 'Ó¦¸ÃÓÃÏÂÃæµÄ
CopyMemory i, ByVal VarPtr(z), 2 Debug.Print k End Sub
±àÒë»á³ö´í£¡ÊǺÃÊ£¡Õâ×ܱÈÔËÐÐʱ²»ÖªµÀ´íÔÚÄĶùºÃ£¡ Ïó³ÌÐòËÄÄÇÑùʹÓÃAnyÀàÐÍÀ´ÉùÃ÷CopyMemoryµÄ²ÎÊý£¬VBËäÈ»²»»á±¨´í£¬µ«ÔËÐÐʱ½á¹ûÈ´ÊÇ´íµÄ¡£²»ÐÅ£¬ÄãÊÔÊÔ½«³ÌÐòËÄÖеÄ40000¸ÄΪ1£¬½á¹ûiµÄÖµ²»ÊÇÎÒÃÇÏëÒªµÄ1£¬¶øÊÇ327681¡£ÎªÊ²Ã´ÔÚ³ÌÐòËÄÖУ¬³£Á¿Îª1ʱ½á¹û»á³ö´í£¬¶ø³£Á¿Îª40000ʱ½á¹û¾Í²»´í£¿ ÔÒòÊÇVB¶Ôº¯Êý²ÎÊýÖеij£Á¿°´VariantµÄ·½Ê½´¦Àí¡£ÊÇ1ʱ£¬ÓÉÓÚ1СÓÚIntegerÐ͵Ä×î´óÖµ32767£¬VB»áÉú³ÉÒ»¸ö´æ´¢Öµ1µÄIntegerÐ͵ÄÁÙʱ±äÁ¿£¬Ò²¾ÍÊÇ˵£¬µ±ÎÒÃÇÏ뽫1ÓÃCopyMemroy¿½±´µ½LongÐ͵ıäÁ¿iʱ£¬Õâ¸ö³£Á¿1ÊÇʵ¼ÊÉÏÊÇIntegerÐÍÁÙʱ±äÁ¿£¡VBÀïIntegerÀàÐÍÖ»ÓÐÁ½¸ö×Ö½Ú£¬¶øÎÒÃÇʵ¼ÊÉÏ¿½±´ÁËËĸö×Ö½Ú¡£ÖªµÀÓжàΣÏÕÁ˰ɣ¡Ã»ÓгöÄÚ´æ±£»¤´íÎóÄÇÖ»ÊÇÎÒÃǵÄÐÒÔË£¡
Èç¹ûÒ»¶¨Òª½âÊÍÒ»ÏÂΪʲôi×îºó±ä³ÉÁË327681£¬ÕâÊÇÒòΪÎÒÃǽ«kµÄµÍ16λµÄÖµ5Ò²¿½±´µ½ÁËiÖµµÄ¸ß16λÖÐÈ¥ÁË£¬Òò´ËÓÐ5*65536+1=327681¡£Ïê̸Õâ¸öÎÊÌâÉæ¼°µ½VB¾Ö²¿±äÁ¿ÉùÃ÷˳Ðò£¬CopyMemory²ÎÊýµÄѹջ˳Ðò£¬longÐ͵ĵÍλÔÚǰ¸ßλÔÚºóµÈÎÊÌâ¡£Èç¹ûÄã¶ÔÕâЩÎÊÌâ¸ÐÐËȤ£¬¿ÉÒÔÓñ¾ÏµÁеÚһƪÎÄÕÂËùÌṩµÄ·½·¨(DebugBreakÕâ¸öAPIºÍVCµ÷ÊÔÆ÷)À´¸ú×Ùһϣ¬¿ÉÒÔ¼ÓÉîÄã¶ÔVBÄÚ²¿´¦Àí·½Ê½µÄÈÏʶ£¬ÓÉÓÚÕâºÍ±¾ÎÄÌÖÂÛµÄÎÊÌâÎ޹أ¬ËùÒԾͲ»Ïê̸ÁË¡£µ½ÕâÀ´ó¼ÒÓ¦¸ÃÃ÷°×£¬³ÌÐòÈýºÍ³ÌÐòËÄʵ¼ÊÉÏÓдíÎ󣡣¡£¡ÎÒÔÚÉÏÃæÓó£Á¿40000¶ø²»ÓÃ1£¬²»ÊÇΪÁËÔÚÎÄÕÂÖдÕ×ÖÊý£¬¶øÊÇÒòΪ40000Õâ¸ö³£Á¿´óÓÚ32767£¬»á±»VB½âÊͳÉÎÒÃÇÐèÒªµÄLongÐ͵ÄÁÙʱ±äÁ¿£¬Ö»ÓÐÕâÑù³ÌÐòÈýºÍ³ÌÐòËIJÅÄÜÕý³£¹¤×÷¡£¶Ô²»Æð£¬ÎÒÕâÑùÓÐÒâµÄÒþ²Ø´íÎóÖ»ÊÇÏë¼ÓÉîÄã¶ÔAnyΣº¦µÄÈÏʶ¡£ ×ÜÖ®£¬ÎÒÃÇÒªÈÏʶµ½£¬±àÒëʱ¾ÍÕÒµ½´íÎóÊǷdz£ÖØÒªµÄ£¬ÒòΪÄãÂíÉϾÍÖªµÀ´íÎóµÄËùÔÚ¡£ËùÒÔÎÒÃÇÓ¦¸ÃÏó³ÌÐòÎåºÍ³ÌÐòÁùÄÇÑùÃ÷È·µØÓÃlongÐ͵ÄByValµÄÖ¸Õ룬¶ø²»ÒªÓÃAnyµÄByRefµÄÖ¸Õë¡£
µ«ÓÃAnyÒѾÈç´ËµÄÁ÷ÐУ¬ÒÔÖÁºÜ¶à´óʦÃÇÒ²ÓÃËü¡£ËüΨһµÄ÷ÈÁ¦¾ÍÊDz»ÏóÓÃLongÐÍÖ¸ÕëÄÇÑù£¬ÐèÒªÎÒÃÇ×Ô¼ºµ÷ÓÃVarPtrÀ´µÃµ½Ö¸Õ룬ËùÓд¦ÀíÖ¸ÕëµÄ¹¤×÷ÓÉVB±àÒëÆ÷À´Íê³É¡£ËùÒÔÔÚ²ÎÊýµÄ´¦ÀíÉÏ£¬Ö»ÓÃÒ»Ìõ»ã±àÖ¸Ápush [i]£¬¶øÓÃVarPtrʱ£¬ÓÉÓÚÐèÒªº¯Êýµ÷Óã¬
18
Òò´ËÒª¶àÓÃÎåÌõ»ã±àÖ¸Áî¡£ÎåÌõ¶àÓàµÄ»ã±àÖ¸ÁîÓÐʱµÄÈ·ÄÜÎÒÃÇð×Å·çÏÕÈ¥ÓÃAny¡£ VB¿ª·¢Ð¡×éÌṩAny£¬¾ÍÊÇÏëÓÃByRef xxx As AnyÀ´±í´ïvoid* xxx¡£ÎÒÃÇÒ²ÍêÈ«¿ÉÒÔʹÓÃVarPtrºÍLongÐ͵ÄÖ¸ÕëÀ´´¦Àí¡£ÎÒÏ룬VB¿ª·¢Ð¡×éÒ²ÔøÓÌÔ¥¹ýÊǹ«²¼VarPtr£¬»¹ÊÇÌṩAny£¬×îºóËûÃǾö¶¨»¹ÊÇÌṩAny£¬¶ø¼ÌÐøÒþÂ÷VarPtr¡£µÄÈ·£¬ÕâÊǸöÁ½Äѵľö¶¨¡£µ«ÊǾ¹ýÎÒÉÏÃæµÄ·ÖÎö£¬ÎÒÃÇÓ¦¸ÃÖªµÀ£¬Õâ¸ö¾ö¶¨²¢²»·ûºÏVBËù×·ÇóµÄ\¸ü°²È«\µÄ³õÖÔ¡£ÒòΪËü¿ÉÄÜ»áÒþ²ØÀàÐͲ»·ûµÄ´íÎ󣬵÷ÊÔºÍÕÒµ½ÕâÖÖÔËÐÐʱ²Å²úÉúµÄ´íÎ󽫻¨¹ó¸ü¶àµÄʱ¼äºÍ¾«Á¦¡£
ËùÒÔÎÒÓÐÁË\×îºÃÓÀÔ¶²»ÒªÓÃAny\Õâ¸ö\¾ªÈË\µÄ½áÂÛ¡£
²»ÓÃAnyµÄÁíÒ»¸öºÃ´¦ÊÇ£¬¼ò»¯ÁËÎÒÃǽ«CÉùÃ÷µÄAPIת»»³ÉVBÉùÃ÷µÄ·½Ê½£¬ÏÖÔÚËü±ä³ÉÁËÒ»¾ä»°£º³ýÁËVBÄÚÖõĿÉÒÔ½øÐÐÀàÐͼì²éµÄÀàÐÍÍ⣬ËùÒÔÆäËüµÄÀàÐÍÎÒÃǶ¼Ó¦¸ÃÉùÃ÷³ÉLongÐÍ¡£
2¡¢¹ØÓÚNULLµÄÈÝÒ×»ìÏýµÄÎÊÌâ ÓкܶàÎÄÕ½²¹ý£¬Ò»¶¨Òª¼ÇÔÚÐÄÀ
VbNullChar Ï൱ÓÚCÀïµÄ'\\0'£¬ÔÚÓÃ×Ö½ÚÊý×é¹¹ÔìC×Ö´®Ê±³£ÓÃËüÀ´×ö×îºó1¸öÔªËØ¡£ vbNullString Õâ²ÅÊÇÕæÕýµÄNULL£¬¾ÍÊÇ0£¬ÔÚVB6ÖÐÖ±½ÓÓÃ0Ò²¿ÉÒÔ¡£
Ö»ÓÐÉÏÃæµÄÁ½¸öÊÇAPIµ÷ÓÃÖлáÓõġ£»¹ÓÐEmpty¡¢NullÊÇVariant£¬¶øNothingÖ»ºÍÀà¶ÔÏóÓйأ¬Ò»°ãAPIµ÷ÓÃÖж¼²»»áÓõ½ËüÃÇ¡£
Áí£º±¾ÎĵÚÈý½ÚÔøÌá³öÒ»¸öС²âÑéÌ⣬×ö³öÀ´ÁËÂð£¿ÏÖÔÚ¹«²¼ÕýÈ·´ð°¸£º ¡¾²âÑéÌâ´ð°¸¡¿
Function ObjPtr(obj as Object) as long Dim lpObj As Long
CopyMemory lpObj, Obj, 4 ObjectPtr = lpObj End Function
Îå¡¢VBÖ¸ÕëÓ¦ÓÃ
ÈçÇ°ÃæËù˵VBÀïʹÓÃÖ¸Õë²»ÏóCÀïÄÇÑùÁé»î£¬ÓÃÖ¸Õë´¦ÀíÊý¾Ýʱ¶¼ÐèÒªÓÃCopyMemory½«Êý¾ÝÔÚÖ¸ÕëºÍVBÄܹ»´¦ÀíµÄ±äÁ¿Ö®¼äÀ´»Ø¿½±´£¬ÕâÐèÒªºÜ´óµÄ¶îÍ⿪Ïú¡£Òò´Ë²»ÊÇËùÓÐCÀïµÄÖ¸Õë²Ù×÷¶¼¿ÉÒÔÒÆÖµµ½VBÀïÀ´£¬ÎÒÃÇÖ»Ó¦ÔÚÐèÒªµÄʱºò²ÅÔÚVBÀïʹÓÃÖ¸Õë¡£
1¡¢¶¯Ì¬ÄÚ´æ·ÖÅ䣺ÍêÈ«²»¿ÉÄÜ¡¢¿ÉÄܵ«²»¿ÉÐУ¬VB±ê×¼
ÔÚCºÍC++ÀïÆµ·±Ê¹ÓÃÖ¸ÕëµÄÒ»¸öÖØÒªÔÒòÊÇÐèҪʹÓö¯Ì¬ÄÚ´æ·ÖÅ䣬ÓÃMalloc»òNewÀ´´Ó¶ÑÕ»Àﶯ̬·ÖÅäÄڴ棬²¢µÃµ½Ö¸ÏòÕâ¸öÄÚ´æµÄÖ¸Õë¡£ÔÚVBÀïÎÒÃÇÒ²¿ÉÒÔ×Ô¼º ÓÃAPIÀ´ÊµÏÖ¶¯Ì¬·ÖÅäÄڴ棬²¢ÇÒʵÏÖÏóCÀïµÄÖ¸ÕëÁ´±í¡£
µ«ÎÒÃDz»¿ÉÄÜÏóCÄÇÑùÖ±½ÓÓÃÖ¸ÕëÀ´·ÃÎÊÕâÑù¶¯Ì¬·ÖÅäµÄÄڴ棬·ÃÎÊʱÎÒÃDZØÐëÓÃCopyMemory½«Êý¾Ý¿½±´µ½VBµÄ±äÁ¿ÄÚ£¬´óÁ¿µÄʹÓÃÕâÖÖ¼¼Êõ±ØÈ»»á½µµÍЧÂÊ£¬ÒÔÖÁÓÚÒªÏóCÄÇÑùÓÃÖ¸ÕëÀ´Ê¹Óö¯Ì¬ÄÚ´æ¸ù±¾¾ÍûÓпÉÐÐÐÔ¡£ÒªÏóC¡¢PASCALÄÇÑùʵÏÖ¶¯Ì¬Êý¾Ý½á¹¹£¬ÔÚVBÀﻹÊÇÓ¦¸ÃÀÏÀÏʵʵÓöÔÏó¼¼ÊõÀ´ÊµÏÖ¡£
±¾ÎÄÅäÌ×´úÂëÖеÄLinkedListÀïÓÐÍêÈ«ÓÃÖ¸ÕëʵÏÖµÄÁ´±í£¬ËüÊÇʹÓÃHeapAlloc´Ó¶ÑÕ»Öж¯Ì¬·ÖÅäÄڴ棬ÁíÓÐÒ»¸öµ÷ÓÃFindFirstUrlCacheEntryÕâ¸öAPIÀ´²Ù×÷IEµÄCacheµÄС³Ì
19
ÐòIECache£¬ËüʹÓÃÁËVirtualAllocÀ´¶¯Ì¬·ÖÅäÄÚ´æ¡£µ«Êµ¼ÊÉÏÕâ¶¼²»ÊDZØÐëµÄ£¬VBÒѾΪÎÒÃÇÌṩÁ˱ê×¼µÄ¶¯Ì¬ÄÚ´æ·ÖÅäµÄ·½·¨£¬ÄǾÍÊÇ£º ¶ÔÏó¡¢×Ö·û´®ºÍ×Ö½ÚÊý×é
ÏÞÓÚÆª·ù£¬¹ØÓÚ¶ÔÏóµÄ¼¼ÊõÕâÀï²»½²£¬LinkedListµÄÔ´´úÂëÀïÓÐÓöÔÏóʵÏÖµÄÁ´±í£¬Äã¿ÉÒԲο¼¡£
×Ö·û´®¿ÉÒÔÓÃSpace$º¯ÊýÀ´¶¯Ì¬·ÖÅ䣬VBµÄÎĵµÀï¾ÍÓÐÏêϸµÄ˵Ã÷¡£
¹ØÓÚ×Ö½ÚÊý×飬ÕâÀïÒª½²½²£¬Ëü·Ç³£ÓÐÓá£ÎÒÃÇ¿ÉÓÃRedimÀ´¶¯Ì¬¸Ä±äËüµÄ´óС£¬²¢½«Ö¸ÏòËüµÚÒ»¸öÔªËØµÄÖ¸Õë´«¸øÐèÒªÖ¸ÕëµÄAPI£¬ÈçÏ£º dim ab() As Byte , ret As long
'´«µÝNullÖµAPI»á·µ»ØËüËùÐèÒªµÄ»º³åÇøµÄ³¤¶È¡£ ret = SomeApiNeedsBuffer(vbNullString) '¶¯Ì¬·ÖÅä×ã¹»´óСµÄÄڴ滺³åÇø ReDim ab(ret) As Byte
'ÔٴΰÑÖ¸Õë´«¸øAPI£¬´Ëʱ´«×Ö½ÚÊý×éµÚÒ»¸öÔªËØµÄÖ¸Õë¡£ SomeApiNeedsBuffer(ByVal VarPtr(ab(1)))
ÔÚ±¾ÎÄÅäÌ׳ÌÐòÖеÄIECacheÖУ¬ÎÒÒ²ÌṩÁËÓÃ×Ö½ÚÊý×éÀ´ÊµÏÖ¶¯Ì¬·ÖÅ仺³åÇøµÄ°æ±¾£¬±ÈÓÃVirtualAllocÀ´ÊµÏÖ¸ü°²È«¸ü¼òµ¥¡£
2¡¢Í»ÆÆÏÞÖÆ
ÏÂÃæÊÇÒ»¸öÍ»ÆÆVBÀàÐͼì²éÀ´ÊµÏÖÌØÊ⹦ÄܵľµäÓ¦Ó㬳ö×ÔBruce MckinneyµÄ¡¶HardCore Visual Basic¡·Ò»Êé¡£
½«Ò»¸öLong³¤ÕûÊýµÄµÍ16λ×÷ΪIntergerÐÍÌáÈ¡³öÀ´£¬ ¡¾³ÌÐòÆß¡¿ '±ê×¼µÄ·½·¨£¬Ò²ÊǸßЧµÄ·½·¨£¬µ«²»ÈÝÒ×Àí½â¡£ Function LoWord(ByVal dw As Long) As Integer If dw And &H8000& Then
LoWord = dw Or &HFFFF0000 Else
LoWord = dw And &HFFFF& End If End Function
¡¾³ÌÐò°Ë¡¿ 'ÓÃÖ¸ÕëÀ´×öЧÂÊËä²»¸ß£¬µ«Ë¼ÏëÇå³þ¡£ Function LoWord(ByVal dw As Long) As Integer
CopyMemory ByVal VarPtr(LoWord), ByVal VarPtr(dw), 2 End Function
3¡¢¶ÔÊý×é½øÐÐÅúÁ¿²Ù×÷
ÓÃÖ¸Õë½øÐдóÅúÁ¿Êý×éÊý¾ÝµÄÒÆ¶¯£¬´ÓЧÂÊÉÏ¿¼ÂÇÊǺÜÓбØÒªµÄ£¬¿´ÏÂÃæµÄÁ½¸ö³ÌÐò£¬ËüÃǹ¦Äܶ¼Êǽ«Êý×éµÄǰһ°ëÊý¾ÝÒÆµ½ºóÒ»°ëÖУº ¡¾³ÌÐò¾Å¡¿£º'±ê×¼µÄÒÆ¶¯Êý×éµÄ×ö·¨
Private Sub ShitArray(ab() As MyType) Dim i As Long, n As Long n = CLng(UBound(ab) / 2) For i = 1 To n
Value(n + i) = Value(i)
20
Value(i).data = 0 Next End Sub ¡¾³ÌÐòÊ®¡¿£º'ÓÃÖ¸ÕëµÄ×ö·¨
Private Declare Sub CopyMemory Lib \ (ByVal dest As Long, ByVal source As Long, ByVal bytes As Long) Private Declare Sub ZeroMemory Lib \ (ByVal dest As Long, ByVal numbytes As Long)
Private Declare Sub FillMemory Lib \ (ByVal dest As Long, ByVal Length As Long, ByVal Fill As Byte)
Private Sub ShitArrayByPtr(ab() As MyTpye) Dim n As Long
n = CLng(UBound(ab) / 2) Dim nLenth As Long nLenth = Len(Value(1)) 'DebugBreak
CopyMemory ByVal VarPtr(Value(1 + n)), _ ByVal VarPtr(Value(1)), n * nLenth ZeroMemory ByVal VarPtr(Value(1)), n * nLenth End Sub
µ±Êý×é½Ï´ó£¬Òƶ¯²Ù×÷½Ï¶à£¨±ÈÈçÓÃÊý×éʵÏÖHashTable£©Ê±³ÌÐòÊ®±È³ÌÐò¾ÅÐÔÄÜÉÏÒªºÃµÃ¶à¡£
³ÌÐòÊ®ÖÐÓÖ½éÉÜÁ½¸öÔÚÖ¸Õë²Ù×÷ÖлáÓõ½µÄAPI: ZeroMemoryÊÇÓÃÀ´½«ÄÚ´æÇåÁ㣻FillMemoryÓÃͬһ¸ö×Ö½ÚÀ´Ìî³äÄÚ´æ¡£µ±È»£¬ÕâÁ½¸öAPIµÄ¹¦ÄÜ£¬Ò²ÍêÈ«¿ÉÒÔÓÃCopyMemoryÀ´Íê³É¡£ÏóÔÚCÀïÒ»Ñù£¬×÷Ϊһ¸öºÃϰ¹ß£¬ÔÚVBÀïÎÒÃÇÒ²¿ÉÒÔÃ÷È·µÄÓÃZeroMemoryÀ´¶ÔÊý×é½øÐгõʼ»¯£¬ÓÃFillMemoryÔÚ²»Á¢¼´Ê¹ÓõÄÄÚ´æÖÐÌîÈë¹ÖÖµ£¬ÕâÓÐÀûÓÚµ÷ÊÔ¡£ 4¡¢×îºóµÄÒ»µã
µ±È»£¬VBÖ¸ÕëµÄÓ¦Óþö²»Ö¹ÕâЩ£¬»¹ÓÐʲôӦÓþÍÒª¿¿×Ô¼ºÈ¥ÃþË÷ÁË¡£¶ÔÓÚ¶ÔÏóÖ¸ÕëºÍ×Ö·û´®Ö¸ÕëµÄÓ¦ÓÃÎÒ»áÁíдÎÄÕÂÀ´Ì¸£¬×öΪ±¾ÎĵĽáÊøºÍÏÂһƪÎÄÕ¡¶VB×Ö·û´®È«¹¥ÂÔ¡·µÄ¿ªÊ¼£¬ÎÒÔÚÕâÀï¸ø³ö½»»»Á½¸ö×Ö·û´®µÄ×î¿ìµÄ·½·¨£º ¡¾³ÌÐòʮһ¡¿'½»»»Á½¸ö×Ö·û´®×î¿ìµÄ·½·¨
Private Declare Sub CopyMemory Lib \Alias \_ (Destination As Any, Source As Any, ByVal Length As Long)
Sub SwapStrPtr3(sA As String, sB As String) Dim lTmp As Long
Dim pTmp As Long, psA As Long, psB As Long
pTmp = StrPtr(sA): psA = VarPtr(sA): psB = VarPtr(sB) CopyMemory ByVal psA, ByVal psB, 4 CopyMemory ByVal psB, pTmp, 4 End Sub
¶Ô²»Æð£¬ÎªÁËÒ»µãµãЧÂÊ£¬ÓÖÓÃÁËAny£¡¹ØÓÚStrPtr£¬ÏÂһƪÎÄÕÂÎÒ»áÀ´Ì¸¡£ ×Ô¼ºÀ´ÊÔÊÔ°É£¡ÓûÁ·Éñ¹¦£¬¸Ï¿ìÐж¯£¡
21
ÿ´Î¿´´óʦµÄ¶«Î÷µ½Á˾«²ÊÖ®´¦£¬ÎҾͻáÅݸ½Ð¾ø£º\ÍÛàç£¬ÕæÊÇÏë²»µ½£¡\¡£ÔÚ¾¹ýºÜ¶à´ÎÕâÖָп®Ö®ºó£¬ÎÒ·¢ÏÖÖ»ÒªÎÒÃǶ¯ÁËÄԽÎÒÃÇ×Ô¼ºÒ²ÄÜÓÐÈñðÈËÏë²»µ½µÄ¶«Î÷¡£ÓÚÊÇÏëµ½Òª°ÑÕâЩÏë²»µ½µÄ¶«ÄóöÀ´ºÍ´ó¼ÒÒ»Æð·ÖÏí£¬Ï£ÍûÅ×שÒýÓñ£¬ÄÜÒý³ö¸ü¶àÈÃÈËÏë²»µ½µÄ¶«Î÷¡£
±¾ÏµÁÐÎÄÕ¿ɼû£º
http://www.csdn.net/develop/list_article.asp?author=AdamBear
VBÕæÊÇÏë²»µ½ÏµÁÐÖ®Èý£ºVBÖ¸Õë¿û»¨±¦µäÖ®º¯ÊýÖ¸Õë ¹Ø¼ü×Ö£ºVB¡¢HCAK¡¢Ö¸Õë¡¢º¯ÊýÖ¸Õ롢ЧÂÊ¡¢Êý×é¡¢¶ÔÏó¡¢ÅÅÐò ÄѶȣºÖм¶
ÒªÇó£ºÊìϤVB£¬Á˽â»ù±¾µÄÅÅÐòËã·¨£¬»áÓÃVC¸üºÃ¡£
ÒýÑÔ£º
²»Öª´ó¼ÒÔÚÐÞϰ¹ý±¾ÏµÁеڶþƪ¡¶VBÖ¸Õë¿û»¨±¦µä¡·ºóÓÐʲô¸ÐÏ룬ÊDz»ÊǾõµÃ±¦µä¹ýÓÚÆ«ÖØÄÚ¹¦ÐÄ·¨£¬¶øÉÙÁËÀ÷º¦µÄÕÐʽ¡£ËùÒÔ£¬½ñÌì±¾ÎĽ«ÉÙ½²µÀÀí£¬¶à½²ÕÐʽ¡£²»¹ý£¬»¹ÊÇÇë´ó¼Ò´ÓÃûÃÅÕýÅɵÄÄÚ¹¦ÐÄ·¨¿ªÊ¼Ñ§Æð£¬·ñÔò»á°Ñ¾ÅÒõÕæ¾Á·³É¾ÅÒõ°×¹Çצ¡£ ½ñÌ죬ÎÒÃÇÖØµãÀ´Ì¸Ì¸º¯ÊýÖ¸ÕëµÄʵ¼ÊÓ¦Óᣠ½Ó×ÅÉÏһƪÎÄÕ£¬¹ØÓÚ×Ö´®µÄÎÊÌ⣬ÌýCSDNÉϸ÷Î»ÍøÓѵĽ¨Ò飬ÎÒ²»×¼±¸Ð´Ê²Ã´¡¶VB×Ö·û´®È«¹¥ÂÔ¡·ÁË£¬¹ØÓÚBSTRµÄ½á¹¹£¬¹ØÓÚµ÷ÓÃAPIʱ×Ö´®ÔÚUNICODEºÍANSIÖ®¼äµÄת»»ÎÊÌ⣬Çë²Î¿¼MSDNµÄPartial BooksÀïµÄ¡¶Win32 API Programming with Visual Basic¡·ÀïµÄµÚÁùÕ¡¶Strings¡·¡£½ñÌì¾ÍÈÃÎÒÃÇÏÈÍüµô×Ö·û´®£¬×¨×¢ÓÚº¯ÊýÖ¸ÕëµÄ´¦ÀíÉÏÀ´¡£
Ò»¡¢º¯ÊýÖ¸Õë
AddressOfµÃµ½Ò»¸öVBÄÚ²¿µÄº¯ÊýÖ¸Õ룬ÎÒÃÇ¿ÉÒÔ½«Õâ¸öº¯ÊýÖ¸Õë´«µÝ¸øÐèÒª»Øµ÷Õâ¸öº¯ÊýµÄAPI£¬ËüµÄ×÷ÓþÍÊÇÈÃÍⲿµÄ³ÌÐò¿ÉÒÔµ÷ÓÃVBÄÚ²¿µÄº¯Êý¡£ µ«ÊÇVBÀﺯÊýÖ¸ÕëµÄÓ¦Óã¬Ô¶²»ÏóCÀïÓ¦ÓÃÄÇô¹ã·º£¬ÒòΪVBÎĵµÀï½ö½éÉÜÁËÈçºÎ½«º¯ÊýÖ¸Õë´«µÝ¸øAPIÒÔʵÏֻص÷£¬²¢Ã»Ö¸³öº¯ÊýÖ¸ÕëÖî¶àÉñÆæµÄ¹¦ÄÜ£¬ÒòΪVBÊDz»¹ÄÀøÊ¹ÓÃÖ¸ÕëµÄ£¬º¯ÊýÖ¸ÕëÒ²²»ÀýÍâ¡£
Ê×ÏÈÈÃÎÒÃǶԺ¯ÊýÖ¸ÕëµÄʹÓ÷½Ê½À´·Ö¸öÀà¡£
1¡¢»Øµ÷¡£ÕâÊÇ×î»ù±¾Ò²ÊÇ×îÖØÒªµÄ¹¦ÄÜ¡£±ÈÈçVBÎĵµÀï½éÉܹýµÄ×ÓÀàÅÉÉú¼¼Êõ£¬ËüµÄºËÐľÍÊÇÁ½¸öAPI£ºSetWindowLongºÍCallWindowProc¡£
ÎÒÃÇ¿ÉÒÔʹSetWindowLongÕâ¸öAPIÀ´½«ÔÀ´µÄ´°¿Úº¯ÊýÖ¸Õë»»³É×Ô¼ºµÄº¯ÊýÖ¸Õ룬²¢½«ÔÀ´µÄ´°¿Úº¯ÊýÖ¸Õë±£´æÏÂÀ´¡£ÕâÑù´°¿ÚÏûÏ¢¾Í¿ÉÒÔ·¢µ½ÎÒÃÇ×Ô¼ºµÄº¯ÊýÀïÀ´£¬²¢ÇÒÎÒÃÇËæÊ±¿ÉÒÔÓÃCallWindowProcÀ´µ÷ÓÃÇ°Ãæ±£´æÏÂÀ´µÄ´°¿ÚÖ¸Õ룬ÒÔµ÷ÓÃÔÀ´µÄ´°¿Úº¯Êý¡£ÕâÑù£¬ÎÒÃÇ¿ÉÒÔÔÚ²»ÆÆ»µÔÓд°¿Ú¹¦ÄܵÄǰÌáÏ´¦Àí¹³ÈëµÄÏûÏ¢¡£
¾ßÌåµÄ´¦Àí£¬ÎÒÃÇÓ¦¸ÃºÜÊìϤÁË£¬VBÎĵµÒ²½²µÃºÜÇå³þÁË¡£ÕâÀïÐèҪעÒâµÄ¾ÍÊÇCallWindowProcÕâ¸öAPI£¬ÔÚºóÃæÎÒÃǽ«¿´µ½ËüµÄÃîÓᣠÔÚÕâÀïÎÒÃdzƻص÷ΪÈÃ\Íⲿµ÷ÓÃÄÚ²¿µÄº¯ÊýÖ¸Õë\¡£
2¡¢³ÌÐòÄÚ²¿Ê¹ÓᣱÈÈçÔÚCÀïÎÒÃÇ¿ÉÒÔ½«Cº¯ÊýÖ¸Õë×÷Ϊ²ÎÊý´«µÝ¸øÒ»¸öÐèÒªº¯ÊýÖ¸ÕëµÄCº¯Êý£¬ÈçºóÃæ»¹Òª½²µ½µÄC¿âº¯Êýqsort£¬ËüµÄÉùÃ÷ÈçÏ£º
#define int (__cdecl *COMPARE)(const void *elem1, const void *elem2) void qsort(void *base, size_t num, size_t width, COMPARE pfnCompare);
ËüÐèÒªÒ»¸öCOMPAREÀàÐͺ¯ÊýÖ¸Õ룬ÓÃÀ´±È½ÏÁ½¸ö±äÁ¿´óСµÄ£¬ÕâÑùÅÅÐòº¯Êý¿ÉÒÔµ÷ÓÃ
22
Õâ¸öº¯ÊýÖ¸ÕëÀ´±È½Ï²»Í¬ÀàÐ͵ıäÁ¿£¬ËùÒÔqsort¿ÉÒÔ¶Ô²»Í¬ÀàÐ͵ıäÁ¿Êý×é½øÐÐÅÅÐò¡£ ÎÒÃǹÃÇÒ³ÆÕâÖÖÓ¦ÓÃΪ\´ÓÄÚ²¿µ÷ÓÃÄÚ²¿µÄº¯ÊýÖ¸Õë\¡£ 3¡¢µ÷ÓÃÍⲿµÄº¯Êý
Ò²ÐíÄã»áÎÊ£¬ÓÃAPI²»¾ÍÊǵ÷ÓÃÍⲿµÄº¯ÊýÂð£¿Êǵ쬵«ÓÐʱºòÎÒÃÇ»¹ÊÇÐèÒªÖ±½Ó»ñÈ¡Íⲿº¯ÊýµÄÖ¸Õë¡£±ÈÈçͨ¹ýLoadLibrary¶¯Ì¬¼ÓÔØDLL£¬È»ºóÔÙͨ¹ýGetProcAddressµÃµ½ÎÒÃÇÐèÒªµÄº¯ÊýÈë¿ÚÖ¸Õ룬ȻºóÔÙͨ¹ýÕâ¸öº¯ÊýÖ¸ÕëÀ´µ÷ÓÃÍⲿµÄº¯Êý£¬ÕâÖÖ¶¯Ì¬ÔØÈëDLLµÄ¼¼Êõ¿ÉÒÔÈÃÎÒÃǸüÁé»îµÄµ÷ÓÃÍⲿº¯Êý¡£
ÎÒÃdzÆÕâÖÖ·½Ê½Îª\´ÓÄÚ²¿µ÷ÓÃÍⲿµÄº¯ÊýÖ¸Õë\
4¡¢²»ÓÃ˵£¬¾ÍÊÇÎÒÃÇÒ²¿É¿ØÖÆ\´ÓÍⲿµ÷ÓÃÍⲿµÄº¯ÊýÖ¸Õë\¡£²»ÊÇûÓУ¬±ÈÈçÎÒÃÇ¿ÉÒÔ¼ÓÔØ¶à¸öDLL£¬½«ÆäÖÐÒ»¸öDLLÖеĺ¯ÊýÖ¸Õë´«µ½ÁíÒ»¸öDLLÀïµÄº¯ÊýÄÚ¡£ ÉÏÃæËù·ÖµÄ\ÄÚ\ºÍ\Íâ\¶¼ÊÇÏà¶Ô¶øÑÔ£¨DLLʵ¼ÊÉÏ»¹ÊÇÔÚ½ø³ÌÄÚ£©£¬ÕâÑù·ÖÀàÓÐÖúÓÚÒÔºóÎÒÃÇ̸ÎÊÌ⣬Çë¼ÇסÎÒÉÏÃæµÄ·ÖÀ࣬ÒòΪÒÔºóµÄÎÄÕÂÒ²»áÓõ½Õâ¸ö·ÖÀàÀ´·ÖÎöÎÊÌâ¡£
º¯ÊýÖ¸ÕëµÄʹÓò»ÍâºõÉÏÃæËÄÖÖ·½Ê½¡£µ«ÔÚʵ¼ÊʹÓÃÖÐÈ´ÊÇÁé»î¶à±äµÄ¡£±ÈÈçÔÚC++Àï¼Ì³ÐºÍ¶à̬£¬ÔÚCOMÀïµÄ½Ó¿Ú£¬¶¼ÊÇÒ»ÖÖ½ÐvTableµÄº¯ÊýÖ¸Õë±íµÄÇÉÃîÓ¦Óá£Ê¹Óú¯ÊýÖ¸Õ룬¿ÉÒÔʹ³ÌÐòµÄ´¦Àí·½Ê½¸ü¼Ó¸ßЧ¡¢Áé»î¡£
VBÎĵµÀï³ýÁ˽éÉܹýµÚÒ»·½Ê½Í⣬¶ÔÆäËü·½Ê½¶¼Ã»ÓнéÉÜ£¬²¢ÇÒ»¹Ã÷È·Ö¸³ö²»Ö§³Ö¡°Basic µ½ Basic¡±µÄº¯ÊýÖ¸Õ루Ҳ¾ÍÊÇÉÏÃæËµµÄµÚ¶þÖÖ·½Ê½£©£¬Êµ¼ÊÉÏ£¬Í¨¹ýÒ»¶¨µÄHACK£¬ÉÏÃæËÄÖÖ·½Ê½¾ù¿ÉÒÔʵÏÖ¡£½ñÌ죬ÎÒÃǾÍÀ´¿´¿´ÈçºÎÀ´ÊµÏÖµÚ¶þÖÖ·½Ê½£¬ÒòΪʵÏÖËüÏà¶ÔÀ´Ëµ±È½Ï¼òµ¥£¬ÎÒÃÇÏÈ´Ó¼òµ¥µÄÈëÊÖ¡£ÖÁÓÚÈçºÎÔÚVBÄÚµ÷ÓÃÍⲿµÄº¯ÊýÖ¸Õ룬ÈçºÎÔÚVBÀïͨ¹ý´¦ÀívTable½Ó¿Úº¯ÊýÖ¸ÕëÌø×ª±íÀ´ÊµÏÖ¸÷ÖÖº¯ÊýÖ¸ÕëµÄÇÉÃîÓ¦Óã¬ÓÉÓÚÕâ½«Éæ¼°COMÄÚ²¿ÔÀí£¬ÎÒ½«ÁíÎÄÏêÊö¡£
ÆäʵVBµÄÎĵµ²¢Ã»ÓÐ˵´í£¬VBµÄÈ·²»Ö§³Ö¡°Basic µ½ Basic¡±µÄº¯ÊýÖ¸Õ룬µ«ÊÇÎÒÃÇ¿ÉÒÔÈÆ¸öÍä×ÓÀ´ÊµÏÖ£¬ÄǾÍÊÇÏÈ´Ó\µ½API\£¬È»ºóÔÙÓõÚÒ»ÖÖ·½Ê½\Íⲿµ÷ÓÃÄÚ²¿µÄº¯ÊýÖ¸Õë\À´´Ó\µ½BASIC\£¬ÕâÑù¾Í´ïµ½Á˵ڶþÖÖ·½Ê½´Ó\µ½ Basic\µÄÄ¿µÄ£¬ÕâÖÖ¼¼ÊõÎÒÃÇ¿ÉÒÔ³ÆÖ®Îª\Ç¿ÖÆ»Øµ÷\£¬Ö»ÓÐVBÀï²Å»áÓÐÕâÖֹŹֵļ¼Êõ¡£
˵µÃÓеãÈÆ¿Ú£¬µ«ÊÇ×ÐϸÏëÏë´°¿Ú×ÓÀàÅÉÉú¼¼ÊõÀïCallWindowProc£¬ÎÒÃÇ¿ÉÒÔÓÃCallWindowProcÀ´Ç¿ÖÆÍⲿµÄ²Ù×÷ϵͳµ÷ÓÃÎÒÃÇÔÀ´µÄ±£´æµÄ´°¿Úº¯ÊýÖ¸Õ룬ͬÑùÎÒÃÇÒ²ÍêÈ«¿ÉÒÔÓÃËüÀ´Ç¿ÖƵ÷ÓÃÎÒÃÇÄÚ²¿µÄº¯ÊýÖ¸Õë¡£
ºÇºÇ£¬Ç°ÃæËµ¹ýÒªÉÙ½²ÔÀí¶à½²ÕÐʽ£¬ÏÖÔÚÎÒÃǾÍÀ´¿ªÊ¼Ñ§Ï°ÕÐʽ°É£¡
¿¼ÂÇÎÒÃÇÔÚVBÀïÀ´ÊµÏÖºÍCÀïÒ»ÑùÖ§³Ö¶à¹Ø¼ü×ֱȽϵÄqsort¡£ÍêÕûµÄÔ´´úÂë¼û±¾ÎÄÅäÌ×´úÂ룬´Ë´¦½ö¸ø³öº¯ÊýÖ¸ÕëÓ¦ÓÃÏà¹ØµÄ´úÂë¡£ 'µ±È»ÉÙ²»Á˵ÄCopyMemory£¬²»ÓÃANYµÄ°æ±¾¡£ Declare Sub CopyMemory Lib \
\ ByVal numBytes As Long)
'ºÙºÙ£¬¿´ÏÂÃæÊÇÈçºÎ½«CallWindowProcµÄÉùÃ÷×ö³ÉCompareÉùÃ÷µÄ¡£ Declare Function Compare Lib \
\ ByVal pElem2 As Long, ByVal unused1 As Long, _ ByVal unused2 As Long) As Integer
'×¢£ºByVal xxxxx As Long £¬»¹¼ÇµÃ°É£¡ÕâÊDZê×¼µÄÖ¸ÕëÉùÃ÷·½·¨¡£
23
'ÉùÃ÷ÐèÒª±È½ÏµÄÊý×éÔªËØµÄ½á¹¹ Public Type TEmployee Name As String Salary As Currency End Type
'ÔÙÀ´¿´¿´ÎÒÃǵıȽϺ¯Êý 'ÏȰ´Ð½Ë®±È½Ï£¬ÔÙ°´ÐÕÃû±È½Ï
Function CompareSalaryName(Elem1 As TEmployee, _
Elem2 As TEmployee, _ unused1 As Long, _
unused2 As Long) As Integer Dim Ret As Integer
Ret = Sgn(Elem1.Salary - Elem2.Salary) If Ret = 0 Then
Ret = StrComp(Elem1.Name, Elem2.Name, vbTextCompare) End If
CompareSalaryName = Ret End Function
'ÏȰ´ÐÕÃû±È½Ï£¬ÔÙ°´Ð½Ë®±È½Ï
Function CompareNameSalary(Elem1 As TEmployee, _ Elem2 As TEmployee, _ unused1 As Long, _
unused2 As Long) As Integer Dim Ret As Integer
Ret = StrComp(Elem1.Name, Elem2.Name, vbTextCompare) If Ret = 0 Then
Ret = Sgn(Elem1.Salary - Elem2.Salary) End If
CompareNameSalary = Ret End Function
×îºóÔÙ¿´¿´ÎÒÃÇÀ´¿´¿´ÎÒÃÇ×îÖÕµÄqsortµÄÉùÃ÷¡£
Sub qsort(ByVal ArrayPtr As Long, ByVal nCount As Long, _
ByVal nElemSize As Integer, ByVal pfnCompare As Long)
ÉÏÃæµÄArrayPtrÊÇÐèÒªÅÅÐòÊý×éµÄµÚÒ»¸öÔªËØµÄÖ¸Õ룬nCountÊÇÊý×éµÄÔªËØ¸öÊý£¬nElemSizeÊÇÿ¸öÔªËØ´óС£¬pfnCompare¾ÍÊÇÎÒÃǵıȽϺ¯ÊýÖ¸Õë¡£Õâ¸öÉùÃ÷ºÍC¿âº¯ÊýÀïµÄqsortÊǼ«ÎªÏàËÆµÄ¡£
ºÍCÒ»Ñù£¬ÎÒÃÇÍêÈ«¿ÉÒÔ½«BasicµÄº¯ÊýÖ¸Õë´«µÝ¸øBasicµÄqsortº¯Êý¡£ ʹÓ÷½Ê½ÈçÏ£º
Dim Employees(1 To 10000) As TEmployee
'¼ÙÉèÏÂÃæµÄµ÷ÓöÔEmployeesÊý×é½øÐÐÁ˸³Öµ³õʼ»¯¡£ Call InitArray()
'ÏÖÔھͿÉÒÔµ÷ÓÃÎÒÃǵÄqsortÀ´½øÐÐÅÅÐòÁË¡£
24
Call qsort(VarPtr(Employees(1)), UBound(Employees), _
LenB(Employees(1)), AddressOf CompareSalaryName) '»òÕßÏȰ´ÐÕÃûÅÅ£¬ÔÙ°´Ð½Ë®ÅÅ
Call qsort(VarPtr(Employees(1)), UBound(Employees), _
LenB(Employees(1)), AddressOf CompareNameSalary)
´ÏÃ÷µÄÅóÓÑÃÇ£¬ÄãÃÇÊDz»ÊÇÒѾ¿´³öÕâÀïµÄ°ÂÃîÁËÄØ£¿×÷Ϊһ¸ö²âÑ飬ÄãÄÜÏÖÔھ͸ø³öÔÚqsortÀïʹÓú¯ÊýÖ¸ÕëµÄ·½·¨Â𣿱ÈÈçÏÖÔÚÎÒÃÇҪͨ¹ýµ÷Óú¯ÊýÖ¸ÕëÀ´±È½ÏÊý×éµÄµÚi¸öÔªËØºÍµÚj¸öÔªËØµÄ´óС¡£
û´í£¬µ±È»ÒªÊ¹ÓÃÇ°ÃæÉùÃ÷µÄCompare£¨Æäʵ¾ÍÊÇCallWindowProc£©Õâ¸öAPIÀ´½øÐÐÇ¿ÖÆ»Øµ÷¡£
¾ßÌåµÄʵÏÖÈçÏ£º
Sub qsort(ByVal ArrayPtr As Long, ByVal nCount As Long, _
ByVal nElemSize As Integer, ByVal pfnCompare As Long) Dim i As Long, j As Long
'ÕâÀïÊ¡ÂÔ¿ìËÙÅÅÐòËã·¨µÄ¾ßÌåʵÏÖ£¬½ö¸ø³ö±È½ÏÁ½¸öÔªËØµÄ·½·¨¡£ If Compare(pfnCompare, ArrayPtr + (i - 1) * nElemSize, _ ArrayPtr + (j - 1) * nElemSize, 0, 0) > 0 Then
'Èç¹ûµÚi¸öÔªËØ±ÈµÚj¸öÔªËØ´óÔòÓÃCopyMemoryÀ´½»»»ÕâÁ½¸öÔªËØ¡£ End IF End Sub
ÕÐʽ½éÉÜÍêÁË£¬Ã÷°×ÁËÂð£¿ÎÒÔÙÀ´¼òµ¥µØ½²½âÒ»ÏÂÉÏÃæCompareµÄÒâ˼£¬Ëü·Ç³£ÇÉÃîµØÀûÓÃÁËCallWindowProcÕâ¸öAPI¡£Õâ¸öAPIÐèÒªÎå¸ö²ÎÊý£¬µÚÒ»¸ö²ÎÊý¾ÍÊÇÒ»¸öÆÕͨµÄº¯ÊýÖ¸Õ룬Õâ¸öAPIÄܹ»Ç¿ÂíÉϻص÷Õâ¸öº¯ÊýÖ¸Õ룬²¢½«Õâ¸öAPIµÄºóËĸöLongÐ͵IJÎÊý´«µÝ¸øÕâ¸öº¯ÊýÖ¸ÕëËùÖ¸ÏòµÄº¯Êý¡£Õâ¾ÍÊÇΪʲôÎÒÃǵıȽϺ¯Êý±ØÐëÒªÓÐËĸö²ÎÊýµÄÔÒò£¬ÒòΪCallWindowProcÕâ¸öAPIÒªÇ󴫵ݸøµÄº¯ÊýÖ¸Õë±ØÐë·ûºÏWndProcº¯ÊýÔÐΣ¬WndProcµÄÔÐÎÈçÏ£º
LRESULT (CALLBACK* WNDPROC) (HWND, UINT, WPARAM, LPARAM);
ÉÏÃæµÄLRESULT¡¢HWND¡¢UINT¡¢WPARAM¡¢LPARAM¶¼¿ÉÒÔ¶ÔÓ¦ÓÚVBÀïµÄLongÐÍ£¬ÕâÕæÊÇÌ«ºÃÁË£¬ÒòΪLongÐÍ¿ÉÒÔÓÃÀ´×÷Ö¸ÕëÂ
ÔÙÀ´¿´¿´¹¤×÷Á÷³Ì£¬µ±ÎÒÃÇÓÃAddressOf CompareSalaryName×öΪº¯ÊýÖ¸Õë²ÎÊýÀ´µ÷ÓÃqsortʱ£¬qsortµÄÐβÎpfnCompare±»¸³Öµ³ÉÁËʵ²ÎCompareSalaryNameµÄº¯ÊýÖ¸Õë¡£Õâʱ£¬µ÷ÓÃCompareÀ´Ç¿Öƻص÷pfnCompare£¬¾ÍÏ൱ÓÚµ÷ÓÃÁËÈçϵÄVBÓï¾ä£º Call CompareSalaryName(ArrayPtr + (i - 1) * nElemSize, _ ArrayPtr + (j - 1) * nElemSize, 0, 0)
Õâ²»»áÒýÆð²ÎÊýÀàÐͲ»·û´íÎóÂð£¿CompareSalaryNameµÄǰÁ½¸ö²ÎÊý²»ÊÇTEmployeeÀàÐÍÂ𣿵ÄÈ·£¬ÔÚVBÀïÕâÑùµ÷ÓÃÊDz»Ðеģ¬ÒòΪVBµÄÀàÐͼì²é²»»áÔÊÐíÕâÑùµÄµ÷Óᣵ«ÊÇ£¬Êµ¼ÊÉÏÕâ¸öµ÷ÓÃÊÇAPI½øÐеĻص÷£¬¶øVB²»¿ÉÄÜÈ¥¼ì²éAPI»Øµ÷µÄº¯ÊýµÄ²ÎÊýÀàÐÍÊÇÒ»¸öÆÕͨµÄLongÊýÖµÀàÐÍ»¹ÊÇÒ»¸ö½á¹¹Ö¸Õ룬ËùÒÔÒ²¿ÉÒÔ˵ÎÒÃÇÈÆ¹ýÁËVB¶Ôº¯Êý²ÎÊýµÄÀàÐͼì²é£¬ÎÒÃÇ¿ÉÒÔ½«Õâ¸öLongÐͲÎÊýÉùÃ÷³ÉÈκÎÀàÐ͵ÄÖ¸Õ룬ÎÒÃÇÉùÃ÷³Éʲô£¬VB¾ÍÈÏΪÊÇʲô¡£ËùÒÔ£¬ÎÒÃÇҪСÐĵØÊ¹ÓÃÕâÖÖ¼¼Êõ£¬ÈçÉÏÃæ×îÖջᴫµÝ¸øCompareSalaryNameº¯ÊýµÄ²ÎÊý\Ö»²»¹ýÊÇÒ»¸öµØÖ·£¬VB²»»á¶ÔÕâ¸öµØÖ·½øÐмì²é£¬Ëü×ÜÊǽ«Õâ¸öµØÖ·µ±×öÒ»¸öTEmployeeÀàÐ͵ÄÖ¸Õ룬Èç¹û²»Ð¡ÐÄÓóÉÁË\+ i *
25
nElemSize\£¬ÄÇôµ±iÊÇ×îºóÒ»¸öÔªËØÊ±£¬ÎÒÃǾͻáÒýÆðÄÚ´æÔ½È¨·ÃÎÊ´íÎó£¬ËùÒÔÎÒÃÇÒªºÍÔÚCÀï´¦ÀíÖ¸ÕëÒ»Ñù×¢Òâ±ß½çÎÊÌâ¡£
º¯ÊýÖ¸ÕëµÄÇÉÃîÓ¦ÓÃÕâÀïÒѾ¿É¼ûÒ»°ßÁË£¬µ«ÊÇÕâÀï½éÉܵķ½·¨»¹ÓкܴóµÄ¾ÖÏÞÐÔ£¬ÎÒÃǵĺ¯Êý±ØÐëÒªÓÐËĸö²ÎÊý£¬¸ü¸É¾»µÄ×ö·¨»¹ÊÇÔÚVC»òDelphiÀïдһ¸öDLL£¬×ö³ö¸ü¼Ó·ûºÏÒªÇóµÄAPIÀ´ÊµÏÖºÍCallWindowProcÏàËÆµÄ¹¦ÄÜ¡£ÎÒ¸ú×Ù¹ýCallWindowProcµÄÄÚ²¿ÊµÏÖ£¬ËüÒª×öÐí¶àºÍ´°¿ÚÏûÏ¢Ïà¹ØµÄ¹¤×÷£¬ÕâЩ¹¤×÷ÔÚÎÒÃÇÕâ¸öÓ¦ÓÃÖÐÊǶàÓàµÄ¡£ÆäʵʵÏÖÇ¿ÖÆ»Øµ÷APIÖ»ÐèÒª½«ºó¼¸¸ö²ÎÊýѹջ£¬ÔÙcallµÚÒ»¸ö²ÎÊý¾ÍÐÐÁË£¬²»¹ý¼¸Ìõ»ã±àÖ¸Áî¶øÒÑ¡£ ÕýÊÇÒòΪCallWindowProcµÄ¾ÖÏÞÐÔ£¬ÎÒÃDz»Äܹ»ÓÃËüÀ´µ÷ÓÃÍⲿµÄº¯ÊýÖ¸Õ룬ÒÔʵÏÖÉÏÃæËµµÄµÚÈýÖÖº¯ÊýÖ¸Õëµ÷Ó÷½Ê½¡£ÒªÊµÏÖµÚÈýÖÖ·½Ê½£¬Matt Curland´óʦÌṩÁËÒ»¸öجÃÎÒ»°ãµÄHACK·½Ê½£¬ÎÒÃÇÒªÔÚVBÀïÆ¾¿Õ¹¹ÔìÒ»¸öIUnknown½Ó¿Ú£¬ÔÚIUnknown½Ó¿ÚµÄvTableÔÓеÄÈý¸öÈë¿ÚºóÔÙ¼ÓÈëÒ»¸öÐÂÈë¿Ú£¬ÔÚÐÂÈë¿ÚÀï²åÈë»úÆ÷´úÂ룬Õâ¸ö»úÆ÷´úÂëÒª´¦ÀíµôthisÖ¸Õ룬×îºó²ÅÄܵ÷Óõ½ÎÒÃǸøµÄº¯ÊýÖ¸Õ룬Õâ¸öº¯ÊýÖ¸ÕëÎÞÂÛÊÇÄÚ²¿µÄ»¹ÊÇÍⲿµÄ¶¼Ò»ÑùûÎÊÌâ¡£ÔÚÎÒÃÇÉîÈëÌÖÂÛCOMÄÚ²¿ÔÀíʱÎÒ»áÔÙÀ´Ì¸Õâ¸ö·½·¨¡£
ÁíÍ⣬ÅÅÐòËã·¨ÊǸö¼ûÈʼûÖǵÄÎÊÌ⣬ÎÒ±¾À´Ï룬ÔÚ±¾ÎÄÌṩһ¸ö×îͨÓÃÐÔÄÜ×îºÃµÄËã·¨£¬ÕâÖÖÏë·¨ËäºÃ£¬µ«ÊDz»¿ÉÄÜÓÐÔÚÈκÎÇé¿ö϶¼¡°×îºÃ¡±µÄËã·¨¡£±¾ÎÄÌṩµÄÓø÷ÖÖÖ¸Õë¼¼ÊõÀ´ÊµÏֵĿìËÙÅÅÐò·½·¨£¬Ó¦¸Ã±ÈÓöÔÏó¼¼ÊõÀ´ÊµÏÖͬÑù¹¦Äܿ첻ÉÙ£¬ÄÚ´æÕ¼ÓÃÒ²Éٵöࡣ¿ÉÊǾÍÊÇÕâ¸öÒѾ¾¹ýÁËÎÒ²»ÉÙÓÅ»¯µÄ¿ìËÙÅÅÐòËã·¨£¬»¹ÊDZȲ»ÁËShellSort£¬ÒòΪShellSortʵÏÖÉϼòµ¥¡£´ÓËã·¨µÄÀíÂÛÉÏÀ´½²qsortÓ¦¸Ã±ÈShellSortƽ¾ùÐÔÄܺ㬵«ÊÇÔÚVBÀïÕâ²»Ò»¶¨£¨¿É¼û±¾ÎÄÅäÌ×´úÂ룬ÀïÃæÒ²ÌṩÁËVBPJһƪרÀ¸µÄÅäÌ×´úÂëShellSort£¬·Ç³£µÃ°ô£¬±¾ÎĵÄ˼Ïë¾ÍÈ¡×ÔÕâ¸öShellSort£©¡£
µ«ÊÇÓ¦µ±Ö¸³öÎÞÂÛÊÇÕâÀïµÄ¿ìËÙÅÅÐò»¹ÊÇShellSort£¬¶¼»¹¿ÉÒÔ´ó´ó¸Ä½ø£¬
ÒòΪËüÃÇÔÚʵÏÖÉÏÐèÒª´óÁ¿Ê¹ÓÃCopyMemroyÀ´¿½±´Êý¾Ý£¨ÕâÊÇVBÀïʹÓÃÖ¸ÕëµÄȱµãÖ®Ò»£©¡£Æäʵ£¬ÎÒÃÇ»¹ÓиüºÃµÄ·½·¨£¬ÄǾÍÊÇHackÒ»ÏÂVBµÄÊý×é½á¹¹£¬Ò²¾ÍÊÇCOM×Ô¶¯»¯ÀïµÄSafeArray£¬ÎÒÃÇ¿ÉÒÔÒ»´ÎÐԵĽ«SafeArrayÀïµÄ¸÷¸öÊý×éÔªËØµÄÖ¸Õë·Åµ½Ò»¸ölongÐÍÊý×éÀÎÒÃÇÎÞÐèCopyMemroy£¬ÎÒÃǽöÐè½»»»LongÐÍÊý×éÀïµÄÔªËØ¾Í¿ÉÒԴﵽʵʱµØ½»»»SafeArrayÊý×éÔªËØÖ¸ÕëµÄÄ¿µÄ£¬Êý¾Ý²¢Ã»ÓÐÒÆ¶¯£¬Òƶ¯µÄ½ö½öÊÇÖ¸Õ룬¿ÉÒÔÏëÏóÕâÓпì¶à¡£ÔÚÏÂһƪÎÄÕ¡¶VBÖ¸Õë¿û»¨±¦µäÖ®Êý×éÖ¸Õë¡·ÖÐÎÒ»áÀ´½éÉÜÕâÖÖ·½·¨¡£
26
VBÕæÊÇÏë²»µ½ÏµÁÐÖ®ËÄ£ºVBÖ¸Õë¿û»¨±¦µäÖ®SafeArray
¹Ø¼ü×Ö£ºVB¡¢HCAK¡¢Ö¸Õë¡¢SafeArray¡¢Êý×éÖ¸Õ롢ЧÂÊ¡¢Êý×é¡¢ÅÅÐò ÄѶȣºÖм¶»ò¸ß¼¶
ÒªÇó£ºÊìϤVB£¬Á˽â»ù±¾µÄÅÅÐòËã·¨£¬»áÓÃVC¸üºÃ¡£
ÒýÑÔ£º
ÉÏ»ØËµµ½£¬ËäȻָÕëµÄÔËÓÃÈÃÎÒÃǵÄÊý×éÅÅÐòÔÚÐÔÄÜÉÏÓÐÁË´ó´óµÄÌá¸ß£¬µ«ÊÇCopyMemoryʼÖÕÊÇÎÒÃÇÐÄÀïÒ»¸ö»ÓÖ®²»È¥µÄÒõÓ°£¬ÒòΪËü»¹ÊÇÌ«Âý¡£ÔÚCÀïÎÒÃÇÓÃÖ¸Õ룬´ÓÀ´¶¼ÊÇÀ´È¥×ÔÈç£¬ËæÐÄËùÓû£¬ËÄÁ½²¦Ç§½ï£»¶øÔÚVBÀÎÒÃÇÓÃÖ¸ÕëȴҪհǰ¹Ëºó£¬ÄÄÅÂÒ»¸ö×Ö½Ú¶¼ÒªÓõ½CopyMemoryǬÀ¤´óÅ²ÒÆ£¬ÕæÀÛ¡£½ñÌìÎÒÃǾÍÀ´¿´¿´£¬Äܲ»ÄÜÈÃVBÀïµÄÖ¸ÕëÒ²ÄÜÖ¸ÄĶù´òÄĶù£¬Ñ§Ñ§VBÖ¸ÕëµÄÁ貨΢²½¡£ ¸÷λ¿´¹Ù£¬Äú°Ñ²è¶ËºÃÁË¡£
Ò»¡¢°ïVB×öµãCOM¼ÒÎñÊ ±¾ÏµÁпªÕŵÚһƪÀÎÒ¾ÍÔøËµ¹ýVBµÄ³É¹¦ÓÐÒ»°ëµÄ¹¦ÀÍÒª¼Çµ½COM¿ª·¢Ð¡×éÉíÉÏ£¬COM¿ÉÊÇM$¹«Ë¾´òµÄÒ»ÊÖºÃÅÆ£¬´ÓOLEµ½COM+£¬COMÊǽüÊ®ÄêÀ´M$×î³É¹¦¼¼ÊõÖ®Ò»£¬ËùÒÔÓбØÒªÔÙ´µËü¼¸¾ä¡£
COM×é¼þ¶ÔÏóÄ£Ð;ÍÊÇVBµÄ»ù´¡£¬Varinat¡¢String¡¢Current¡¢DateÕâЩÊý¾ÝÀàÐͶ¼ÊÇCOMµÄ£¬ÎÒÃÇÓõÄCStr¡¢CInt¡¢CSngµÈCxxxº¯Êý¸ù±¾¾ÍÊÇCOM¿ª·¢Ð¡×éдµÄ£¬ÉõÖÁÎÒÃÇÔÚVBÀïÓõÄÊýѧº¯Êý£¬COMÀï¶¼ÓжÔÓ¦µÄVarxxxDiv¡¢VarxxxAdd£¬VarxxxAbs¡£ºÙºÙ£¬VB¿ª·¢Ð¡×é·Ç³£´ÏÃ÷¡£ÎÒÃÇÒ²¿ÉÒÔ˵COMµÄ³É¹¦Ò²ÓÐVB¿ª·¢Ð¡×éºÍÌìÏÂÎÞÊýVB³ÌÐòÔ±µÄ¹¦ÀÍ£¬Bill´óÊåÓ¢Ã÷µØ½«COMºÍVBÀ¦°óÔÚÒ»ÆðÁË¡£
ËùÒÔ˵£¬Ñ§VB¶ø²»ÐèÒªÁ˽âCOM£¬ÄãÊÇÐÒ¸£µÄ£¬ÄãÏíÊÜ×ÅVB´ø¸øÄãµÄÇáËÉдÒ⣬Ëý°ÑÄÇЩËöËéµÄ¼ÒÎñʶ¼¸ÉÁË£¬µ«Í¬Ê±ÄãÓÖÊDz»Ðҵģ¬ÒòΪÄã´ÓÀ´¶¼²»ÔøÁ˽âÄã°®µÄVB£¬ÈôÓÐÒ»ÌìVB¶ÔÄã·¢ÁËÆ¢Æø£¬ÄãÉõÖÁ²»Öª¸ÃÈçºÎÈ¥°²Î¿Ëý¡£ËùÒÔ£¬±¾ÏµÁÐÎÄÕ½«Äóö¼¸´óƪÀ´½Ì´ó¼ÒÈçºÎ°ïVB×öµãCOM·½ÃæµÄ¼ÒÎñÊ£¬ÒÔ±¸²»Ê±Ö®Ðè¡£
ÏëÒ»¿ÚÆøÑ§»áËùÓÐCOM¼ÒÎñÊ£¬²»ÈÝÒ×£¬½ñÌìÎÒÃÇÏÈÄÃÊý×éÀ´¿ª¸öÍ·£¬¸ü¶àµÄ¼¼ÊõÎÒÒÔºóÔÙÒ»Ò»µÀÀ´¡£
¶þ¡¢COM×Ô¶¯»¯ÀïµÄSafeArray
¾ÍÏóÏ´Ò»ú¡¢µç·¹±¤¡¢´µ³¾Æ÷£¬VBÏ´Ò·þ¡¢×ö·¹¡¢´òɨÎÀÉú¶¼»áÓõ½COM×Ô¶¯»¯¡£Ëü°üº¬ÁËÒ»ÇÐCOMÀïͨÓõĶ«Î÷£¬ËùÓеÄÅ®È˶¼ÄÜÓÃCOM×Ô¶¯»¯À´¸É¼ÒÎñ£¬ÎÞÂÛÊÇϬÀûµÄVC¡¢ÎÂÈáµÄVB¡¢»¹ÊÇСÇɵÄVBScript£¬ËýÃǶ¼ÄÜÓÃCOM×Ô¶¯»¯£¬»¹ÄÜͨ¹ýCOM×Ô¶¯»¯Ïл°¼Ò³£¡¢½»Á÷¸ÐÇé¡£ÕâÊÇÒòΪCOM×Ô¶¯»¯ÌṩÁËÒ»ÖÖͨÓõÄÊý¾Ý½á¹¹ºÍÊý¾Ýת»»´«µÝµÄ·½Ê½¡£¶øVBµÄÊý¾Ý½á¹¹»ù±¾ÉϾÍÊÇCOM×Ô¶¯»¯µÄÊý¾Ý½á¹¹£¬±ÈÈçVBÀïµÄÊý×飬ÔÚCOMÀï½Ð×öSafeArray¡£ËùÒÔÔÚVBÀï´¦ÀíÊý×éʱÎÒÃÇÒªÇå³þµÄÖªµÀÎÒÃÇÊÇÔÚ´¦ÀíSafeArray£¬COMÀïµÄÒ»ÖÖ°²È«µÄÊý×é¡£
×¼±¸Ï³ø£¬À´×öÒ»µÀÊý×éÖ¸ÕëÅÅÐòµÄ²Ë£¬ÔÚ¿´Ö÷ÁÏSafeArrayµÄÕæÊµ½á¹¹Õâǰ£¬ÏÈÈÃÎÒÃÇÀ´Á˽âÒ»ÏÂCÀïµÄÊý×é¡£
ÔÚCºÍC++ÀïÒ»¸öÊý×éÖ¸ÕëºÍÊý×éµÚÒ»¸öÔªËØµÄÖ¸ÕëÊÇÒ»»ØÊ£¬Èç¶ÔÏ£º #include
27
cout << \
cout << \ } ///:~
¿ÉÒÔ¿´µ½½á¹ûaºÍ&a[0]ÊÇÏàͬµÄ£¬ÕâÀïµÄÊý×éÊDzÅÊý¾Ý½á¹¹ÀïÕæÊµÒâÒåÉϵÄÊý×飬ËüÃÇÔÚÄÚ´æÀïÒ»¸ö½Ó×ÅÒ»¸ö´æ·Å£¬ÎÒÃÇͨ¹ýµÚÒ»¸öÔªËØ¾ÍÄÜ·ÃÎÊËæºóµÄÔªËØ£¬ÎÒÃÇ¿ÉÒÔ³ÆÕâÑùµÄÊý×éΪ\ÕæÊý×é\¡£µ«ÊÇËü²»°²È«£¬ÒòΪÎÒÃÇÎÞ·¨´ÓÕâÖÖÕæÊý×éµÄÖ¸ÕëÉϵÃÖªÊý×éµÄάÊý¡¢ÔªËظöÊýµÈ·Ç³£ÖØÒªµÄÐÅÏ¢£¬ËùÒÔÒ²ÎÞ·¨¿ØÖƶÔÕâÖÖÊý×éµÄ·ÃÎÊ¡£ÎÒÃÇ¿ÉÒÔÔÚCÀォһ¸ö¶þάÊý×éµ±×öһάÊý×éÀ´´¦Àí£¬ÎÒÃÇ»¹¿ÉÒÔͨ¹ýÒ»¸ö³¬¹ýÊý×é´óСµÄË÷ÒýÈ¥·ÃÎÊÊý×éÍâµÄÄڴ棬µ«ÕâЩ¶¼ÊǼ«²»°²È«µÄ£¬Êý×é±ß½ç´íÎó¿ÉÒÔ˵ÊÇCÀïÒ»¸ö·Ç³£ÈÝÒ×·¸È´²»Ò×·¢ÏֵĴíÎó¡£
Òò´Ë¾ÍÓÐÁËCOMÀïµÄSafeArray°²È«Êý×éÀ´½â¾öÕâ¸öÎÊÌ⣬ÔÚVBÀïÎÒÃÇ´«µÝÒ»¸öÊý×éʱ£¬´«µÝµÄʵ¼ÊÉÏCOMÀïµÄSafeAraay½á¹¹Ö¸¹¹µÄÖ¸Õ룬SafeAraay½á¹¹Ñù×ÓÈçÏ£º Private Type SAFEARRAY
cDims As Integer 'Õâ¸öÊý×éÓм¸Î¬£¿ fFeatures As Integer 'Õâ¸öÊý×éÓÐÊ²Ã´ÌØÐÔ£¿
cbElements As Long 'Êý×éµÄÿ¸öÔªËØÓжà´ó£¿ cLocks As Long 'Õâ¸öÊý×é±»Ëø¶¨¹ý¼¸´Î£¿
pvData As Long 'Õâ¸öÊý×éÀïµÄÊý¾Ý·ÅÔÚʲôµØ·½£¿ 'rgsabound() As SFArrayBOUND End Type
½ô½ÓÔÚpvDataÕâºóµÄrgsaboundÊǸöÕæÊý×飬ËùÒÔ²»ÄÜÔÚÉÏÃæµÄ½á¹¹ÀïÓÃVBÊý×éÀ´ÉùÃ÷£¬¼Çס£¬ÔÚVBÀïµÄÊý×é¶¼ÊÇSafeArray£¬ÔÚVBÀïûÓÐÉùÃ÷ÕæÊý×éµÄ·½·¨¡£ ²»¹ýÕâ²»ÊÇÎÊÌ⣬ÒòΪÉÏÃæSFArrayBOUND½á¹¹µÄÕæÊý×éÔÚÕû¸öSAFEARRAY½á¹¹µÄλÖÃÊDz»±äµÄ£¬×ÜÊÇÔÚ×îºó£¬ÎÒÃÇ¿ÉÒÔÓÃÖ¸ÕëÀ´·ÃÎÊËü¡£SFArrayBOUNDÊý×éµÄÔªËØ¸öÊýÓÐcDims¸ö£¬Ã¿Ò»¸öÔªËØ¼Ç¼×ÅÒ»¸öÊý×éάÊýµÄÐÅÏ¢£¬ÏÂÃæ¿´¿´ËüµÄÑù×Ó£º Private Type SAFEARRAYBOUND
cElements As Long 'ÕâһάÓжàÉÙ¸öÔªËØ£¿ lLbound As Long 'ËüµÄË÷Òý´Ó¼¸¿ªÊ¼£¿ End Type
»¹ÓÐÒ»¸ö¶«Î÷û˵Ç壬ÄǾÍÊÇÉÏÃæSAFEARRAY½á¹¹ÀïµÄfFeatures£¬ËüÊÇÒ»×é±ê־λÀ´±íʾÊý×éÓÐÄÇЩ´ýÐÔ£¬ÕâÐ©ÌØÐԵıêÖ¾²¢²»ÐèÒª×ÐϸµÄÁ˽⣬±¾ÎÄÓò»ÉÏÕâЩ£¬ºóÃæµÄÎÄÕÂÓõ½ËüÃÇʱÎÒ»áÔÙÀ´½âÊÍ¡£
¿´ÁËÉÏÃæµÄ¶«Î÷£¬¸÷λһ¶¨ºÜÍ·´ó£¬ºÃÔÚ±¾ÎĵϹÓò»ÁËÕâô¶à¶«Î÷£¬¿´Íê±¾ÎÄÄã¾ÍÖªµÀÆäʵSafeArrayÒ²²»ÄÑÀí½â¡£ÏÈÀ´¿´¿´ÈçϵÄÉùÃ÷£º Dim MyArr(1 To 8, 2 To 10) As Long
Õâ¸öÊý×é×öΪSafeArrayÔÚÄÚ´æÀïÊÇʲôÑù×ÓÄØ£¿Èçͼһ£º cDims = 2 fFeatures =
FADF_AUTO AND FADF_FIXEDSIZE λÖà 0
cbElements = 4 LenB(Long) 4 cLocks = 0 8
pvData£¨Ö¸ÏòÕæÊý×飩 12
28
rgsabound(0).cElements = 8 16 rgsabound(0).lLbound = 1 18 rgsabound(1).cElements = 9 22 rgsabound(1).lLbound = 2 26
cDims = 2
fFeatures =
FADF_AUTO AND FADF_FIXEDSIZE
λÖà 0
cbElements = 4 LenB(Long) 4
cLocks = 0 8
pvData£¨Ö¸ÏòÕæÊý×飩 12
29
rgsabound(0).cElements = 8 16
rgsabound(0).lLbound = 1 18
rgsabound(1).cElements = 9 22
rgsabound(1).lLbound = 2 26
ͼһ £ºSafeArrayÄÚ´æ½á¹¹
cDims±íʾËüÊǸö2άÊý×飬sFeatures±íʾËüÊÇÒ»¸öÔÚ¶ÑÕ»Àï·ÖÅäµÄ¹Ì¶¨´óСµÄÊý×飬cbElements±íʾËüµÄÿ¸öÔªËØ´óСÊÇLongËĸö×Ö½Ú£¬pvDataÖ¸ÏòÕæµÄÊý×飨¾ÍÊÇÉÏÃæËµµÄCÀïµÄÊý×飩£¬rgsaboundÕâ¸öÕæÊý×é±íÃ÷Êý×é¶þ¸öάµÄ´óСºÍÿ¸öάµÄË÷Òý¿ªÊ¼Î»ÖÃÖµ¡£ ÏÈÀ´¿´¿´´ÓÕâ¸öÉÏÃæÎÒÃÇÄÜ×öЩʲô£¬±ÈÈçÒªµÃµ½Ò»¸öÊý×éµÄάÊý£¬ÔÚVBÀïûÓÐÖ±½ÓÌṩÕâÑùµÄ·½·¨£¬ÓÐÒ»¸ö±äͨµÄ·½·¨ÊÇͨ¹ý´íÎó²¶»ñÈçÏ£º On Error Goto BoundsError
For I = 1 To 1000 '²»»áÓÐÕâô¶àάÊýµÄÊý×é lTemp = LBound(MyArr, I) Next
30
BoundErro:
nDims = I - 1
MsgBox \Õâ¸öÊý×éÓÐ\ά\
ÏÖÔÚÎÒÃÇÖªµÀÁËSafeArrayµÄÔÀí£¬ËùÒÔÒ²¿ÉÒÔÖ±½ÓµÃµ½Î¬Êý£¬ÈçÏ£º 'Ïȵõ½Ò»¸öÖ¸ÏòSafeArray½á¹¹µÄÖ¸ÕëµÄÖ¸Õ룬ÔÀíÊÇʲô£¬ÎÒºóÃæËµ¡£ ppMyArr = VarPtrArray(MyArr)
'´ÓÕâ¸öÖ¸ÕëµÄÖ¸ÕëµÃµ½SafeArray½á¹¹µÄÖ¸Õë CopyMemory pMyArr, ByVal ppMyArr, 4
'ÔÙ´ÓÕâ¸öÖ¸ÕëËùÖ¸µØÖ·µÄÍ·Á½¸ö×Ö½ÚÈ¡³öcDims CopyMemory nDims, ByVal pMyArr, 2 MsgBox \Õâ¸öÊý×éÓÐ\ά\
ÔõôÑù£¬ÊDz»ÊÇÒ²Ã÷°×ÁËLBoundʵ¼ÊÉÏÊÇSafeArrayÀïµÄrgsaboundµÄlLbound£¬¶øUBoundʵ¼ÊÉϵÈÓÚlLbound +cElements - 1£¬ÏÖÔÚÎÒÌá¸öÎÊ£¬ÏÂÃæiUBoundÓ¦¸ÃµÈÓÚ¼¸£¿ Dim aEmptyArray() As Long
iUBound = UBound(aEmptyArray)
ÕýÈ·µÄ´ð°¸ÊÇ-1£¬²»Ææ¹Ö£¬lLbound -cElements - 1 = 0 - 0 - 1 = -1
ËùÒÔ¼ì²éUBoundÊDz»ÊǵÈÓÚ-1ÊÇÒ»¸öÅжÏÊý×éÊDz»ÊÇ¿ÕÊý×éµÄºÃ°ì·¨¡£
»¹ÓÐSafeArray½á¹¹ÀïµÄpvDataÖ¸Ïò´æ·Åʵ¼ÊÊý¾ÝµÄÕæÊý×飬Ëüʵ¼Ê¾ÍÊÇÒ»¸öÖ¸ÏòÕæÊý×éµÚÒ»¸öÔªËØµÄÖ¸Õ룬Ҳ¾ÍÊÇ˵ÓÐÈçϵĵÈʽ£º pvDate = VarPtr(MyArr(0))
ÔÚÉÏһƪÎÄÕÂÀÎÒÃÇ´«¸øÅÅÐòº¯ÊýµÄÊÇÊý×éµÚÒ»¸öÔªËØµÄµØÖ·VarPtr(xxxx(0))£¬Ò²¾ÍÊÇ˵ÎÒÃÇ´«µÄÊÇÕæÊý×飬ÎÒÃÇ¿ÉÒÔÖ±½ÓÔÚÕæÊý×éÉϽøÐÐÊý¾ÝµÄÒÆ¶¯¡¢´«µÝ¡£µ«ÊÇÒªÈçºÎµÃµ½Ò»¸öÊý×éSafeArray½á¹¹µÄÖ¸ÕëÄØ£¿ÄãÓ¦¸Ã×¢Òâµ½ÎÒÉÏÃæËùÓõÄVarPtrArray£¬ËüµÄÉùÃ÷ÈçÏ£º Declare Function VarPtrArray Lib \ _ Alias \
Ëü¾ÍÊÇVarPtr£¬Ö»²»¹ý²ÎÊýÉùÃ÷ÉÏÓõÄÊÇVBÊý×飬ÕâʱËü·µ»ØÀ´µÄ¾ÍÊÇÒ»¸öÖ¸ÏòÊý×éSafeArray½á¹¹µÄÖ¸ÕëµÄÖ¸Õë¡£ÒòΪVarPtr»á½«´«¸øËüµÄ²ÎÊýµÄµØÖ··µ»Ø£¬¶øÓÃByRef´«¸øËüÒ»¸öVBÊý×飬ÈçÇ°ÃæËù˵£¬Êµ¼ÊÉÏ´«µÝµÄÊÇÒ»¸öSafeArray½á¹¹µÄÖ¸Õ룬ÕâʱVarPtrArray½«·µ»ØÕâ¸öÖ¸ÕëµÄÖ¸Õë¡£ËùÒÔÒª·ÃÎʵ½SafeArray½á¹¹ÐèÒª£¬ÈçÏÂÈý²½£º
ÓÃVarPtrArray·µ»ØppSA£¬ÔÙͨ¹ýppSAµÃµ½ËüÖ¸ÏòµÄpSA£¬pSA²ÅÊÇÖ¸ÏòSafeArray½á¹¹µÄÖ¸Õ룬ÎÒÃÇ·ÃÎÊSafeArray½á¹¹ÐèÒªÓõ½¾ÍÊÇÕâ¸öpSAÖ¸Õë¡£
ÏÖÔÚÄãÓ¦¸ÃÒѾÁ˽âÁËSafeArray´ó¸ÅµÄÑù×Ó£¬¾ÍÕâôһµã֪ʶ£¬ÎÒÃǾÍÄÜÔÚVBÀï¶ÔÊý×é½øÐÐHACKÁË¡£
Èý¡¢HACKÊý×é×Ö´®Ö¸Õë
ÕâÒѾÊǵÚÈýƪ½²Ö¸ÕëµÄ¶«Î÷ÁË£¬ÎÒ×ÜÔÚ˵ָÕëÄܹ»ÈÃÎÒÃÇÔõôÑùÔõôÑù£¬²»¹ýÄãÊDz»ÊǾõµÃ³ýÁËÎÒ˵¹ýµÄ¼¸¸öÓÃ;Í⣬ÄãҲû¾õµÃËüÓÐʲôÓã¬ÆäʵÕâÊÇÒòΪÎҺʹó¼ÒÒ»Ñù¼±ÓÚÇó³É¡£ÔÚ½²ÏÂȥ֮ǰ£¬ÎÒÔÙÀ´ÀíÒ»ÀíVBÀïÖ¸ÕëÓ¦¸ÃÔÚʲôÇé¿öÏÂÓá£
Ö»¶ÔÖ¸ÕëÀàÐÍÓÃÖ¸Õ룡·Ï»°£¿ÎÒµÄÒâ˼ÊÇ˵£¬ÏóInteger, Long, DoubleÕâÑùµÄÊýÖµÀàÐÍËüÃǵÄÊý¾ÝÖ±½Ó´æÔÚ±äÁ¿ÀVB´¦ÀíËüÃDz¢²»Âý£¬Ã»ÓÐHACKµÄ±ØÒª¡£µ«ÊÇ×Ö´®£¬ÒÔ¼°°üÀ¨×Ö´®¡¢Êý×é¡¢¶ÔÏ󡢽ṹµÄVariant£¬»¹ÓаüÀ¨×Ö´®¡¢¶ÔÏó½á¹¹µÄÊý×éËüÃǶ¼ÊÇÖ¸Õ룬ʵ
31
¼ÊÊý¾Ý²»·ÅÔÚ±äÁ¿À±äÁ¿·ÅµÄÊÇÖ¸Õ룬ÓÉÓÚVB²»Ö±½ÓÖ§³ÖÖ¸Õ룬¶ÔËûÃǵIJÙ×÷±ØÐëÁ¬Í¬Êý¾Ý¿½±´Ò»Æð½øÐС£ÓÐʱÎÒÃDz¢²»Ï븳ֵ£¬ÎÒÃÇÖ»Ïë½»»»ËüÃÇÖ¸Õ룬»òÕßÏëÈöà¸öÖ¸ÕëÖ¸Ïòͬһ¸öÊý¾Ý£¬Èöà¸ö±äÁ¿¶Ôͬһ´¦ÄÚ´æ²Ù×÷£¬Òª´ïµ½ÕâÑùµÄÄ¿µÄ£¬ÔÚVBÀï²»HACKÊDz»Ðеġ£
¶ÔÊý×éÓÈÆäÈç´Ë£¬±ÈÈçÎÒÃǽñÌìÒª×öµÄ²Ë£º¶ÔÒ»¸ö×Ö´®Êý×é½øÐÐÅÅÐò¡£ÎÒÃÇÖªµÀ£¬¶Ô×Ö´®Êý×é½øÐÐÅÅÐòºÜ´óÒ»²¿·Öʱ¼ä¶¼ÓÃÀ´½»»»×Ö´®ÔªËØ£¬ÔÚVBÀï¶Ô×Ö´®¸³ÖµÊ±ÒªÏȽ«Ô×Ö´®Êͷŵô£¬ÔÙн¨Ò»¸ö×Ö´®£¬ÔÙ½«Ô´×Ö´®¿½±´¹ýÀ´£¬·Ç³£ºÄʱ¡£ÓÃCOMÀïµÄ¸ÅÄîÀ´Ëµ£¬±ÈÈç×Ö´®a¡¢bµÄ²Ù×÷a=b£¬ÒªÏÈÓÃSysFreeString(a)ÊͷŵôÔÀ´µÄ×Ö´®a, ÔÙÓÃa = SysAllocString(b)н¨ºÍ¿½±´×Ö´®£¬Ã÷°×ÁËÕâÒ»µã¾ÍÖªµÀ£¬ÔÚ½»»»×Ö´®Ê±²»ÒªÓø³ÖµµÄ·½Ê½È¥½»»»£¬¶øÓ¦¸ÃÖ±½ÓÈ¥½»»»×Ö´®Ö¸Õ룬ÎÒÔÚÖ¸Õë¿û»¨±¦µäµÚһƪÀï½éÉܹýÕâÖÖ½»»»×Ö´®µÄ·½·¨£¬Õâ¿ÉÒÔ´ó´óÌá¸ß½»»»×Ö´®µÄËÙ¶È¡£µ«ÊÇÕâÖÖ½»»»ÖÁÉÙÒ²ÒªÓÃÁ½´ÎCopyMemoryÀ´½«Ö¸Õëд»ØÈ¥£¬¶Ô¶à¸ö×Ö´®½øÐн»»»Ê±µ÷ÓÃCopyMemoryµÄ´ÎÊý³Ì¼¸ºÎÔö³¤£¬Ð§ÂÊÓкܴóµÄËðʧ¡£¶øÊµ¼ÊÉÏ£¬Ö¸ÕëÖ»ÊÇ32λÕûÊý¶øÒÑ£¬ÔÚCÀï½»»»Á½¸öÖ¸Õ룬ֻÐèÒª½øÐÐÈý´ÎLongÐÍÕûÊý¸³Öµ¾ÍÐÐÁË¡£ËùÒÔÎÒÃÇÒªÏëÏëÎÒÃÇÄܲ»Äܽ«×Ö´®Êý×éÀïËùÓÐ×Ö´®Ö¸ÕëÄóöÀ´·Åµ½Ò»¸öLongÐÍÖ¸ÕëÊý×éÀÎÒÃÇÖ»½»»»Õâ¸öLongÐÍÊý×éÀïµÄÔªËØ£¬Ò²¾ÍÏ൱ÓÚ½»»»ÁË×Ö´®Ö¸Õ룬ÅźÃÐòºó£¬ÔÙ½«Õâ¸öLongÐÍÖ¸ÕëÊý×éÖØÐÂд»Øµ½×Ö´®Êý×éµÄËùÓÐ×Ö´®Ö¸ÕëÀ¶ø±ÜÃâÁ˶à´ÎʹÓÃCopyMemoryÀ´Ò»´Î´ÎÁ½Á½½»»»×Ö´®Ö¸Õë¡£ÕâÑùÎÒÃÇËùÓеĽ»»»²Ù×÷¶¼ÊǶÔÒ»¸öLongÐÍÊý×éÀ´½øÐУ¬ÒªÖªµÀ½»»»Á½¸öLongÐÍÕûÊý£¬ÔÚVBÀïºÍÔÚCÀïÊÇÒ»Ñù¿ìµÄ¡£ ÏÖÔÚÎÒÃǵÄÎÊÌâ³ÉÁËÈçºÎÒ»´ÎÐԵؽ«×Ö´®Êý×éÀïµÄ×Ö´®Ö¸ÕëÄóöÀ´£¬ÓÖÈçºÎ½«µ÷ÕûºóµÄ×Ö´®Ö¸ÕëÊý×éд»ØÈ¥¡£
²»Óö¯Êý×éµÄSafeArray½á¹¹£¬ÎÒÃÇÓÃStrPtrÒ²ÄÜÍê³ÉËü¡£ÎÒÃÇÖªµÀ£¬×Ö´®Êý×éÔªËØÀï·ÅµÄÊÇʵ¼ÊÉÏÊÇ×Ö´®Ö¸Õ룬Ҳ¾ÍÊÇBSTRÖ¸Õ룬°ÑÕâЩָÕë·Åµ½Ò»¸öLongÐÍÊý×éÀïºÜ¼òµ¥£¬ÓÃÏÂÃæµÄ·½·¨£º
Private Sub GetStrPtrs()
Dim Hi As Long, Lo As Long Hi = UBound(MyArr) Lo = LBound(MyArr)
ReDim lStrPtrs(0 To 1, Lo To Hi) As Long Dim i As Long For i = Lo To Hi
lStrPtrs(0, i) = StrPtr(MyArr(i)) 'BSTRÖ¸ÕëÊý×é lStrPtrs(1, i) = i 'ÔÊý×éË÷Òý Next End Sub
ΪʲôҪÓÃ2άÊý×飬ÕâÊÇÅÅÐòµÄÐèÒª£¬ÒòΪµ±ÎÒÃǽ»»»lStrPtrsÀïµÄLongÐÍÖ¸Õëʱ£¬ÔÀ´µÄ×Ö´®Êý×éMyArrÀïµÄ×Ö´®Ö¸Õ벢ûÓÐͬʱ½»»»£¬ËùÒÔÓÃlStrPtrsÀïµÄLongÐÍÖ¸Õë·ÃÎÊ×Ö´®Ê±£¬±ØÐëͨ¹ýÔÀ´µÄË÷Òý£¬Òò´Ë±ØÐëÓÃ2άÊý×éͬʱ¼Ç¼ÏÂÿ¸öLongÐÍÖ¸ÕëËùÖ¸×Ö´®ÔÚÔ×Ö´®Êý×éÀïµÄË÷Òý¡£Èç¹ûÖ»ÓÃ1άÊý×飬·ÃÎÊ×Ö´®Ê±¾ÍÓÖÒªÓõ½CopyMemoryÁË£¬±ÈÈç·ÃÎÊlStrPtrsµÚÈý¸öÔªËØËùÖ¸µÄ×Ö´®£¬µÃÓÃÈçÏ·½·¨£º CopyMemory ByVal VarPtr(StrTemp), lStrPtrs(3), 4
ËäȻֻҪÎÒÃDZ£Ö¤StrTemp×ã¹»´ó£¬ÔÙ¼ÓÉÏһЩÇåÀíÉÆºóµÄ¹¤×÷£¬ÕâÖÖ×ö·¨ÊÇ¿ÉÒԵ쬵«Êµ¼ÊÉÏÎÒÃÇÒ²¿´µ½ÕâÑù»¹Êǵöà´Îµ÷ÓÃCopyMemory£¬Êµ¼ÊÉÏ¿¼Âǵ½ÔÀ´µÄ×Ö´®Êý×éMyArrÒ»Ö±¾Íû±ä£¬ÎÒÃÇÄܹ»Í¨¹ýË÷ÒýÀ´·ÃÎÊ×Ö´®£¬ÉÏÃæÍ¬ÑùµÄ¹¦ÄÜÏÖÔھͳÉÁË£º StrTemp = MyArr(lStrPtrs(1,3)) 'ͨ¹ýÔ×Ö´®Êý×éË÷Òý¶Á³ö×Ö´®¡£
32
²»¹ý£¬µ±ÎÒÃǽ»»»lStrPtrsÀïµÄÁ½¸öLongÐÍÖ¸ÕëÔªËØÊ±£¬»¹Òª¼ÇµÃͬʱ½»»»ËüÃǵÄË÷Òý£¬±ÈÈç½»»»µÚ0¸öºÍµÚ3¸öÔªËØ£¬ÈçÏ£º
lTemp1 = lStrPtrs(0, 3) : lTemp2 = lStrPtrs(1, 3)
lStrPtrs(0, 3) = lStrPtrs(0, 0) : lStrPtrs(1, 3) = lStrPtrs(1, 0) lStrPtrs(0, 0) = lTemp1 : lStrPtrs(1, 0) = lTemp2
µ±ÎÒÃÇÅźÃÐòºó£¬ÎÒÃÇ»¹Òª½«Õâ¸ölStrPtrsÀïµÄÖ¸ÕëÔªËØÐ´»ØÈ¥£¬ÈçÏ£º For i = Lo To Hi
CopyMemory(ByVal VarPtr(MyArr(i)), lStrPtrs(0,i), 4) Next
ÎÒÒѾ²»ÏëÔÙ°ÑÕâ¸ö·½·¨½²ÏÂÈ¥£¬ËäÈ»Ëü¿Ï¶¨¿ÉÐУ¬²¢ÇÒÒ²¿Ï¶¨±ÈÓÃCopyMemoryÀ´Òƶ¯Êý¾ÝÒª¿ì£¬ÒòΪÎÒÃÇʵ¼ÊÉÏÒÆ¶¯µÄ½ö½öÊÇLongÐ͵ÄÖ¸ÕëÔªËØ¡£µ«ÎÒÐÄÀïÒѾ֪µÀÏÂÃæÓиüºÃ¸üÖ±½ÓµÄ·½·¨£¬ÕâÖÖתÍäĨ½ÇµÄÇúÏ߾ȹúʵÔÚ²»ÖµµÃÀË·ÑÎÄ×Ö¡£
ËÄ¡¢HACKÊý×éµÄBSTR½á¹¹£¬ÊµÊ±´¦ÀíÖ¸Õë¡£
×²ÉµÄÀ´ÁË£¬ÊµÊ±´¦ÀíÖ¸Õ붯̬½»»»Êý¾Ý£¬ºÃÒ»¸öÏìÁÁµÄ˵·¨¡£
ÎÒÃÇ¿´µ½£¬ÉÏÒ»½ÚÖÐËùÊö·½·¨µÄ²»×ãÔÚÓÚÎÒÃǵÄLongÐÍÖ¸ÕëÊý×éÀïµÄÖ¸ÕëÊǶÀÁ¢µÄ£¬ËüûÓкÍ×Ö´®Êý×éÀïµÄ×Ö´®Ö¸ÕëÁªÏµÔÚÒ»Æð£¬ÒªÊÇÄÜÁªÏµÔÚÒ»Æð£¬ÎÒÃǾÍÄÜÔÚ½»»»LongÐÍÖ¸ÕëµÄͬʱ£¬ÊµÊ±µØ½»»»×Ö´®ÔªËØ¡£ Õâ¿ÉÄÜÂð£¿
µ±È»£¬·ñÔòÎÒ»¨ÄÇô±ÊīȥдSafeArray¸Éʲô£¡
ÔÚÉÏÒ»½Ú£¬ÎÒÃǵÄÄ¿µÄÊÇÒª°Ñ×Ö´®Êý×éÀïµÄBSTRÖ¸ÕëÊý×éÄóöÀ´·Åµ½Ò»¸öLongÐÍÊý×éÀ¶øÔÚÕâÒ»½ÚÎÒÃǵÄÄ¿µÄÊÇÒªÈÃÎÒÃÇLongÐÍÖ¸ÕëÊý×é¾ÍÊÇ×Ö´®Êý×éÀïµÄBSTRÖ¸ÕëÊý×é¡£ÄóöÀ´ÔÙ·Å»ØÈ¥µÄ·½·¨£¬ÎÒÃÇÔÚÉÏÒ»½Ú¿´µ½ÁË£¬ÏÖÔÚÎÒÃÇÀ´¿´¿´£¬²»ÄóöÀ´¶øÖ±½ÓÓõķ½·¨¡£
Õâ¸ö·½·¨»¹ÊÇÒª´Ó×Ö´®Êý×éµÄSafeArray½á¹¹À´·ÖÎö£¬ÎÒÃÇÒѾ֪µÀSafeArray½á¹¹ÀïµÄpvDataÖ¸ÏòµÄ¾ÍÊÇÒ»¸ö·Åʵ¼ÊÊý¾ÝµÄÕæÊý×飬¶øÒ»¸ö×Ö´®Êý×éÈçMyArrËüµÄpvDataÖ¸ÏòµÄÊÇÒ»¸ö°üº¬BSTRÖ¸ÕëµÄÕæÊý×é¡£ÏÖÔÚÈÃÎÒÃÇÏëÏ룬Èç¹ûÎÒÃǽ«Ò»¸öLongÐÍÊý×élStrPtrsµÄpvDataŪµÃºÍ×Ö´®Êý×éMyArrµÄpvDataÒ»Ñùʱ»áÔõÑù£¿BSTRÖ¸ÕëÊý×é¾Í¿ÉÒÔͨ¹ýLongÐÍÊý×éÀ´·ÃÎÊÁË£¬ÏÈ¿´ÈçºÎÓôúÂëÀ´ÊµÏÖÕâÒ»µã£º 'Ä£¿é¼¶±äÁ¿
Private MyArr() As String 'ÒªÅÅÐòµÄ×Ö´®Êý×é
Private lStrPtrs() As Long 'ÉÏÃæÊý×éµÄ×Ö´®Ö¸ÕëÊý×飬ºóÃæ»áƾ¿Õ¹¹ÔìËü Private pSA As Long '±£´ælStrPtrsÊý×éµÄSafeArray½á¹¹Ö¸Õë Private pvDataOld As Long '±£´ælStrPtrsÊý×éµÄSafeArray½á¹¹µÄÔ ' pvDataÖ¸Õ룬ÒÔ±ã»Ö¸´lStrPtrs
'¹¦ÄÜ£º ½«LongÐÍÊý×élStrPtrsµÄpvDataÉè³É×Ö´®Êý×éMyArrµÄpvData ' ÒÔʹLongÖ¸ÕëÊý×éµÄ±ä¸üÄÜʵʱ·´Ó¦µ½×Ö´®Êý×éÀï Private Sub SetupStrPtrs() Dim pvData As Long
' ³õʼ»¯lStrPtrs£¬²»ÐèÒª½«Êý×éÉèµÃºÍMyArrÒ»Ñù´ó
33
' ÎÒÃÇ»áÔÚºóÃæ¹¹ÔìËü ReDim lStrPtrs(0) As Long
'µÃµ½×Ö´®Êý×éµÄpvData pvData = VarPtr(MyArr(0))
'µÃµ½lStrPtrsÊý×éµÄSafeArray½á¹¹Ö¸Õë
CopyMemory pSA, ByVal VarPtrArray(lStrPtrs), 4
'Õâ¸öÖ¸ÕëÆ«ÒÆ12¸ö×Ö½Úºó¾ÍÊÇpvDataÖ¸Õ룬½«Õâ¸öÖ¸Õë±£´æµ½pvDataOld ' ÒÔ±ã×îºó»¹ÔlStrPtrs£¬´Ë´¦Ò²¿ÉÒÔÓ㺠' pvDataOld = VarPtr(lStrPtrs(0)) CopyMemory pvDataOld, ByVal pSA + 12, 4
'½«MyArrµÄpvDataдµ½lStrPtrsµÄpvDataÀïÈ¥ CopyMemory ByVal pSA + 12, pvData, 4
'ÍêÕû¹¹ÔìSafeArray±ØÐëÒª¹¹ÔìËüµÄrgsabound(0).cElements
CopyMemory ByVal pSA + 16, UBound(MyArr) - LBound(MyArr) + 1, 4 '»¹ÓÐrgsabound(0).lLbound
CopyMemory ByVal pSA + 20, LBound(MyArr), 4 End Sub
¿´²»¶®£¬Çë½áºÏͼһÔÙ¿´¿´£¬Ó¦¸Ã¿ÉÒÔ¿´³öÎÒÃÇÊÇÆ¾¿Õ¹¹ÔìÁËÒ»¸ölStrPtrs£¬Ê¹Ëü¼¸ºõºÍMyArrһģһÑù£¬Î¨Ò»µÄ²»Í¬¾ÍÊÇËüÃǵÄÀàÐͲ»Í¬¡£MyArr×Ö´®Êý×éÀïµÄfFeatures°üº¬FADF_BSTR£¬¶ølStrPtrsµÄfFeatures°üº¬FADF_HAVEVARTYPE£¬²¢ÇÒËüµÄVARTYPEÊÇVT_I4¡£²»ÓùØÐÄÕâ¶ù£¬ÎÒÃÇÖ»ÒªÖªµÀlStrPtrsºÍMyArrËüÃÇÖ¸Ïòͬһ¸öÕæÊý×飬¹ÜËûÊÇBSTR»¹ÊÇVT_I4£¬ÎÒÃǰÑÕæÊý×éÀïµÄÔªËØµ±³ÉÖ¸ÕëÀ´Ê¹¾ÍÐÐÁË¡£
×¢Ò⣬ÓÉÓÚlStrPtrsÊÇÎÒÃǾ¹ýÁËÎÒÃǺܴóµÄ¸ÄÔ죬ËùÒÔµ±³ÌÐò½áÊøÇ°£¬ÎÒÃÇÓ¦¸Ã½«Ëü»¹Ô£¬ÒÔ±ãÓÚVBÀ´ÊÍ·Å×ÊÔ´¡£Êǵ쬲»ÊÍ·ÅÒ²²»Ò»¶¨»áÒýÆðÎÊÌ⣬ÒòΪ³ÌÐòÔËÐнáÊøºó£¬²Ù×÷ϵͳµÄÈ·ÊÇ»á»ØÊÕÎÒÃÇÔÚ¶ÑÕ»Àï·ÖÅäÁËȴûÓÐÊͷŵÄlStrPtrsÔÀ´µÄÒ°Ö¸ÕëpvOldData£¬µ«µ±ÄãÔÚIDEÖÐÔËÐÐʱ£¬ÄãÓÐ60£¥µÄ»ú»áÈÃVBµÄIDEËÀµô¡£ÎÒÃÇÊÇÏë°ïVB×öµã¼ÒÎñÊ£¬¶ø²»ÊÇÏë¸øVBÌíÂÒ×Ó£¬ËùÒÔÇë¼ÇסÔÚ×öÍê²Ëºó£¬Ò»¶¨Òª°Ñ³ø·¿´òɨ¸É¾»£¬¶«Î÷¸Ã»¹ÔµÄÒ»¶¨Òª»¹Ô¡£ÏÂÃæ¿´¿´ÔõôÑùÀ´»¹Ô£º '»¹ÔÎÒÃÇ×ö¹ýÊֽŵÄlStrPtr Private Sub CleanUpStrPtrs()
'lStrPtrµÄÔÀ´ÉùÃ÷Ϊ£ºReDim lStrPtrs(0) As Long ' °´ÉùÃ÷µÄÒªÇó»¹ÔËü
CopyMemory pSA, ByVal VarPtrArray(lStrPtrs), 4 CopyMemory ByVal pSA + 12, pvDataOld, 4 CopyMemory ByVal pSA + 16, 1, 4 CopyMemory ByVal pSA + 20, 0, 4 End Sub
ºÃÁË£¬¾«»ªÒѾ½²ÍêÁË£¬Èç¹ûÄ㻹ÓеãÏ벻ͨ£¬¿´¿´ÏÂÃæµÄʵÑ飺
34
'ʵÑé
Sub Main()
'³õʼ»¯×Ö´®Êý×é Call InitArray(6)
'¸ÄÔìlStrPtrs Call SetupStrPtrs
'ÏÂÃæËµÃ÷Á½¸öÖ¸ÕëÊÇÒ»ÑùµÄ Debug.Print lStrPtrs(3)
Debug.Print StrPtr(MyArr(3)) Debug.Print
'ÏÈ¿´¿´ÔÀ´µÄ×Ö´® Debug.Print MyArr(0) Debug.Print MyArr(3) Debug.Print
'ÏÖÔÚÀ´½»»»µÚ0¸öºÍµÚ3¸ö×Ö´® Dim lTmp As Long lTmp = lStrPtrs(3) lStrPtrs(3) = lStrPtrs(0) lStrPtrs(0) = lTmp
'ÔÙÀ´¿´¿´ÎÒÃǵÄ×Ö´®£¬ÊDz»ÊǾõµÃºÜÉñÆæ Debug.Print MyArr(0) Debug.Print MyArr(3) Debug.Print
'»¹Ô
Call CleanUpStrPtrs End Sub
ÔÚÎҵĻúÆ÷ÉÏ£¬ÔËÐнá¹ûÈçÏ£º 1887420 1887420
OPIIU
WCYKOTC
WCYKOTC OPIIU
ÔõôÑù£¿ÈçÔ¸Òѳ¥£¡×Ö´®Í¨¹ý½»»»LongÐÍÊý±»ÊµÊ±½»»»ÁË¡£ ͨ¹ýÕâÖÖ·½Ê½À´ÊµÏÖ×Ö´®Êý×éÅÅÐò¾Í·Ç³£¿ìÁË£¬ÆäЧÂÊÉϵÄÌá¸ßÊǾªÈ˵쬶ÔðÅÝÅÅÐòÕâÑù½»»»×Ö´®´ÎÊýºÜ¶àµÄÅÅÐò·½Ê½£¬Æäƽ¾ùÐÔÄÜÄÜÌá¸ßÒ»±¶ÒÔÉÏ£¨Òª¿´ÎÒÃÇ×Ö´®Æ½¾ù³¤¶È£¬£©£¬¶Ô¿ìËÙÅÅÐòÕâÑù½»»»´ÎÊý½ÏÉٵķ½·¨Ò²ÄÜÓв»ÉÙÐÔÄÜÉϵÄÌá¸ß£¬ÓÃÕâÖÖ¼¼ÊõʵÏֵĿìËÙÅÅ
35
Ðò£¬¿ÉÒÔ¿´¿´±¾ÎĵÄÅäÌ×´úÂëÖеÄQSortPointers¡£
±¾µÀ²Ë×î¹Ø¼üµÄ¼¼ÊõÒѾ½²ÁË£¬ÖÁÓÚÔõô×öÍêÕâµÀ²Ë£¬Ôõô°ÑÕâµÀ²Ë×öµÃ¸üºÃ£¬»¹ÐèÒª´ó¼Ò×Ô¼ºÀ´Êµ¼ù¡£
ËÄ¡¢ÎÒÃÇѧµ½ÁËʲô¡£
½ö¾ÍSafeArrayÀ´Ëµ£¬Äã¿ÉÄÜÒѾ·¢ÏÖÎÒ¸ù±¾¾ÍûÓÐÖ±½ÓÈ¥ÓÃÎÒ¶¨ÒåÁ˵ÄSAFEARRAY½á¹¹£¬ÎÒҲûÓÐÕ¹¿ª½²Ëü£¬Êµ¼ÊÉ϶ÔSafeArrayÎÒÃÇ»¹¿ÉÒÔ×öºÜ¶à¹¤×÷£¬»¹ÓкܶàÇÉÃîµÄÓ¦Ó᣻¹ÓÐÐèҪעÒâµÄ£¬VarPtrArray²»ÄÜÓÃÀ´·µ»Ø×Ö´®Êý×éºÍVariantÊý×éµÄSafeArray½á¹¹µÄÖ¸ÕëµÄÖ¸Õ룬Ϊʲô»áÕâÑùºÍÔõÑùÀ´½â¾öÕâ¸öÎÊÌ⣿ÕâЩ¶¼ÐèÒªÎÒÃÇÁ˽âBSTR£¬Á˽âVARIANT£¬Á˽âVARTYPE£¬ÕâЩҲֻÊÇCOMµÄ±ùɽһ½Ç£¬ÒªÑ§ºÃVB£¬ÄËÖÁÕû¸öÈí¼þ¿ª·¢¼¼Êõ£¬COM»¹ÓкܶàºÜ¶à¶«Î÷ÐèҪѧϰ£¬ÎÒÒ²»¹ÔÚѧ£¬ÔÚÎÒ¿ªÊ¼COMµÄרÌâ֮ǰ£¬´ó¼ÒÒ²Ó¦¸Ã×ÔѧһÏ¡£
COMµÄ¶«Î÷ÏÈ·ÅÒ»·Å£¬ÏÂһƪÎÄÕ£¬Ó¦ÅóÓѵÄÒªÇó£¬ÎÒ×¼±¸À´Ð´Ð´ÄÚ´æ¹²Ïí¡£
ºó¼Ç£º
ÓÖ»¨ÁËÕûÕûÒ»ÌìµÄʱ¼ä£¬Ï£ÍûдµÄ¶«Î÷ÓмÛÖµ£¬¾õµÃÓÐÓþÍÀ´½Ð¸öºÃ°É£¡
36
ÕæÏë²»µ½Ö®Î壺¸ßЧ×Ö´®Ö¸ÕëÀà
¹Ø¼ü×Ö£ºVB¡¢HCAK¡¢×Ö´®Ö¸Õë¡¢BSTR¡¢Ð§ÂÊ¡¢ÄÚ´æ¹²Ïí ÄѶȣºÖм¶»ò¸ß¼¶ ²Î¿¼ÎÄÕ£º
1¡¢2000Äê7ÔÂVBPJ Black BeltרÀ¸ÎÄÕ¡¶Modify a Varialbe's Pointer¡· ×÷ÕߣºBill McCarthy
2¡¢1998Äê4ÔÂVBPJ Black BeltרÀ¸ÎÄÕ¡¶Play VB's Strings¡· ×÷ÕߣºFrancesco Balena
ÒýÑÔ£º
±¾ÏëÒÔÄÚ´æ¹²Ïí×öΪVBÖ¸ÕëרÌâµÄ×îºóһƪ£¬Ð´×Åд×Å·¢ÏÖ×Ö´®µÄÎÊÌâÓ¦¸Ãµ¥¶À̸̸¡£ÔÚÄÚ´æ¹²ÏíµÄÎÊÌâÉÏ£¬ÎÒÓÈÆä¹ØÐĵÄÊÇ×Ö´®µÄ¹²Ïí£¬ÒòΪÔÚÎÒÒ»¸ö¶àÔÂǰ·¢²¼µÄÔ´ÂëÀïÓõÄÊÇ¡¶HardCore VB¡·ÀïBruce MckinneyÌṩµÄCShareStrÀ࣬ËüʵÏÖÁË×Ö´®µÄÄÚ´æ¹²Ïí¡£µ«ÊÇBruceҲûÓÐÍ»ÆÆ¾ÖÏÞ£¬¶Ô×Ö´®µÄ´¦ÀíÒÀÈ»ÊÇCopyMemoryµÄǬÀ¤´óÅ²ÒÆ£¬ÓÈÆäÊÇ»¹Òª½øÐÐÌÖÑáµÄANSI/DBCSºÍUnicodeµÄת»»¡£ÎÒÔÚreadmeÀï˵¹ýËüЧÂʼ«µÍ£¬Ó¦¸Ã²ÉÓÃVariant»òByteÊý×éÀ´ÊµÏÖ£¬²ÅÄܱÜÃâת»»¡£ºóÀ´ÓÖÏëµ½¿ÉÒÔÓÃStrPtrÀ´×ö£¬²¢ÔÚVCÀïÓÃDLL¹²Ïí½ÚʵÏÖÁË¿ÉÒÔ²»½øÐÐת»»µÄ×Ö´®ÄÚ´æ¹²Ïí¡£²»¹ýÔÚVCÀïÎÒÈÔÈ»ÐèÒªÓÃSysAllocStringÀ´½¨Á¢VBÄÜʹÓõÄBSTR¡£Õâ¶¼²»ÊÇÎÒÏëÒªµÄ£¬ÎÒÏëÒªµÄ¶«Î÷ÒªÏóVCÀïµÄCStringµÄÒ»Ñù£¬Ö»Òª×Ö´®¹»´ó£¬¶ÔÆä¸³Öµ¾Í²»ÓÃÖØÐ·ÖÅäÄڴ棬»¹ÒªÏóVCÀïCComBSTRÀàÒ»Ñù¿ÉÒÔAttachµ½Ò»¸öÌØ¶¨BSTR¡£
ÖªµÀ¸ÃÔõô×ö£¬ÊÇÔÚ¿´ÁËVBPJÉÏBill McCarthyºÍFrancesco BalenaµÄÁ½ÆªÎÄÕÂÖ®ºó¡£BillÓÃÐÞ¸ÄSafeArrayÃèÊö½á¹¹ÊµÏÖÁËÊý×éµÄÄÚ´æ¹²Ïí£¬¶øFrancescoÔò¶Ô×Ö´®Ö¸Õë½øÐÐÉîÈëµÄ̽ÌÖ¡£µ«ÊÇBillºÍFrancescoµÄ¶«Î÷¶¼Ã»ÓÐʵÏÖÎÒÏëÒªµÄ×Ö´®Àà¡£
·½·¨ÖªµÀÁË£¬ÊµÏÖ²¢²»ÄÑ£¬ËùÒÔÎÒ¾ö¶¨×Ô¼ºÀ´°ü×°Ò»¸öÕâÑùµÄ¶«Î÷¡£
ÕýÎÄ£º
ʹÓÃVBÀïµÄ×Ö´®ÀàÐÍStringÓÐÁ½´ó²»×㣺µÚÒ»¡¢ËüµÄ·ÖÅäÊÇÓÉVBÔËÐÐʱ¿ØÖÆ£¬ÎÒÃDz»Äܽ«Æä·ÖÅäÔÚÖ¸¶¨ÄÚ´æ´¦£»µÚ¶þ£¬ÈκÎÒ»´Î¶Ô×Ö´®µÄ¸³Öµ²Ù×÷¶¼Òª½øÐÐÄÚ´æÖØÐ·ÖÅ䡣ҪʵÏÖ¸ßЧ¡¢Áé»îµÄ×Ö´®´¦Àí£¬ÎÒÃDZØÐë¿Ë·þÕâÁ½´ó²»×ã¡£
¶ÔÓÚµÚÒ»¸öÎÊÌ⣬ͨ¹ýÐÞ¸ÄString±äÁ¿Àï·Å×ŵÄBSTRÃèÊö·ûÖ¸Õë¿ÉÒÔʵÏÖ£»¶ÔÓÚµÚ¶þ¸öÎÊÌ⣬¿ÉÒÔÓÃMidÓï¾ä£¨×¢ÒâÊÇÓï¾ä¶ø²»ÊǺ¯Êý£©À´¸³Öµ¡£²»Ïêϸ½²ÁË£¬Ö±½Ó¿´ÏÂÃæµÄÕâ¸öÀࣺ
Option Explicit
'******************************************************** 'clsBSTR.cls
'×÷Õß: Ðܳ¬ ID: AdamBear 2002Äê3ÔÂ18ÈÕ 'http://www.csdn.net/Author/AdamBear
' Äã¿ÉÒÔ×ÔÓÉʹÓñ¾ÀàÄ£¿é£¬²»¹ýÇë±£Áô±¾ÉùÃ÷
'********************************************************
37
Private Declare Sub CopyMemory Lib \Any, Source As Any, ByVal Length As Long)
'²»ÒªÖ±½Ó¶ÔsString¸³Öµ(¿ÉÒÔÓÃMIDÓï¾ä)£¬½«ÆäÉèΪ¹«ÓнöΪÌá¸ßЧÂÊ¡£ Public sString As String 'BSTRÃèÊö·ûÖ¸Õë
Private pStr As Long 'BSTRµØÖ·
Private nMaxLen As Long 'BSTR×î´ó×Ö½ÚÊý
'Èñ¾×Ö´®Ö¸ÏòÌØ¶¨µØÖ·
Public Sub Attach(Addr As Long, Optional nLen As Long) pStr = Addr
'ÐÞ¸ÄBSTRÃèÊö·ûÖ¸Õ룬ʹÆäÖ¸ÏòAddr CopyMemory ByVal VarPtr(sString), Addr, 4
If IsMissing(nLen) Then Exit Sub 'É趨×î´ó×Ö´®×Ö½ÚÊý nMaxLen = nLen End Sub
'»¹Ô±¾×Ö´®ÔBSTRÃèÊö·û Public Sub Detach()
CopyMemory ByVal VarPtr(sString), 0&, 4 End Sub
'Èñ¾×Ö´®Ö¸ÏòÔ´×Ö´®
Public Sub AttachStr(sStr As String) Attach StrPtr(sStr), LenB(sStr) End Sub
'dataΪȱʡÊôÐÔ
Public Property Let data(sVal As String) Dim c As Long c = LenB(sVal)
'³¬¹ý×î´ó×Ö´®Êý£¬Å׳ö´íÎó¡£
If c > nMaxLen Then Err.Raise vbObjectError + 3000, _ \Òç³ö\ 'д×Ö´®³¤¶È
CopyMemory ByVal (pStr - 4), c, 4 'д×Ö´®
Mid(sString, 1) = sVal
38
End Property
'¿ÉÒÔͨ¹ý¹«ÓбäÁ¿sStringÀ´¶Á×Ö´®£¬Ð§Âʸü¸ß Public Property Get data() As String data = sString End Property
Private Sub Class_Terminate() Call Detach End Sub
Ó÷¨ÈçÏ£¬¼ÙÉèÎÒÃÇÒÑͨ¹ýVitualAlloc£¬HeapAlloc£¬MapViewOfFileÕâÑùµÄÄÚ´æ¹ÜÀíAPIµÃµ½ÁËÒ»¸ö4k¸ö×ֽڵĿɶÁдµÄÄÚ´æµØÖ·baseAddr£º Dim sShare As New clsBSTR
'ÁôÏÂǰ4¸ö×Ö½ÚÓÃÓÚBSTR±£´æ×Ö´®×Ö½ÚÊý sShare.Attach(baseAddr+4, 4096-4)
'ÏÂÃæµÄ×Ö´®\»áÖ±½Óдµ½baseAddr+4×Ö½Ú´¦ sShare = \ Dim y As String
'¶Á×Ö´®Ê±¿ÉÒÔÓÃsStringÊôÐÔ»òȱʡÊôÐÔ y = sShare.sString
'ÓÃAttachStr·½·¨Attachµ½Ò»¸ö×Ö´®¡£ '±ØÐëÒªÏÈDetach sShare.Detach
sShare.AttachStr(y) sShare = \ Debug.Print y
'Ò»µ©AttachStrµ½×Ö´®yºó£¬¶ÔsShareµÄÐ޸ľÍÏ൱ÓÚ¶ÔyµÄÐ޸ġ£ '²¢ÇÒÒÔºó¶ÔyµÄÐÞ¸ÄÒ²Ö»ÄÜÓÃMidÓï¾ä Mid(y, 1) = \
'²»ÄÜÖ±½Ó¸³Öµ£¬ÕâÑùVB»á½«ÔÀ´yËùÖ¸£¨Ò²ÊÇsShareËùÖ¸£©ÄÚ´æÊÍ·Å£¬ ' ÖØÐ·ÖÅäy¡£ÕâÑùÔÚ·ÃÎÊsShareʱ»á³ö´í¡£ 'y = \
ÎÒÒ²²»ÔÚÕâÀï½²Õâ¸öÀàµÄÏêϸÔÀí£¬¿ÉÒԲο¼ÎÒÇ°ÃæËµµÄÁ½ÆªÎÄÕ¡£ ʹÓÃÕâ¸öÀàÓм¸¸öÐèҪעÒâµÄµØ·½¡£
1¡¢¶Á×Ö´®Ê±¿ÉÒÔÓÃsStringÊôÐÔÀ´¶Á£¬¸ü¿ì¡£
¶ÁsShareÓÐÁ½ÖÖ·½·¨£¬Ò»ÖÖÊÇÓÃȱʡÊôÐÔDataÀ´¶Á£¬Ò»ÖÖÊÇÖ±½ÓÓÃsStringÊôÐÔÀ´¶Á¡£ÓÃsStringÊôÐÔ²»ÖØÐ·ÖÅäÄڴ棬Ҫ¿ìµÃ¶à¡£
2¡¢²»ÒªÖ±½Ó¸øsString¸³Öµ£¬Ó¦Ê¹ÓÃȱʡµÄdataÊôÐÔÀ´¸³Öµ¡£
Ö®ËùÒÔ°ÑsStringÊôÐÔ±©Â¶³öÀ´£¬ÊÇΪÁËЧÂʺͷ½±ã¡£ÎÒÃÇ¿ÉÒÔÓÃMidÓï¾ä¶ÔÆä½øÐÐÐ޸쬵«²»ÒªÖ±½ÓÓÃ\À´¸³Öµ¡£ 3¡¢×¢ÒâAttachµÄµÚ¶þ¸ö²ÎÊý£¬±íʾ×Ö´®µÄ×î´ó×Ö½ÚÊý£¬²»ÒªÈÃËü³¬¹ýÒѾ·ÖÅäµÄÄÚ´æ¡£
39
4¡¢ÓÃAttachStr½«±¾×Ö´®¶ÔÏóAttachµ½Ä³¸ö×Ö´®£¨±ÈÈçÉÏÃæµÄy£©ÉϺ󣬲»ÄÜÔÙ¶ÔÕâ¸ö×Ö´®yÖØÐ¸³Öµ£¬Ò²²»Äܽ«Æä´«µÝµ½»á¶ÔÆäÖØÐ¸³ÖµµÄ¹ý³Ì¡£
ÍÛ£¬Õâô¶àÐèҪעÒâµÄÎÊÌ⣬ÓÃÆðÀ´Æñ²»ÊǸü²»·½±ã¡£µÄÈ·£¬ÓÃËüµÄ֮ǰҪ¿¼ÂÇÊDz»ÊDZØÐëµÄ¡£ÒòΪ½¨Á¢Õâ¸öÀàÒ²Ò»ÑùÓпªÏú¡£ËùÒÔ»¹ÓÐÒ»¸öÐèҪעÒâµÄÎÊÌ⣺
5¡¢ËüÖ÷ÒªµÄÓ¦Óû¹ÊÇÔÚÓÚ½«×Ö´®°²·ÅÔÚÖ¸¶¨ÄÚ´æ´¦¡£ËäÈ»ËüÒ²¿ÉÒÔÈÃͬһ¸ö½ø³ÌÄÚ¼¸¸öµÄ×Ö´®´ïµ½¹²ÏíµÄÄ¿µÄ£¬µ«ÊÇÈç¹ûÖ»ÊÇÁ½Èý¸öºÜСµÄ×Ö´®ÕâÑùʱ×ö·´¶øÂýÁË¡£
ºó¼Æ£º
Êý×éÖ¸ÕëºÍ×Ö´®Ö¸ÕëÎÒÃÇÒѾ̸¹ýÁË£¬¶ÔÓÚÆÕͨµÄÊýÖµÀàÐͱäÁ¿µÄÖ¸ÕëûÓÐʲôHackµÄ±ØÒª£¬µ«ÊÇËü¹ØÏµµ½Ò»¸öÓÐÓõļ¼Êõ£¬ÏÂÆªÎÄÕÂÔÙ̸¡£
±¾ÎĺÍÏÂÆªÎÄÕµĴúÂ룬ÒÔ¼°ÓÃÕâ¸öÀàÀ´ÊµÏֵĹ²ÏíÄÚ´æµÄ´úÂ룬Îһᷢ²¼µ½CSDN¹²ÏíÈí¼þÉÏ£¬Ãû×ÖÊÇ¡¶ÄÚ´æ¹²ÏíºÍÖ¸Õë¡·¡£
40
ÕæÏë²»µ½Ö®Áù£ºÓÐÓõļ¼ÊõºÍûÓõÄÖ¸Õë ¹Ø¼ü×Ö£ºVB¡¢SafeArray¡¢ÊýÖµÀàÐÍÖ¸Õë ÄѶȣºÖм¶ ²Î¿¼ÎÄÕ£º
1¡¢2000Äê7ÔÂVBPJ Black BeltרÀ¸ÎÄÕ¡¶Modify a Varialbe's Pointer¡· ×÷ÕߣºBill McCarthy
ÒýÑÔ£º
ÕâÕæµÄÊÇÖ¸ÕëרÌâµÄ×îºóһƪÁË£¨µ±È»£¬ÒÔºó¿Ï¶¨»¹»áÌáµ½Ö¸Õ룩¡£Ö÷ÒªÊÇÀ´Ì¸Ì¸Bill McCarthyµÄÎÄÕ¡¶Modify a Varialbe's Pointer¡·µÄ¾«»ª¡£¹ØÓÚÕâÆªÎÄյͫÎ÷£¬ÔÚÎҵġ¶VBÖ¸Õë¿û»¨±¦µäÖ®SafeArray¡·ÀïÔøÌ¸µ½¹ý£¬µ«ÄÇÆªÎÄÕÂʵ¼ÊÉÏûÓÐд³öSafeArrayµÄ¾«»ª£¬ÓÃSafeArray×îÃîµÄµØ·½ÔÚÓÚ¿ÉÒÔ½«Ò»¸ö±äÁ¿½¨ÔÚÖ¸¶¨µÄÄÚ´æ´¦£¬¾ÍÏóÉÏһƪÎÄÕ¸ø³öµÄÄǸö×Ö´®ÀàÒ»Ñù¡£
ÕýÎÄ£º
Bill McCarthyÔÚÄÇÆª¡¶Modify a Varialbe's Pointer¡·ÀïÓÃSafeArrayʵÏÖ¶à½ø³ÌµÄÊý×é¹²ÏíÄڴ棬Ëû¿¼ÂÇÁËÊý×é±äÁ¿µÄÀàÐÍ£¬Òò´Ë¿ÉÒÔ¼æÈݴ󲿷ÖÊýÖµÀàÐ͵ÄÊý×飬ÊÇÒ»¸ö·Ç³£²»´íµÄ¶«Î÷¡£ÎÒÕâÀï²»½²ËüʵÏֵľßÌå·½·¨£¬Ö»ÊÇÏëºÍ´ó¼ÒÒ»Æð¿´¿´SafeArray»¹ÄÜ×öʲô¡£ ÐÞ¸ÄSafeArray½á¹¹µÄpvDataÖ¸ÕëÈ´ÊÇÒ»¸ö·Ç³£ÓÐÓõļ¼Êõ£¬Í¨¹ýÐÞ¸ÄpvData£¬¾ÍÄܹ»Í¨¹ýÊý×éÖ±½Ó·ÃÎÊÖ¸¶¨µÄÄÚ´æ¡£
ºÍÉÏһƪÎÄÕ°ü×°×Ö´®Ö¸ÕëÀàÒ»Ñù£¬Í¨¹ýÐÞ¸ÄpvData£¬ÎÒÃÇÒ²¿ÉÒÔ°üװһЩÆÕͨÊýÖµÀàÐͱäÁ¿µÄÖ¸ÕëÀà¡£
ÎÒÔÚÖ¸ÕëµÄµÚһƪÎÄÕÂÀï˵¹ý£¬ÒªÏëʵÏÖCÓïÑÔÀï'*'Õâ¸öȡָÕëËùÖ¸±äÁ¿Öµ¹¦ÄÜ£¬±ØÐëÒªÓÃCopyMemory¡£Êµ¼ÊÉÏ£¬ÎÒ˵´íÁË£¬ÎÒÃÇÍêÈ«¿ÉÒÔʵÏÖºÍCÀïÒ»ÑùµÄÖ¸Õ룬ÈçÏ£º //CÓïÑÔ
Long L;
Long* pL = &L; *pL = 12;
printf(\ *pL = %d\
'VBÀï
Dim pL As New pLong, L As Long pL.Attach L
'Ò²¿ÉÒÔ pL.Ptr = VarPtr(L) pL = 12
Debug.Print \ *pL =\
½á¹û¶¼Äܹ»Í¨¹ýÐÞ¸ÄpLÖ¸Õ룬´ïµ½Ð޸ıäÁ¿LµÄÄ¿µÄ¡£
ÉÏÃæVB´úÂëÀïµÄpLong¾ÍÊÇÒ»¸ö°ü×°ºÃµÄLongÐͱäÁ¿µÄÖ¸ÕëÀ࣬ÏÂÃæ¿´¿´ÈçºÎÀ´ÊµÏÖËü£º
Option Explicit
'******************************************************** 'pLong.cls
41
'°ü×°Ò»¸öLongÐÍÖ¸ÕëµÄÀà
'×÷Õß: Ðܳ¬ ID: AdamBear 2002Äê3ÔÂ18ÈÕ 'http://www.csdn.net/Author/AdamBear
' Äã¿ÉÒÔ×ÔÓÉʹÓñ¾ÀàÄ£¿é£¬²»¹ýÇë±£Áô±¾ÉùÃ÷
'********************************************************
Private Declare Sub CopyMemory Lib \Any, Source As Any, ByVal Length As Long)
Private m_Arr(0) As Long
'ȱʡÊôÐÔ
Public Property Get Data() As Long Data = m_Arr(0) End Property
Public Property Let Data(ByVal Value As Long) m_Arr(0) = Value End Property
Public Sub Attach(Target As Long) Ptr = VarPtr(Target) End Sub
Public Property Let Ptr(ByVal Target As Long) Dim pSA As Long
'µÃµ½SafeArray½á¹¹Ö¸ÕëpSA
CopyMemory pSA, ByVal VarPtrArray(m_Arr), 4 'Õâ¸öÖ¸ÕëÆ«ÒÆ12¸ö×Ö½Úºó¾ÍÊÇpvDataÖ¸Õë CopyMemory ByVal (pSA + 12), Target, 4
End Property
Public Property Get Ptr() As Long Ptr = m_SA.pvData End Property
Private Sub Class_Terminate()
CopyMemory ByVal VarPtrArray(m_Arr), 0&, 4 End Sub
42
Òª½«Ëü¸Ä³ÉByteµÄÖ¸ÕëÀֻ࣬ÐèÒª½«ÉÏÃæµÄ´úÂëÖÐm_ArrÊý×éµÄÀàÐÍ£¬DataÊôÐÔºÍAttach·½·¨ÖеIJÎÊýÀàÐ͸ÄΪByteÐͼ´¿É¡£
µ±ÎÒÃÇÕâÑù×ö³öpLong¡¢pByte¡¢pIntegerºó£¬ÎÒÃǾÍÄܹ»ÍæµãºÍCÀïÒ»ÑùµÄ»¨ÑùÁË¡£ Sub Main()
Dim pB As New pByte, B As Byte Dim pI As New pInteger, I As Integer Dim pL As New pLong, L As Long
'ÓÃAttach·½·¨½«¾¹ýÀàÐͼì²é£¬Ö±½ÓÓÃPtrÊôÐÔÔò¿ÉÒÔÈÆ¹ýÀàÐͼì²é pB.Attach B pI.Attach I pL.Attach L
'ÊÔÊÔÖ¸Õë B = 1
Debug.Print \ *pB =\
pB = 1
Debug.Print \ *pB =\
I = 1000
Debug.Print \ *pI =\
pI = 2000
Debug.Print \ *pI =\
L = 40000
Debug.Print \ *pL =\
pL = 60000
Debug.Print \ *pL =\
'ÊÔÊÔCÀïµÄÀàÐÍת»»
'ÓÃIntegerÖ¸Õë·ÃÎÊLongÐͱäÁ¿ pI.Ptr = VarPtr(L)
Debug.Print \ End Sub
¸ã³öÕ⼸ÖÖÆÕͨÊýÖµÀàÐ͵ÄÖ¸ÕëÀàÓÐʲôÓã¿»ù±¾ÉÏûÓÐʲô´óÓᣲ»¹ýÊÇÖ¤Ã÷Ò»ÖÖ·½·¨µÄ¿ÉÐÐÐÔ£¬ºÍÑÝʾ¼¼Êõ¡£ÕâÖÖ¼¼Êõ»¹ÓÐʲôÓã¬ÐèÒªµÄʱºò»¹»áÔÙ̸¡£
ºó¼Ç£º
43
±¾ÎĵĶ«Î÷£¬¿É¼ûCSDN¹²ÏíÈí¼þÉϵġ¶ÄÚ´æ¹²ÏíºÍÖ¸Õë¡·£¬
Ö¸ÕëµÄרÌâ¾Íµ½Õâ¶ùÁË£¬ÏÂһƪ׼±¸¿ªÊ¼×ÅÊÖдVBºÍCOMµÄÒ»¸öϵÁÐÎÄÕ£¬Æä¼äÎÒ×¼±¸·Òëһϡ¶VB Design Patterns¡·£¬ÕâÊÇÒ»±¾²»´íµÄÊé¡£
44
Matthew Curland¼ò½é£º
Visual Studio¿ª·¢Ð¡×é³ÉÔ±£¬²ÎÓ뿪·¢ÁËVBµÄIntelliSenseºÍObject Browser¡£ËûÊÇVB×ÊÉîר¼Ò£¬¶ÔVBÓзdz£ÉîÈëµÄÑо¿£¬¿°³ÆVB´óʦ¡£ËùÖø¡¶Advanced Visual Basice¡·ÊDzûÊöVB¸ß¼¶±à³Ì¼¼ÇɵÄÒ»±¾ºÃÊé¡£ ±¾ÎÄÓ¢ÎÄÔÖø¿É¼û2000Äê2Ô·ݡ¶Visual Basic Programmer's Journal¡·£¨VB³ÌÐòÔ±Ô¿¯£©ÀïµÄ¡¶Call Function Pointers¡·£¬ÕâÊÇËû·¢±íµÄÃîÎÄÖ®Ò»£¬ËûµÄÊéÀïµÄµÚ11Õºͱ¾ÎÄͬÃû£¬±¾ÎÄÓ¦¸ÃÊÇÕâÒ»Õ½ڵľ«»ª¡£
Ö®ËùÒÔÍÆ¼ö´ËÎÄ£¬ÊÇÒòΪËü×ÛºÏÔËÓÃÁËVBÀïµÄ²»ÉÙ¼¼Êõ¡£ÎÒÃǿɴÓÖп´µ½Matt´óʦ¶ÔVBµÄÉî¿ÌÀí½â£¬¶ø¸÷λ¼¼ÊõµÄ×ÛºÏÔËÓÃÕýÌåÏÖÁËËûÉîºñµÄ¹¦Á¦¡£
±¾ÎÄÔÎÄ£ºhttp://www.devx.com/premier/mgznarch/vbpj/2000/02feb00/mc0200/mc0200.asp (ÒªÏÈ×¢²á³ÉpremierÓû§) ±¾ÎÄÅäÌ×´úÂ룺
http://www.devx.com/free/mgznarch/vbpj/code/2000/02feb00/vb0002mc_p.zip
¹Ø¼ü×Ö£ºº¯ÊýÖ¸Õ룬COM¡¢¶ÔÏó¡¢½Ó¿Ú£¬vTalbe£¬VB»ã±à£¬¶¯Ì¬DLLµ÷Óᣠ¼¶±ð£º¸ß¼¶
ÒªÇó£ºÁ˽âVB¶ÔÏó±à³Ì£¬Á˽â»ã±à¡£
µ÷Óú¯ÊýÖ¸Õë ͨ¹ýʹÓú¯ÊýÖ¸Õ룬ÎÒÃÇÄܹ»¶¯Ì¬µØÔÚ´úÂëÖвåÈ벻ͬÐÐΪµÄº¯Êý£¬´Ó¶øÊ¹´úÂëÓµÓж¯Ì¬¸Ä±ä×ÔÉíÐÐΪµÄÄÜÁ¦¡£
×÷ÕߣºMatther Curland
ÒªÇó£ºÊ¹Óñ¾ÎĵÄʾÀý´úÂ룬ÄãÐèÒªVB5»òVB6µÄרҵ°æ»òÆóÒµ°æ¡£
´ÓVisual Basic 5.0¿ªÊ¼BasicÓïÑÔÒýÈëÁËÒ»¸öÖØÒªµÄÌØÐÔ£ºAddressOfÔËËã·û¡£Õâ¸öÔËËã·ûÄܹ»ÈÃVB³ÌÐòÔ±Ö±½ÓÌå»áµ½½«×Ô¼ºµÄº¯ÊýÖ¸ÕëËͳöÈ¥µÄ¿ì¸Ð¡£±ÈÈçÎÒÃÇÔÚVBÀï¾ÍÄܹ»µÃµ½ÏµÍ³×ÖÌåµÄÁÐ±í£¬ÎÒÃÇÄܹ»Í¨¹ý±ê×¼µÄAPIµ÷ÓÃÀ´½øÐÐ×ÓÀ໯¡£Ò»¾ä»°£¬ÎÒÃÇÖÕÓÚ¿ÉÒÔÏóÎĵµÀïËù˵µÄÄÇÑùÀ´Ê¹ÓÃWin32 APIÁË¡£
²»¹ý£¬Õâ¸öÐÂÍæ¾ßÖ»ÄܸøÎÒÃÇ´øÀ´¶ÌÔݵĿì¸Ð£¬ÒòΪÕâ¸öÀñÎï²¢²»ÍêÕû¡£ÎÒÃÇ¿ÉÒÔËͳöº¯ÊýÖ¸Õ룬µ«È´Ã»ÈËÄܽ«º¯ÊýÖ¸ÕëË͸øÎÒÃÇ¡£ÊÂʵÉÏ£¬ÎÒÃÇÉõÖÁ²»ÄܸøÎÒÃÇ×Ô¼ºËͺ¯ÊýÖ¸Õ룬ÕâʹÎÒÃDz»Äܹ»ÌåÑéËÍÀñµÄÕæÕýÀÖȤ£¨ÒëÕߣººÇºÇ£¬¹âËÍÀñÈ´²»ÄÜÊÕÀñµÄȷûȤ£©¡£AddressOfÈÃÎÒÃÇ¿´µ½Á˹ãÙóÌìµØµÄÒ»½Ç£¬µ«ÊÇVBÈ´²»ÈÃÎÒÃÇÈ«ÃæµØÌ½Ë÷Ëü£¬ÒòΪVB¸ù±¾¾Í²»ÈÃÎÒÃǵ÷Óú¯ÊýÖ¸Õ룬ÎÒÃÇÖ»ÄÜÌṩº¯ÊýÖ¸Õ루ÒëÕߣº¿ÉÒÔÏȽ«º¯ÊýÖ¸ÕëË͸øAPI£¬È»ºóÈÃAPI»Øµ÷×ÔÒѵĺ¯ÊýÖ¸ÕëÀ´Íê³Éº¯ÊýÖ¸Õëµ÷ÓõŦÄÜ£¬µ«Õ⻹ÊÇÒªÏȰÑÀñÎïË͸ø±ðÈË£©¡£Æäʵ£¬ÎÒÃÇÄܹ»×Ô¼ºÀ´ÊµÏÖµ÷Óú¯ÊýÖ¸ÕëµÄ¹¦ÄÜ£¬ÎÒÃÇ¿ÉÒÔÊÖ¹¤½«Ò»¸ö¶ÔCOM½Ó¿ÚµÄvTable°ó¶¨µ÷Óñä³ÉÒ»¸öº¯ÊýÖ¸Õëµ÷Óá£×îÃîµÄÊÇ£ºÎÒÃÇÄܹ»ÔÚ´¿VBÀïд³öµ÷Óú¯ÊýÖ¸ÕëµÄ´úÂ룬²»ÐèÒªÈκθ¨ÖúµÄDLL¡£
¸æËß±àÒëÆ÷º¯ÊýÖ¸ÕëÊÇʲôÑù×Ó£¬ÊÇʹVBÄܹ»µ÷ÓÃÈκκ¯ÊýµÄ¹Ø¼ü¡£½«²ÎÊýÀàÐͺͷµ»ØÖµÀàÐͽ»¸øVB±àÒëÆ÷£¬ÈñàÒëÆ÷½«ÎÒÃǵĺ¯Êýµ÷ÓñàÒëµ½ÎÒÃǵijÌÐòÀÕâÑù³ÌÐò²ÅÄÜÔÚÔËÐÐʱ֪µÀÔõÑùÈ¥¶¨Î»º¯Êý¡£ÔÚ³ÌÐò±»±àÒëºó£¬Ò»¸öº¯Êý¾ÍÊÇÄÚ´æÀïÒ»´®»ã±à×Ö½ÚÁ÷£¬Í¨
45
¹ýCPU½âÊÍÖ´ÐжøÐγÉÎÒÃǵijÌÐò¡£µ÷ÓÃÒ»¸öº¯ÊýÖ¸Õ룬Ê×ÏÈÐèÒª³ÌÐò»ñµÃÖ¸ÏòÕâ¸öº¯Êý×Ö½ÚÁ÷µÄÖ¸Õ룬ÔÙͨ¹ýx86»ã±àÖ¸Áîcall½«µ±Ç°Ö¸ÁîÖ¸Õë(Òë×¢£º¼´x86»ã±àÀïµÄIP¼Ä´æÆ÷)תµ½º¯ÊýËùÔÚµÄ×Ö½ÚÁ÷ÉÏ¡£ÔÚº¯ÊýÍê³Éºó£¬ÔÙÓÃretÖ¸Áî·µ»Ø¸øµ÷Óô˺¯ÊýµÄ³ÌÐòÀ´¼ÌÐø²Ù×÷¡£
ÎÒÏÂÃæ½«ÒªÌáµ½µÄ·½·¨£¬ÀûÓÃÁËVB×Ô¼ºµÄº¯Êýµ÷Ó÷½Ê½£¬ËùÒÔÎÒÏÈÀ´½âÊÍÒ»ÏÂVBÊÇÔõÑùÀ´ÊµÏÖº¯Êýµ÷Óõġ£VBÄÚ²¿Ê¹ÓÃÈýÖÖº¯ÊýÖ¸Õ룬µ«ÊÇ£¬ÔÚ±¾ÖÊÉÏ£¬²»ÂÛVBÊÇÈçºÎÀ´¶¨Î»Õ⼸ÀຯÊýÖ¸Õ룬µ÷ÓÃËüÃǵķ½·¨È´ÊÇÒ»ÑùµÄ¡£VB±àÒëÆ÷±ØÐëÖªµÀ׼ȷµÄº¯ÊýÔÐͲÅÄÜÉú³Éµ÷Óú¯ÊýµÄ´úÂë¡£
µÚÒ»À࣬×î³£¼ûµÄº¯ÊýÖ¸ÕëÀàÐÍ£¬¾ÍÊÇVBÓÃÀ´µ÷Óú¯ÊýµÄÆÕָͨÕ룬ÕâÑùµÄº¯Êý¶¨ÒåÔÚ±ê׼ģ¿éÄÚ£¨»òÀàÄ£¿éÀïµÄÓÑÔªº¯ÊýºÍ˽Óк¯Êý£©¡£µ÷ÓÃÓÑÔªº¯ÊýºÍ˽Óк¯Êýʱ£¬µ÷ÓÃÖ¸ÁλÔÚµ±Ç°Ö¸ÁîÖ¸ÕëµÄÒ»¸öÆ«ÒÆµØÖ·´¦£¬»òÕßÏÈÌøµ½Ò»¸ö¼Ç¼×ź¯ÊýλÖõIJéÕÒ±íÀÔÙÌøµ½º¯ÊýÄÚ£¨ÒëÕߣº¼´ÏÈ\¾ø¶ÔµØÖ·\Ìøµ½Ò»¸öÌø×ª±íÄÚ£¬±íÀïµÄÿ¸öÈë¿Ú¶¼ÊÇÒ»¸ö\µ½º¯Êý£©¡£ÕâЩº¯Êý¶¼ÔÚͬһ¸ö¹¤³ÌÄÚ£¬Áª½áÆ÷×ÜÊǽ«ËùÓеÄÄ£¿éÁª½áÔÚÒ»Æð£¬ËùÒÔ×ÜÊÇÖªµÀÔÚÄÚ´æºÎ´¦Äܹ»ÕÒµ½VBÄÚ²¿º¯Êý£¬Òò´Ë×ªÒÆ¿ØÖƵ½ÄÚ²¿º¯Êýʱ£¬ÆäÔËÐÐʱ¿ªÏúÊǺÜÉٵġ£
VB¶ÔijЩº¯ÊýÖ¸ÕëµÄµ÷ÓÃÈ´À§Äѵöà
¶ÔÓÚÁíÁ½ÀຯÊýÖ¸Õ룬VB±ØÐëÔÚÔËÐÐʱ½øÐжîÍâµÄ¹¤×÷²ÅÄܹ»ÕÒ³öËüÃÇ¡£
µÚ¶þÀ࣬VBµ÷ÓÃÒ»¸öCOM¶ÔÏó½Ó¿ÚÀïµÄ·½·¨¡£ÎÒÃÇ¿ÉÄÜÈÏΪ½¨Á¢COM¶ÔÏóµÄ¹¤×÷ÊÇÏ൱¸´Ôӵģ¬Èç¹ûÍêÈ«ÓÃVBÀ´ÎªÎÒÃǽ¨ÔìCOMµÄËùÓÐ×é³É²¿·ÖµÄ»°£¬µ«ÊÂʵÉϲ¢²»ÊÇÕâÑù¡£°´ÕÕCOMµÄ¶þ½øÖƱê×¼£¬Ò»¸öCOM¶ÔÏóÊÇÒ»¸öÖ¸Õ룬Õâ¸öÖ¸ÕëÖ¸ÏòÒ»¸ö½á¹¹£¬Õâ¸öÌØ¶¨½á¹¹µÄµÚÒ»¸öÔªËØÊÇÒ»¸öÖ¸Ïòº¯ÊýÖ¸ÕëÊý×éµÄÖ¸Õë¡£Õâ¸öº¯ÊýÖ¸ÕëÊý×飨ÓÖ½ÐÐéÄ⺯Êý±í£¬¼ò³ÆvTable£©ÀïµÄǰÈý¸öÖ¸Õ룬һ¶¨ÊDZê×¼QueryInterface£¬AddRef£¬Releaseº¯Êý¡£vTableÀï½ÓÏÂÀ´µÄº¯Êý·ûºÏ¸ø¶¨µÄCOM¶ÔÏó½Ó¿Ú¶¨ÒåÀïµÄº¯Êý¶¨Ò壨¼ûͼһ£©
ͼһ£º
º¯ÊýÖ¸Õë´úÀíÊÇÔõô¹¤×÷µÄ£¿click here
µ±VBͨ¹ýÒ»¸ö¶ÔÏóÀàÐ͵ıäÁ¿À´µ÷ÓÃÒ»¸öCOM¶ÔÏóµÄ·½·¨»òÊôÐÔʱ£¬Õâ¸ö±äÁ¿Àï´æ·Å×ŶÔÕâ¸öCOM¶ÔÏó½Ó¿ÚµÄÒýÓá£VBÒª¶¨Î»º¯Êýʱ£¬Ê×ÏÈҪͨ¹ýCOMÒýÓõĵÚÒ»¸öÔªËØÀ´»ñµÃÖ¸ÏòvTalbeµÄÖ¸Õ룬Ȼºó²ÅÄÜÔÚvTableÀﶨλº¯ÊýÖ¸Õë¡£¶ÔÒ»¸övTableµ÷ÓÃÀ´Ëµ£¬±àÒëÆ÷ÌṩÁËCOMÒýÓúͺ¯ÊýÖ¸ÕëÔÚvTableÀïµÄÆ«ÒÆÁ¿¡£ÕâÑùº¯ÊýÖ¸Õë²ÅÄÜÔÚÔËÐÐʱ±»¶¯Ì¬µØÑ¡³öÀ´¡£ÕâÖÖË«Ïò¼ä½ÓµÄ·½Ê½¡ª¡ªÁ½ÖÖÖ¸Õë¶¼±ØÐë±»¼ÆË㣨Òë×¢£ºÖ¸ÏòvTalbeµÄÖ¸ÕëºÍvTableÀïµÄº¯ÊýÖ¸Õë¶¼±ØÐëÔÚÔËÐÐʱ²ÅÈ·¶¨£©¡ª¡ªÊ¹µÃvTableµ÷ÓñÈͬһ¸ö¹¤³ÌÄÚµÄÖ±½Óµ÷ÓÃÂýµÃ¶à£¬ÒòΪֱ½Óµ÷Óò»ÐèÒªÈκÎÔÚÔËÐÐʱ²ÅÄܽøÐеÄÖ¸Õë¼ä½ÓÖ¸¶¨¡£
VB¶Ô´ýͬһ¸ö¹¤³ÌÀïµÄÀàµÄ¹«Óз½·¨ºÍ¶Ô´ýÍⲿCOM¶ÔÏóÀï·½·¨ÍêȫһÑù£¬¶¼ÐèÒª²éÕÒvTable£¬Õâ¾ÍÊÇΪʲôÔÚͬһ¸ö¶ÔÏóÄÚµ÷ÓÃÒ»¸öÓÑÔªº¯Êý»á±Èµ÷ÓÃÒ»¸ö¹«Óк¯Êý¿ìµÃ¶àµÄÔÒò¡£µ«ÊÇ£¬²éÕÒvTableÊÇCOMµÄ»ù´¡£¬ËüʹµÃVBÄܹ»Ê¹ÓôÓÍⲿ¿âÀïÔØÈëµÄCOM¶ÔÏó£¬Ò²ÊÇÏóImplementsÕâÑùµÄ±à³Ì¸ÅÄîµÄʵÏÖ»ù´¡¡£¶¯Ì¬ÔØÈë²»¿ÉÄÜͨ¹ý¾²Ì¬Áª½áÀ´Êµ
46
ÏÖ£¬²éÕÒvTableµÄ»¨·ÑÊÇʹÓö¯Ì¬ÔØÈë±ØÐ븶³öµÄ´ú¼Û¡£
ͨ¹ýObjectÐͱäÁ¿À´½øÐеĺóÆÚ°ó¶¨µ÷Óò»Í¬ÓÚvTable°ó¶¨µ÷Óᣵ±È»£¬ÕâÖÖ²î±ð²»ÔÚÓÚVBÓÃûÓÃvTable£¬ÕâÖÖ²î±ðÊÇÒòΪ¶ÔºóÆÚ°ó¶¨µ÷ÓÃVBʹÓÃÁ˲»Í¬µÄvTable¡£µ±½øÐкóÆÚ°ó¶¨µ÷ÓÃʱ£¬±àÒëÆ÷»áµ÷ÓÃIDispatch½Ó¿ÚµÄGetIDsOfNemesºÍInvoke¡£ÕâÐèÒªÁ½´ÎvTableµ÷ÓúÍÏ൱¶àµÄ²ÎÊý´«µÝ£¬ËùÒÔÕâÑùµÄ´¦Àí·Ç³£Âý£¬¶øÇÒ±ØÐë²»¶ÏµØ¶¨Î»Invoke£¬²ÅÄÜͨ¹ýÀàÐÍÐÅÏ¢µ÷Óõ½ÕæÕýµÄº¯ÊýÖ¸Õ루ÒëÕߣºÕæÕýÂýµÄÔÒò»¹ÊÇInvokeËù½øÐеIJÎÊýµ÷Õû¡£µ±ÓµÓÐÏàÓ¦¶ÔÏóµÄ½Ó¿ÚÀàÐÍ¿âÐÅϢʱ£¬VB»á½øÐÐÁíÒ»ÖÖºóÆÚ°ó¶¨¡ª¡ªDispID°ó¶¨£¬ËüÖ»ÐèÒªÔÚµÚÒ»´Î·ÃÎʶÔÏóʱµ÷ÓÃGetIDsOfNemes£¬À´»ñµÃËùÓÐÊôÐԺͷ½·¨µÄDispID£¬ÒÔºóµÄµ÷ÓÃÖ»ÐèÒª¶ÔInvoke½øÐÐÒ»´ÎvTalbeµ÷Ó㬵«ÓÉÓÚInvoke²ÅÊÇÂýµÄÔÒò£¬ËùÒÔDispID°ó¶¨±ÈÒ»°ãºóÆÚ°ó¶¨¿ì²»Á˶àÉÙ£©¡£ÎãÓ¹ÖÃÒÉ£¬µ±ÔÚͬһ¸öÏß³ÌÀïµ÷ÓÃCOM¶ÔÏóʱ£¬ºóÆÚ°ó¶¨½«±ÈvTalbe°ó¶¨Âý¼¸¸öÊýÁ¿¼¶£¨ÒëÕߣºÍ¬Ïß³ÌÄÚÒªÂýÊý°Ù±¶¡£ÓÉÓÚ¿ç±ß½çµÄµ÷Å俪Ïú£¬Ëæ¿çÏ̡߳¢¿ç½ø³Ì¡¢¿ç»úÆ÷£¬Á½Öְ󶨷½Ê½ÔÚËÙ¶ÈÉϵIJî±ð½«Ô½À´Ô½Ð¡£©
µÚÈýÀ࣬ͨ¹ýDeclareÓï¾äÀ´Ê¹Óú¯ÊýÖ¸Õë¡£DeclareʹµÃVBÄܹ»¶¯Í¨¹ýLoadLibraray APIÀ´¶¯Ì¬ÔØÈëÌØ¶¨µÄDLL£¬²¢Í¨¹ýGetProcAddress APIºÍº¯ÊýÃû£¨»òº¯Êý±ðÃû£©À´µÃµ½DLLÀïÌØ¶¨µÄº¯ÊýÖ¸Õë¡£ÉùÃ÷ÔÚÀàÐÍ¿âÀïµÄº¯ÊýÖ¸ÕëÊÇÔÚ³ÌÐò×°Èëʱͨ¹ýimport table£¨ÊäÈë±í£©À´ÔØÈëµÄ£¬¶øÍ¨¹ýDeclareÓï¾äÉùÃ÷µÄº¯ÊýÖ¸ÕëÊÇÔڴ˺¯ÊýµÚÒ»´Î±»µ÷ÓÃʱװÈ루ÒëÕߣºÕâÁ½ÖÖ·½Ê½¸÷ÓÐÓÅȱµã¡£Ê¹ÓÃDeclareÔÚµ÷ÓÃÊ±ÔØÈ룬һÀ´VBÔËÐÐʱֱ½ÓÖ§³Ö£¬Ê¹Óüòµ¥£¬¶þÀ´µ±ÐèÒªÔØÈëµÄDLL²»´æÔÚʱ¿ÉÒÔÔÚÔËÐÐʱͨ¹ý´íÎó²¶»ñÀ´´¦Àí¡£¶øÊ¹ÓÃÀàÐÍ¿âÒ»´ÎÐÔÔØÈ룬һÊÇ»áÔö¼ÓÔØÈëʱ¼ä£¬¶þÊǵ±ÏàÓ¦µÄDLLÕÒ²»µ½Ê±³ÌÐò¸ù±¾¾ÍÎÞ·¨Æð¶¯£¬µ«ÊÇͨ¹ýÀàÐÍ¿âµ÷ÓÃAPI¿ÉÒÔÈÆ¹ýVBÔËÐÐʱ¶¯Ì¬µÄDLLÔØÈë¹ý³Ì£¬ÕâÔÚijЩʱºòºÜÓбØÒª£©¡£
¶¯Ì¬Ö¸¶¨º¯ÊýÖ¸Õë
ÎÞÂÛÊÇDeclare»¹ÊÇ¿âÐͿ⣬µ±º¯ÊýÔØÈëºó£¬VBµ÷Óú¯ÊýÖ¸ÕëµÄ·½Ê½ÊÇÒ»ÑùµÄ¡£Ö¸ÕëÒѾÒòΪÏÈǰµÄµ÷Óöø±»ÔØÈëÁË£¬ËùÒÔµÚ¶þ´Îµ÷Óûá¸ü¿ì£¬²¢ÇÒËٶȽӽüµ÷Óþ²Ì¬Áª½áµÄº¯Êý¡£DeclareÓï¾äÊÇVBµ÷Óö¯Ì¬ÔØÈëµÄº¯ÊýÖ¸ÕëµÄ×î×ÔÈ»µÄ·½·¨¡£µ«ÊÇ£¬º¯ÊýÖ¸ÕëÓÉVB¾ö¶¨¶ø²»ÊÇÓÉÎÒÃÇÀ´Ö¸¶¨£¨ÒëÕߣº´ËΪÔÎÄÖ±Ò룬Òâ˼Ӧ¸ÃÊÇ£ºº¯ÊýÖ¸ÕëÖ»ÄÜÔÚ±àÒëǰָ¶¨£¬ÓÉVBÀ´ÔØÈ룬¶ø²»ÄÜÔÚÔËÐÐʱָ¶¨ÓÉÎÒÃÇ×Ô¼º¶¯Ì¬ÔØÈëµÄº¯ÊýÖ¸Õ룩£¬ËùÒÔÎÒÃDz»ÄÜÓÃDeclareÓï¾äÀ´µ÷ÓÃÈÎÒâµÄº¯ÊýÖ¸Õë¡£DeclareÓï¾äµÄÏÞÖÆÊ¹ÎÒÃÇÖ»ÄÜÔØÈëÔÚÉè¼ÆÊ±Í¨¹ýLibºÍAlias×Ö¾äÖ¸¶¨µÄº¯Êý¡£
µ½ÕâÀÎÒÒѾ½âÊÍÁËVBÊÇÔõôÑùÀ´µ÷ÓÃ×Ô¼ºµÄº¯ÊýÖ¸ÕëµÄ¡£¶ÔVB±¾ÉíûÓеŦÄܽøÐÐÀ©Õ¹¶¼Ó¦¸Ãͨ¹ýVB±¾ÉíÌṩµÄ¹¤¾ßÀ´ÊµÏÖ£¨ÒëÕߣº¿´À´×÷ÕßMattÊÇһλVB´¿´âÂÛÖ§³ÖÕߣ©¡£¾²Ì¬Áª½á²»Óÿ¼ÂÇ¡ª¡ªÈç¹ûÄãϲ»¶×Ô¼ºÐÞ¸ÄPEÎļþÍ·µÄ»°£¬Çë×Ա㣨ÒëÕߣº¹ØÓÚÐÞ¸ÄPEÍ·À´HookÊäÈ뺯ÊýµÄ·½·¨£¬ÔÚ1998Äê2ÔÂMSJרÀ¸BugslayerÀJohn Robbins´óʦ¾ÍÓô¿VBʵÏÖÁËHookImportedFunctionsByName£¬²»¹ýÓÃÀ´µ÷Óú¯ÊýÖ¸ÕëÄÇÊÇɱ¼¦ÓÃÅ£µ¶£©¡£ÎÒÃDz»¿ÉÄܾ²Ì¬µØÖ¸¶¨º¯ÊýÖ¸Õ룬ËùÒÔDeclareÓï¾äÒ²²»Óÿ¼ÂÇ¡£µ«ÊÇ£¬ÎÒÃÇÄܹ»ÔÚVBÀï×Ô¼ºÓÃLoadLibarayºÍGetProcAddressÕâÁ½¸öAPIÀ´´ÓÍⲿDLLÀï»ñÈ¡º¯ÊýÖ¸Õ룬¾ÍÏóDeclareΪÎÒÃÇ×öµÄÄÇÑù¡£vTableµ÷ÓÃÊÇΨһһÖÖÈÃVB×ÔÒѰ󶨺¯ÊýµÄµ÷Ó÷½Ê½¡£ÎÒÃǵÄÈÎÎñÊǽ¨Ò»¸ö·ûºÏCOM¶þ½øÖƱê×¼µÄ½á¹¹£¬ÔÙ½«Õâ¸öÊÖ¹¤½¨Á¢µÄCOM¶ÔÏóµÄÒýÓ÷ŵ½Ò»¸ö¶ÔÏóÀàÐ͵ıäÁ¿ÀȻºóµ÷ÓÃÊÖ¹¤½¨Á¢µÄvTableÈë¿Ú¡£Í¨¹ýµ÷ÓÃÕâ¸övTableÀïµÄº¯Êý£¬¾ÍÄܹ»Ö±½Ó´úÀíµ½Òªµ÷Óõĺ¯ÊýÖ¸Õë¡£ÎÒ³ÆÕâ¸ö¶ÔÏóΪFunctionDelegotor£¨º¯Êý´úÀíÕߣ©¡£
47
Õâ¸ö·½·¨ÐèÒªÎÒÃǽâ¾öÈý¸öÌØÓеÄÎÊÌâ¡£µÚÒ»£¬vTalbeµ÷ÓÃÓжîÍâµÄ²ÎÊý£¨thisÖ¸Õ룩£¬ÎÒÃDz»Ï뽫ËüÒ²´«¸øÎÒÃǵĺ¯ÊýÖ¸Õë¡£ËùÒÔÎÒÃÇÐèÒªÒ»¸öͨÓõĴúÀíº¯ÊýÀ´½«Õâ¸ö¶îÍâµÄthisÖ¸Õë´¦Àíµô£¬È»ºó²ÅÄܽøÐе÷Óᣵڶþ£¬ÎÒÃÇÐèÒª½¨Á¢Ò»¸övTableÀïÓÐÕâ¸ö´úÀíº¯ÊýµÄCOM¶ÔÏó¡£µÚÈý£¬ÎÒÃÇÐèÒªÒ»¸ö½Ó¿Ú¶¨Òå²ÅÄÜÈÃVB±àÒëÆ÷ÖªµÀÎÒÃǵĺ¯ÊýÖ¸ÕëµÄÑù×Ó¡£½Ó¿Ú¶¨ÒåÓ¦¸Ã½«º¯ÊýÔÐÍÒ²°üÀ¨ÔÚvTableÀ²¢ÇҺʹúÀíº¯ÊýÔÚ¶ÔÏóvTableÀïµÄλÖÃÒ»Ñù£¨ÒëÕߣºµ±Í¨¹ý½Ó¿Úµ÷Óú¯ÊýÖ¸Õëʱ£¬Ö»ÓÐÕâÑù²ÅÄܹ»ÈôúÀíº¯Êý´¦Àíµô×öΪº¯Êý²ÎÊýѹÔÚÕ»ÀïµÄthisÖ¸Õ룩¡£
ÎÒÃÇ¿ÉÒÔÓûã±à´úÂëºÜÈÝÒ׵صÄд³ö´úÀíº¯Êý£¨ÒëÕߣº¶Ô×÷ÕßMattÀ´ËµµÄÈ·ºÜÈÝÒ×£¬ÒòΪËû¶ÔÔÚVBÀï²åÈëÏßÄÚ»ã±à´úÂëÓÐÏ൱ÉîÈëµÄÑо¿¡£Æäʵ×÷ÕßÕâÀïµÄÈÝÒ×Ò²ÊÇÏà¶ÔÓÚAlphaƽ̨À´ËµµÄ£©¡£ÔÚIntelƽ̨£¬ËùÓд«µÝ¸øCOM¶ÔÏó»ò±ê×¼APIµ÷ÓõIJÎÊý¶¼ÊÇͨ¹ý¶ÑÕ»À´´«µÄ¡£²»ÐÒµÄÊÇ£¬¶ÔAlphaƽ̨µÄVBÀ´Ëµ²»ÊÇÕâÑù£¬Ëü²»ÄÜÌṩһÖÖ¼òµ¥µÄ·½·¨À´Ð´³öͬÑù¹¦ÄܵĻã±à´úÂ루Òë×¢£ºAlphaƽ̨ÊÇÒ»¸öRISC¾«¼òÖ¸Áϵͳ£¬Æä²ÎÊý´«µÝ¶àÖ±½ÓʹÓüĴæÆ÷£¬ÒªÔÚÕâ¸öƽ̨ÉÏÊÖ¹¤Ð´»ã±à´úÂëÒªÄѵ㬴ÓËûµÄÊéµÄĿ¼ÀïÖªµÀËûÔÚÊéÀïרÃÅÄóöÒ»½Ú½éÉÜAlphaƽ̨ϵĻã±à´úÂ룩¡£ ѹջ
Ö»ÒªÎÒÃÇÖªµÀÕ»ÊÇʲôÑù×Ó£¬ÎÒÃǾͿÉÒÔºÜÇå³þµÄÖªµÀ»ã±à´úÂëÐèÒª×öʲô¡£VB½ö½öÖ§³Ö·ûºÏstdcallµ÷Óù淶µÄº¯Êý¡£ÕâÖÖµ÷Óù淶£¬²ÎÊý×ÜÊÇ´ÓÓÒÏò×óѹÈëÕ»ÖУ¬²¢ÇÒÊÇÓɵ÷ÓÃÕßÀ´¸ºÔðÕ»µÄÇåÀí¡£ÇåÀíµÄÒåÎñ¸ú±¾ÎÄûʲô¹ØÏµ£¬µ«ÊÇѹջµÄ˳ÐòÈ´ºÜÖØÒª¡£ÓÈÆäҪעÒâµÄÊÇCOMÀàÀïµÄthisÖ¸Õ루ÔÚVBÀàÀï³ÆÎªMe£©£¬Ëü×ÜÊÇ×÷Ϊ×î×ó±ßµÄ²ÎÊýѹջµÄ¡£µ±º¯Êý±»µ÷ÓÃʱ£¬º¯Êý·µ»ØµØÖ·£¨º¯Êý·µ»Øºó³ÌÐò¼ÌÐøÖ´Ðеĵط½£©Ò²±»callÖ¸Áî±¾ÉíѹÈëÕ»ÖС£ÔÚÈκÎCOM½Ó¿ÚÊä³öº¯Êý±»Ö´ÐÐǰ£¬Õ»µÄÑù×ÓÈçÏ£º
parameter n £¨µÚn¸ö²ÎÊý£¬×îÓұߵIJÎÊý£© ...
parameter 2
parameter 1 £¨µÚ1¸ö²ÎÊý£©
this pointer£¨°µ²ØµÄthisÖ¸Õë²ÅÊÇ×î×óǰµÄ²ÎÊý£© return address £¨·µ»ØµØÖ·£©
µ«ÊÇ£¬ÎÒÃÇÖ»Ïëµ÷Óú¯ÊýÖ¸Õ룬²¢²»ÐèÒª°µ²ØµÄÏà¹ØÁªµÄthisÖ¸Õë¡£µ÷ÓÃÒ»¸ö·ûºÏvTableµ÷ÓÃȴûÓжîÍâ²ÎÊýµÄº¯Êý£¬ÐèÒªÎÒÃǽ«thisÖ¸Õë´ÓÕ»Àï¼·³öÀ´£¬È»ºó²ÅÄܽ«¿ØÖÆ×ªÒƵ½Ä¿±êº¯ÊýÖ¸Õë¡£ÈÃthisÖ¸ÕëÔÚÕ»Àï·Å×ŵĺô¦ÊÇÒòΪËüÖ¸Ïò½á¹¹¡£¿¼ÂÇÎÒÃǶ¨ÒåÁËÒ»¸ö½á¹¹£¬ËüµÄµÚ¶þ¸ö³ÉÔ±ÊÇÒ»¸öº¯ÊýÖ¸Õë¡£Õâ¸ö³ÉÔ±¾à½á¹¹¿ªÊ¼Î»ÖÃµÄÆ«ÒÆÊÇ4¸ö×Ö½Ú¡£ÄÇô½«Õâ¸öº¯ÊýÖ¸³ö¼·³öÀ´²¢Í¨¹ý´úÀíº¯Êýµ÷ÓÃËüµÄ»ã±à´úÂëÈçÏ£º
;µ¯³ö·µ»ØµØÖ·µ½ÁÙʱµÄecx¼Ä´æÆ÷£¬ ;ºóÃæ»¹Òª½«Ëü»Ö¸´¡£ pop ecx
;´ÓÕ»ÀﵯµôthisÖ¸Õ루Òë×¢£º×öΪºóÃæÌø×ªµÄ»ùÖ·£© pop eax
48
;ÖØÐ½«ecx¼Ä´æÆ÷Àï±£´æµÄ·µ»ØµØÖ·Ñ¹Õ» ;ÒÔʹµÃº¯ÊýÖ¸Õëµ÷ÓúóÖªµÀ·µ»Øµ½ÄĶù push ecx
;½«¿ØÖÆ×ªÒƵ½º¯ÊýÖ¸Õ룬
;ËüÔÚthisÖ¸ÕëºóÆ«ÒÆ4¸ö×Ö½Ú´¦¡£ jmp DWORD PTR [eax + 4]
ÕâËÄÌõÖ¸ÁîµÄÁ¬ÔÚÒ»ÆðÐèÒª6¸ö×Ö½Ú£º59 58 51 FF 60 04¡£ÎÒÃÇÔÚºóÃæ²¹Á½¸öInt3Ö¸ÁCC CC£©ÒÔ´Õ×ã8¸ö×Ö½Ú£¬ÕâÕýºÃ¿ÉÒÔÒ»¸öVBµÄCurrency±äÁ¿ÄÚ¡£ÕâÑùÒ»¸öCurrency±äÁ¿µÄµØÖ·Àï»á·Å×ÅÈçϵÄmagic number£¨»ÃÊý£©¡ª¡ª368956918007638.6215@ ¡ª¡ªÕâ¸öCurrency±äÁ¿ÊÇÖ¸Ïò´úÀíº¯ÊýµÄº¯ÊýÖ¸Õë¡£Õâ¸ö´úÀíº¯Êý¼·µôthisÖ¸Õ룬²¢¿ÉÌøµ½Èκκ¯Êý£¬¶ø²»Óÿ¼ÂǺ¯ÊýµÄ²ÎÊý¡£Õâ¾ÍÊÇ˵£¬ÎÒÃÇ¿ÉÒÔÓÃͬÑùµÄ»ã±à´úÂëÀ´´úÀíÈκκ¯ÊýÖ¸Õë¡£ÎÒÃÇÏÖÔÚÐèÒªÒ»¸övTableÀ´°üº¬Õâ¸öÖ¸Ïò×Ö½ÚÁ÷µÄÖ¸Õ룬Ëüʵ¼ÊÉÏÊÇÒ»¸öº¯Êý¡££¨ÒëÕߣº¼´ÓÃvTableµÄij¸öÈë¿Ú°üº¬´úÀíº¯ÊýÖ¸Õ룩¡£
ʹÓôúÀíº¯ÊýÐèÒªÓõ½Ò»¸ö½á¹¹£¬ËüÆ«ÒÆ4×Ö½Ú´¦ÊÇÎÒÃÇÒªµ÷Óõĺ¯ÊýÖ¸Õë¡£ÎÒÃÇ»¹ÐèÒªËüÆ«ÒÆ0¸ö×Ö½Ú´¦ÊÇÒ»¸öÖ¸ÏòvTableµÄÖ¸Õ룬ÕâÑù²ÅÄÜÈÃÕâ¸ö½á¹¹ºÍÒ»¸öCOM¶ÔÏóÒ»Ñù£¬Ö»ÓÐÕâÑùVB²ÅÄܵ÷Óõ½vTableÀïµÄº¯Êý¡£ÎÒÃDz¢Ã»±ØÒªÎªÁËÒ»¸ö¼òµ¥µÄº¯ÊýÖ¸Õëµ÷ÓöøÔÚ¶ÑÀï·ÖÅäÄڴ棻Ïà·´£¬ÎÒÃǽöÐèÔÚµ÷ÓôúÂëµÄij¸öµØ·½ÉùÃ÷Ò»¸öFunctionDelegator½á¹¹µÄ±äÁ¿¡£ËäÈ»ÎÒÃÇÌṩÁËAddRefºÍReleaseº¯Êý£¬µ«ËüÃDz»×öÈκÎÊ£¬Ö»²»¹ýÊÇǨ¾ÍÒ»ÏÂVB£¨ÒëÕߣºVBËý¶ÔÎÒÃǵĶÔÏóÒýÓýøÐÐÑϸñµÄ¸ú×Ù¡£Ã¿µ±ÎÒÃÇÐÂÔöÒ»¸ö¶ÔÎÒÃǶÔÏóµÄÒýÓã¬Ëý¾Í»áµ÷ÓÃÒ»´ÎÎÒÃǶÔÏóÀïµÄAddRef£¬ÒÔ׼ȷ¼ÆÂ¼¶ÔÏó±»ÒýÓõĴÎÊý£»Ã¿µ±ÎÒÃǵÄÒ»¸öÒýÓúͶÔÏó·ÖÊÖ£¬ËýÓÖ»áµ÷ÓÃReleaseÀ´Í¨ÖªÎÒÃǵĶÔÏó¼õÉÙÒýÓüÆÊý¡£VBËýÕâÑù×öÊÇΪÁ˵±ÎÒÃÇËùÓеÄÒýÓö¼ºÍ¶ÔÏó·ÖÊֺ󣬶ÔÏóÄܹ»ÔÚÄÚ´æÀï±»¸É¾»µØÅׯú¡£ÎªÁËǨ¾ÍVBËýµÄÕâ¸öϰ¹ß£¬ÄÄÅÂÎÒÃÇÊÖ¹¤½¨Á¢µÄ¶ÔÏó²¢²»¶¯Ì¬·ÖÅäÄڴ棬ÎÒÃǵĶÔÏóÒ²±ØÐëÌṩAddRefºÍRelease£©¡£ËùÒÔµÚËĸövTableÈë¿ÚÊÇÒ»¸öÖ¸Ïò´úÀíº¯Êý»ã±à´úÂëµÄÖ¸Õë¡£º¯Êý´úÀíµÄ´úÂëÀïÉùÃ÷ÁËÒ»¸öUDTÀ´°üº¬Ò»¸övTalbeÊý×éÖ¸Õë¡££¨´úÂë¼ûListing1£©
½«½á¹¹×ª»»³ÉCOM¶ÔÏó
µ±ÎÒÃǽ«Ò»¸öÖ¸ÏòºÏ·¨vTableµÄÖ¸Õë´«¸øFunctionDelegator½á¹¹£¬²¢½«Õâ¸ö½á¹¹¿½±´µ½Ò»¸ö¶ÔÏó±äÁ¿ÀÕâ¸ö½á¹¹¾Í³ÉΪºÏ·¨µÄCOM¶ÔÏóÁË¡£Õâ¸ö¶ÔÏóµÄQueryInterface£¨ÒëÕߣºÒÔϼò³ÆQI£©º¯ÊýÏàÐÅÎÒÃÇËùÒªÇóµÄ½Ó¿ÚvTalbeµÄµÚËĸöÈë¿ÚµÄº¯ÊýÔÐÍ×ÜÊǺͺ¯ÊýÖ¸ÕëÏà·ûµÄ¡£Èç¹û²»Ö§³ÖËùÒªÇóµÄ½Ó¿Ú£¬QIº¯Êýͨ³£·µ»ØE_NOINTERFACE´íÎó¡£Õâ¸ö´íÎó״̬ÔÚVBÀï±íÏÖ³öÀ´¾ÍÊÇÔÚÍ£ÔÚSetÓï¾äÉϵÄÀàÐͲ»·û´íÎó¡£FunctionDelegator¶ÔÏóµÄÕâÖÖÐÅÈεÄÉè¼ÆÒªÇóÎÒÃDZØÐë×Ô¼ºÀ´±£Ö¤ÀàÐͰ²È«£¬ÎÒÃÇÓÀÔ¶²»ÒªÏòÕâ¸ö¶ÔÏóÇëÇóÒ»¸ö²»·ûºÏº¯ÊýÖ¸ÕëÔÐ͵Ľӿڡ£Èç¹ûÎÒÃÇÆÆ»µÁËÕâ¸ö¹æÔò£¬¶ÔÎÒÃǵijͷ£¾Í½«ÊDZÀÀ£¶ø²»ÊÇÀàÐͲ»Æ¥Åä´íÎóÁË£¨ÒëÕߣºÒªÌå»áÕâÖֳͷ££¬¿ÉÒÔÊÔ׎«Listing1´úÂëÀïµÄInitDelegator·µ»ØµÄ½Ó¿ÚÓÃVBÀïµÄÈÎÒâ½Ó¿ÚÀ´ÒýÓ㬱ÈÈçÓÃShape£¬ÓÉÓÚÆäµÚËĸö½Ó¿Ú¶¨Òå²»·û£¬±ÀÀ££©¡£
FunctionDelegatorµÄvTalbe²»½øÐÐÈκÎÒýÓüÆÊý£¬ËùÒÔÎÒÃDz»ÓñàдÈκÎtear-down£¨ÑÏÖØ´íÎó´¦Àí£©»òÄÚ´æÊÍ·Å´úÂë¡£µ±Õ»Ô½³öËüµÄscopeʱ£¨ÒëÕߣº´Ë´¦µÄscopeÊÇÖ¸FunctionDelegator¶ÔÏó±äÁ¿µÄ±äÁ¿·¶Î§£¬¼´ÉùÃ÷ºÍʹÓÃËüµÄ¹ý³Ì¼¶»òÄ£¿é¼¶·¶Î§£©£¬COM¶ÔÏóËùʹÓõÄÄÚ´æ»á×Ô¶¯´ÓÕ»ÀïÇå³ý£¬ÕâÒâζ×ÅInitDelegatorËù·µ»ØµÄCOM¶ÔÏó±ØÈ»Ôڽṹ
49
×Ô¼ºÏú»Ù֮ǰ£¨»òͬʱ£©±»Ïú»Ù¡£
ÔÚVBÄܹ»µ÷Óõ½´úÀíº¯Êý֮ǰ£¬»¹ÓÐÒ»¸ö²½Ö裺ÎÒÃDZØÐëΪÎÒÃÇÏëÒªµ÷Óõĺ¯ÊýÖ¸Õ붨ÒåÒ»¸ö½Ó¿Ú¡£Í¨¹ýʹÓÃmktylib¹¤¾ßÀ´Éú³É¶ÔÏó¶¨ÒåÓïÑÔ£¨ODL£©Îļþ£¬ÎÒÃÇÄܹ»·Ç³£ÈÝÒ×µØ×öµ½ÕâÒ»µã¡£¾¡¹Ümktylib.exeÊÇmidl.exeµÄÒ»¸ö¹Ù·½µÄ¹¦Äܼò»¯°æ±¾£¬µ«µ±ÎÒÃÇÒªÉú³É¸øVBʹÓõÄÑϸñµÄÀàÐÍ¿âʱ£¬mktylib.exeÏà¶Ô¸üÈÝÒ×ʹÓ᣶øÇÒ£¬²»Í¬ÓÚmidl.exe£¬mktylib.exeËüÊǺ͵¥¶ÀµÄVB²úÆ·Ò»ÆðÏúÊ۵ġ£ÎÒÃǵĽӿڶ¨Ò屨Ðë¼Ì³Ð×ÔIUnknown²¢ÇÒÓÐÒ»¸ö¸½¼ÓµÄº¯Êý¡£µ±ÎÒÃǽö½öʹÓÃODL´ýÐÔ¶ø²»Ê¹ÓÃoleautomationÌØÐÔʱ£¬ÎÒÃÇÄܹ»±ÜÃâOLE×Ô¶¯»¯ÔÚ×¢²á±íÀïµÄHKCR\\InterfaceÖ÷¼üÏÂдÈë²»±ØÒªµÄ×¢²á¼üÖµ¡£ËäÈ»ÎÒÃǵÄQIº¯ÊýºöÂÔuuid£¬µ«ÊÇËü»¹ÊÇÐèÒªÎÒÃǽ¨Á¢ÀàÐͿ⡣£¨ÒëÕߣºËäÈ»¿ÉÒÔͨ¹ýActiveX¹¤³ÌÀ´Éú³É°üº¬ÀàÐÍ¿âµÄ×é¼þ£¬ÕâÑù¿ÉÒÔ²»ÓÃÍⲿ¹¤¾ß¾ÍÄÜÉú³ÉÀàÐͿ⣬µ«ÊÇVBÀïËùÓеÄ×é¼þ¶¼ÊÇÖ§³ÖOLE×Ô¶¯»¯µÄ£¬ËüÃDZØÐëÔÚ×¢²á±íÀï×¢²á¼üÖµ¡£¸üÖØÒªµÄÊÇ£¬VBËùÉú³ÉµÄ½Ó¿Ú¶¼¼Ì³Ð×ÔIDispatch£¬ÆävTable²¢²»·ûºÏ±¾ÎĵÄÒªÇó¡£Èç¹û²»ÏëʹÓöÔÏó¶¨ÒåÓïÑÔ£¬¶øÏëÓøü´¿µÄVBµØÀ´×ö£¬¾Í±ØÐëÐ޸ĴúÀíº¯ÊýµÄʵÏÖ£¬ÒòΪ¼Ì³ÐÖÁIDispatchºó£¬ÎÒÃÇÖ»ÄÜÔÚvTableµÄµÚ°Ë¸öÈë¿ÚÀï·Å´úÀíº¯ÊýÖ¸Õë¡£ËäÈ»ÕâÖÖ×ö·¨¿ÉÐУ¬µ«ÊÇʵÏÖÆðÀ´ºÜ¸´ÔÓ£¬ÒòΪÐèÒªÊÖ¹¤½¨Á¢ÄÜǨ¾ÍVBµÄIDispatch£¬¶øÕâ¾ö²»Ïó±¾ÎÄÊÖ¹¤½¨Á¢ IUnknown½Ó¿ÚÕâô¼òµ¥¡£ËäÈ»¿ÉÄÜ£¬µ«Õâ¸öÍä×ÓÈÆµÃÌ«´óÁË£©
×÷ΪÀý×Ó£¬ÕâÀﶨÒåÁËÈýÖÖº¯Êý¡£µÚÒ»ÖÖÊÇÔÚÅÅÐòËã·¨Öлص÷µÄ±ê×¼µÄ±È½Ïº¯ÊýÔÐÍ¡£µÚ¶þÖÖº¯ÊýÖ¸Õëµ÷ÓÃÄܹ»·µ»ØCOM HRESULT´íÎó´úÂ룬±ÈÈçDllRegisterServer¡£µÚÈýÖÖÊÇÒ»¸ö¼´Ã»ÓвÎÊýҲûÓзµ»ØÖµµÄº¯Êý¡£ÎÒÃÇ¿ÉÒÔ°´ÕÕ×Ô¼ºµÄÐèÒªÀ´¼ÓÈ뺯ÊýÉùÃ÷¡£±£´æ¾¹ýÎÒÃÇÐ޸ĵÄFuncDecl.odlÎļþ£¬²¢ÇÒÖ´ÐÐmktylib FuncDecl.odl£¬È»ºóÔÙ½«FuncDecl.tlbµÄÒýÓüÓÈëÎÒÃǵŤ³Ì¡££¨¼ûListing2ÀïµÄODL£©
ÎÒÃÇÄܹ»¿´µ½£¬Í¨¹ýµ÷ÓÃÏÂÃæµÄÒ»¶Ôº¯Êý£¬ÎÒÃǵÄÈ·ÊÇ¿ÉÒÔʵʱµ÷Óú¯ÊýÖ¸ÕëÁË£¬¶øºÜ³¤Ê±¼äÒÔÀ´£¬¶ÔVB³ÌÐòÔ±À´Ëµ£¬ÏëʹÓÃÕâ¶Ôº¯ÊýÊDz»¿ÉÄܵģ¬Õâ¶Ôº¯Êý¾ÍÊÇDllRegisterServerºÍDllUnregisterServer¡£Í¨¹ý·ÃÎÊÕâÁ½¸ö±ê×¼µÄActiveX DLLºÍOCXÈë¿Úº¯Êý£¬¿ÉÒÔÈÃÎÒÃǵÄEXE°´ÕÕ×ÔÒѵÄÐèÒªÀ´¶¨Î»ºÍ×¢²á×Ô¼ºµÄ×é¼þ£¨ÒëÕߣºÕâ¸ö¼¼Êõ»¹ÊÇÓÐÏ൱¼ÛÖµµÄ¡£ËäÈ»Äܹ»Í¨¹ýShellÓï¾äµ÷ÓÃRegSvr32.exeÀ´×¢²á×é¼þ£¬µ«ÊÇËü½öÖ§³Ö±ê×¼µÄÈë¿Ú£ºDllRegisterServerºÍDllUnregisterServer¡£¶øÊ¹ÓÃÕâÀïµÄ¼¼Êõ£¬ÎÒÃǾÍÄܹ»µ÷Ó÷DZê×¼µÄÈë¿Ú£¬ÔÚATL¹¤³ÌÀォÁ½¸öÁ½¸öÊä³öº¯Êý»»¸öÃû×Ö£¬ÎÒÃÇÔÚVBÀïÒÀÈ»¿ÉÒÔ×¢²á£¬ÕâÑù¼òµ¥µÄ²Ù×÷¾ÍÄÜÆðµ½Ò»¶¨µÄ±£»¤×é¼þµÄ×÷Óã©¡£¶ÔÕâÑùµÄÍⲿº¯ÊýÀ´Ëµ£¬ÎÒÃÇÊÇͨ¹ýLoadLibraryºÍGetProcAddressµ÷ÓÃÀ´´ÓÍⲿDLL»ñÈ¡º¯ÊýÖ¸Õ룬²¢½«Õâ¸öº¯ÊýÖ¸ÕëÒÆµ½FunctionDelegator½á¹¹ÀïÒÔʹÎÒÃÇÄܹ»µ÷ÓÃÕâ¸öº¯ÊýÖ¸Õë±¾Éí¡££¨¼ûListing3£©
ʹÓú¯ÊýÖ¸ÕëÀ´ÅÅÐò £¨ÒëÕߣºÕâÀïÔÎÄÓÃÁ˼¸¶ÎÀ´ÑÝʾÈçºÎͨ¹ýº¯ÊýÖ¸Õë»Øµ÷µÄ·½·¨À´½øÐÐÊý×éÅÅÐò¡£½ö¾Í±¾ÎÄҪ̸µÄº¯ÊýÖ¸Õëµ÷ÓÃÀ´Ëµ£¬ÕâºÍListing3ÀïµÄ´¦Àí·½Ê½ÀàËÆ£¬ÒòΪ´Ë´¦Ê¡ÂÔÕ⼸¶Î¡££©
ÎÒÃÇÄܹ»ÔÚºÜ¶à·½ÃæÊ¹ÓÃÕâÖÖµ÷Óú¯ÊýÖ¸Õë¼¼Êõ¡£±ÈÈ磬ÎÒÃÇ¿ÉÒÔͨ¹ýÔÚÔËÐÐʱ²åÈë¾ßÓв»Í¬ÐÐΪµÄº¯ÊýÀ´¶¯Ì¬¸Ä±äij¶Î´úÂëµÄÐÐΪ¡£ÎÒÃÇÒ²¿ÉÒÔͨ¹ýÕâÖÖ¼¼ÊõÔÚVBÀïʵÏÖtype casting£¨Ç¿ÖÆÀàÐÍת»»£©£¨ÒëÕߣºÍ¨¹ýVarPtrµÃµ½Ò»¸ö±äÁ¿µÄÎÞÀàÐÍÖ¸Õ룬Ȼºó½«Õâ¸öÖ¸Õë×öΪ²ÎÊý£¬½«Õâ¸öÖ¸Õë´«¸ø²»Í¬µÄÀàÐÍת»»º¯ÊýÖ¸Õ룬²¢µ÷ÓÃÖ®£¬¼´¿ÉʵÏÖÇ¿ÖÆÀàÐÍת»»£©¡£ÎÒ²»¿ÉÄܰÑËùÓпÉÄܵÄÓ¦Óö¼ÁгöÀ´£¬µ«ÊÇÕâÀïÎÒÔÙÀ´ÑÝʾһ¶ÎС³ÌÐò¡£
50