ÕæÊÇÏë²»µ½ÏµÁÐÎÄÕÂ(1-6) - VB6Ö¸Õë¼¼Êõ´ó½ÒÃØ

Ŀ¼

ÕæÊÇÏë²»µ½ÏµÁÐÖ®Ò»£¨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 using namespace std; int main() { int a[10];

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

ÁªÏµ¿Í·þ£º779662525#qq.com(#Ìæ»»Îª@)