«á¤@­¶
«e¤@­¶
¦^¥Ø¿ý
¦^­º­¶
²Ä¤Q³¹¡@°ÊºAÁåµ²®wµ{¦¡³]­p¡]¤@¡^

10.1 Windowsªº°ÊºAÁåµ²®w­ì²z¡@

¡@¡@°ÊºAÁåµ²®w(DLLs)¬O±qC»y¨¥¨ç¼Æ®w©MPascal®w³æ¤¸ªº·§©Àµo®i¦Ó¨Óªº¡C©Ò¦³ªºC»y¨¥¼Ð·Ç®w¨ç¼Æ³£¦s©ñ¦b¬Y¤@¨ç¼Æ®w¤¤¡A¦P®É¥Î¤á¤]¥i¥H¥ÎLIBµ{¦¡«Ø¥ß¦Û¤vªº¨ç¼Æ®w¡C¦bÁåµ²À³¥Îµ{¦¡ªº¹Lµ{¤¤¡AÁåµ²¾¹±q®w¤å¥ó¤¤«þ¨©µ{¦¡©I¥sªº¨ç¼Æ¥N½X¡A¨Ã§â³o¨Ç¨ç¼Æ¥N½X¥[¤J¨ì¥i°õ¦æ¤å¥ó¤¤¡C³oºØ¤èªk¦P¥u§â¨ç¼ÆÀx¦s¦b¤w½sĶªº.OBJ¤å¥ó¤¤¬Û¤ñ§ó¦³§Q©ó¥N½Xªº­«¥Î¡C

¡@¡@¦ýÀHµÛWindows³o¼Ëªº¦h¤uÀô¹Òªº¥X²{¡A¨ç¼Æ®wªº¤èªkÅã±o¹L©ó²ÖÂØ¡C¦pªG¬°¤F§¹¦¨¿Ã¹õ¿é¥X¡B°T®§³B²z¡B°O¾ÐÅéºÞ²z¡B¹ï¸Ü¤è¶ôµ¥¾Þ§@¡A¨C­Óµ{¦¡³£¤£±o¤£¾Ö¦³¦Û¤vªº¨ç¼Æ¡A¨º»òWindowsµ{¦¡±NÅܱo«D±`Ãe¤j¡CWindowsªºµo®i­n¨D¤¹³\¦P®É°õ¦æªº´X­Óµ{¦¡¦@¨É¤@¸s¸s²Õ¨ç¼Æªº³æ¤@«þ¨©¡C°ÊºAÁåµ²®w´N¬O¦b³oºØ±¡ªp¤U¥X²{ªº¡C°ÊºAÁåµ²®w¤£¥Î­«½Æ½sĶ©ÎÁåµ²¡A¤@¥¹¸ü¤J°O¾ÐÅé¡ADlls¨ç¼Æ¥i¥H³Q¨t²Î¤¤ªº¥ô¦ó¥¿¦b°õ¦æªºÀ³¥Îµ{¦¡³nÅé©Ò¨Ï¥Î¡A¦Ó¤£¥²¦A±NDLLs¨ç¼Æªº¥t¤@«þ¨©¸ü¤J°O¾ÐÅé¡C¡@

10.1.1 °ÊºAÁåµ²®wªº¤u§@­ì²z¡@

¡@¡@¡§°ÊºAÁåµ²¡¨³o´X¦r«ü©ú¤FDLLs¬O¦p¦ó¤u§@ªº¡C¹ï©ó¶Ç²Îªº¨ç¼Æ®w¡AÁåµ²¾¹±q¤¤«þ¨©¥¦»Ý­nªº©Ò¦³®w¨ç¼Æ¡A¨Ã§â½T¤Áªº¨ç¼Æ¦ì§}Âà°eµ¹©I¥s³o¨Ç¨ç¼Æªºµ{¦¡¡C¦Ó¹ï©óDLLs¡A¨ç¼ÆÀx¦s¦b¤@­Ó¿W¥ßªº°ÊºAÁåµ²®w¤å¥ó¤¤¡C¦b«Ø¥ßWindowsµ{¦¡®É¡AÁåµ²¹Lµ{¨Ã¤£§âDLLs¤å¥óÁåµ²¨ìµ{¦¡¤W¡Cª½¨ìµ{¦¡°õ¦æ¨Ã©I¥s¤@­ÓDLLs¤¤ªº¨ç¼Æ®É¡A¸Óµ{¦¡¤~­n¨D³o­Ó¨ç¼Æªº¦ì§}¡C¦¹®ÉWindows¤~¦bDLLs¤¤´M§ä³Q©I¥s¨ç¼Æ¡A¨Ã§â¥¦ªº¦ì§}Âà°eµ¹©I¥sµ{¦¡¡C±Ä¥Î³oºØ¤èªk¡ADLLs¹F¨ì¤F´_¥Î¥N½Xªº·¥­­¡C

¡@¡@°ÊºAÁåµ²®wªº¥t¤@­Ó¤è«K¤§³B¬O¹ï°ÊºAÁåµ²®w¤¤¨ç¼Æªº­×§ï¥i¥H¦Û°Ê¶Ç¼½¨ì©Ò¦³©I¥s¥¦ªºµ{¦¡¤¤¡A¦Ó¤£¥²¹ïµ{¦¡§@¥ô¦ó§ï°Ê©Î³B²z¡C

¡@¡@DLLs¤£¶È´£¨Ñ¤F¨ç¼Æ­«¥Îªº¾÷¨î¡A¦Ó¥B´£¨Ñ¤F¼Æ¾Ú¦@¨Éªº¾÷¨î¡C¥ô¦óÀ³¥Îµ{¦¡³£¥i¥H¦@¨É¥Ñ¸ü¤J°O¾ÐÅ骺DLLsºÞ²zªº°O¾ÐÅé¸ê·½¶ô¡C¥u¥]§t¦@¨É¼Æ¾ÚªºDLLsºÙ¬°¸ê·½¤å¥ó¡C¦pWindowsªº¦r§Î¤å¥óµ¥¡C¡@

10.1.2 Windows¨t²Îªº°ÊºAÁåµ²®w¡@

¡@¡@Windows¥»¨­´N¬O¥Ñ¤j¶qªº°ÊºAÁåµ²®w¤ä´©ªº¡C³o¥]¬AWindows API¨ç¼Æ ( KRNLx86.EXE¡AUSER.EXE¡AGDI.EXE¡A¡K)¡A¦UºØÅX°Êµ{¦¡¤å¥ó¡A¦UºØ±a¦³.Fon©M.Fot Àɮתþ¥[¦Wªº¦r§Î¸ê·½¤å¥óµ¥¡CWindowsÁÙ´£¨Ñ¤F°w¹ï¬Y¤@¥\¯àªº±M¥ÎDLLs¡A¦p¶i¦æDDEµ{¦¡³]­pªºddeml.dll¡A¶i¦æµ{¦¡¸Ë³]ªºver.dllµ¥¡C

¡@¡@ÁöµM¦b½s¼gWindowsµ{¦¡®É¥²µM­n¯A¤Î¨ìDLLs¡A¦ý§Q¥ÎDelphi ¡A¥Î¤á¦b¤j³¡¤À®É­Ô¨Ã¤£·|ª`·N¨ì³o¤@ÂI¡C³o¤@¤è­±¬O¦]¬°Delphi´£¨Ñ¤FÂ×´Iªº¨ç¼Æ¨Ï¥Î¤á¤£¥²ª½±µ¥h¨Ï¥ÎWindows API;¥t¤@¤è­±§Y¨Ï¨Ï¥ÎWindows API¡A¥Ñ©óDelphi§âAPI¨ç¼Æ©M¨ä¥¦Windows DLLs¨ç¼Æ­«·s¸s¸s²Õ´¨ì¤F´X­Ó®w³æ¤¸¤¤¡A¦]¦Ó¤]¤£¥²¨Ï¥Î¯S®íªº©I¥s®æ¦¡¡C©Ò¥H¥»³¹ªº­«ÂI©ñ¦b½s¼g©M©I¥s¥Î¤á¦Û©w¸qªºDLLs¤W¡C

¡@¡@¨Ï¥Î¶Ç²ÎªºWindowsµ{¦¡³]­p¤èªk¨Ó«Ø¥ß©M¨Ï¥Î¤@­ÓDLLs¬O¤@¥ó«Ü¥O¤HÀYµhªº¨Æ¡A¥¿¦p¶Ç²ÎªºWindowsµ{¦¡³]­p¤èªk¥»¨­´N¥O¤H¥Í¬È¤@¼Ë¡C¥Î¤á»Ý­n¹ï©w¸q¤å¥ó¡B¤uµ{¤å¥ó¶i¦æ¤@¨t¦Cªº­×§ï¥H¾AÀ³«Ø¥ß©M¨Ï¥ÎDLLsªº»Ý­n¡CDelphiªº¥X²{¡A¦b³o¤@¤è­±¡A¥¿¦p¦b¨ä¥¦³\¦h¤è­±©Ò°µªº¨º¼Ë¡A´î»´¤F¶}µoªÌªº­t¾á¡C§ó¥O¤H¿³¾Äªº¬ODelphi§Q¥ÎDLLs ¹ê²{¤Fµ¡Å骺­«¥Î¾÷¨î¡C¥Î¤á¥i¥H±N¦Û¤v³]­p¦nªºµ¡ÅéÀx¦s¦b¤@­ÓDLLs¤¤¡A¦b»Ý­nªº®É­Ô¥iÀH®É©I¥s¥¦¡C¡@

10.2 DLLsªº½s¼g©M©I¥s¡@

10.2.1 DLLsªº½s¼g¡@

¡@¡@¦bDelphiÀô¹Ò¤¤¡A½s¼g¤@­ÓDLLs¦P½s¼g¤@­Ó¤@¯ëªºÀ³¥Îµ{¦¡¨Ã¨S¦³¤Ó¤jªº°Ï§O¡C¨Æ¹ê¤W§@¬°DLLs ¥DÅ骺DLL¨ç¼Æªº½s¼g¡A°£¤F¦b°O¾ÐÅé¡B¸ê·½ªººÞ²z¤W¦³©Ò¤£¦P¥~¡A¨Ã¤£»Ý­n¨ä¥¦¯S§Oªº¤â¬q¡C¯u¥¿ªº°Ï§O¦b¤uµ{¤å¥ó¤W¡C

¡@¡@¦bµ´¤j¦h¼Æ±¡ªp¤U¡A¥Î¤á´X¥G·NÃѤ£¨ì¤uµ{¤å¥óªº¦s¦b¡A¦]¬°¥¦¤@¯ë¤£Åã¥Ü¦b¿Ã¹õ¤W¡C¦pªG·Q¬d¬Ý¤uµ{¤å¥ó¡A«h¥i¥H¥´¶}View¿ï¾Üªí¿ï¾ÜProject Source¶µ¡A¦¹®É¤uµ{¤å¥óªº¥N½X´N·|¥X²{¦b¿Ã¹õªºCode Editor(¥N½X½s¿è¾¹)¤¤¡C

¡@¡@¤@¯ë¤uµ{¤å¥óªº®æ¦¡¬°¡G¡@

¡@¡@program¡@¡@ ¤uµ{¼ÐÃD;

¡@¡@uses¡@¡@¡@¡@ ¤l¥y;

¡@¡@µ{¦¡Åé¡@

¡@¡@¦ÓDLLs¤uµ{¤å¥óªº®æ¦¡¬°¡G¡@

¡@¡@library ¤uµ{¼ÐÃD;

¡@¡@uses ¤l¥y;

¡@¡@exprots ¤l¥y;

¡@¡@µ{¦¡Åé¡@

¡@¡@¥¦­Ì¥D­nªº°Ï§O¦³¨âÂI¡G

¡@¡@1.¤@¯ë¤uµ{¤å¥óªºÀY¼Ð¥ÎprogramÃöÁä¦r¡A¦ÓDLLs¤uµ{¤å¥óÀY¼Ð¥Îlibrary ÃöÁä¦r¡C¤£¦PªºÃöÁä¦r³qª¾½sĶ¾¹²£¥Í¤£¦Pªº¥i°õ¦æ¤å¥ó¡C¥ÎprogramÃöÁä¦r²£¥Íªº¬O.exe¤å¥ó¡A¦Ó¥ÎlibraryÃöÁä¦r²£¥Íªº¬O.dll¤å¥ó¡F

¡@¡@2.°²¦pDLLs­n¿é¥X¨Ñ¨ä¥¦À³¥Îµ{¦¡¨Ï¥Îªº¨ç¼Æ©Î¹Lµ{¡A«h¥²¶·±N³o¨Ç¨ç¼Æ©Î¹Lµ{¦C¦bexports¤l¥y¤¤¡C¦Ó³o¨Ç¨ç¼Æ©Î¹Lµ{¥»¨­¥²¶·¥Îexport½sĶ«ü¥O¶i¦æ½sĶ¡C

¡@¡@®Ú¾ÚDLLs§¹¦¨ªº¥\¯à¡A§Ú­Ì§âDLLs¤À¬°¦p¤Uªº¤TÃþ¡G

1.§¹¦¨¤@¯ë¥\¯àªºDLLs¡F

2.¥Î©ó¼Æ¾Ú¥æ´«ªºDLLs¡F

3.¥Î©óµ¡Åé­«¥ÎªºDLLs¡C

¡@¡@³o¤@¸`§Ú­Ì¥u°Q½×§¹¦¨¤@¯ë¥\¯àªºDLLs¡A¨ä¥¦¤º®e±N¦b«áÃ䪺¨â¸`¤¤°Q½×¡C¡@

10.2.1.1 ½s¼g¤@¯ëDLLsªº¨BÆJ¡@

¡@¡@½s¼g¤@¯ëDLLsªº¨BÆJ¦p¤U¡G

¡@¡@1.§Q¥ÎDelphiªºÀ³¥Îµ{¦¡¼ÒªO¡A«Ø¥ß¤@­ÓDLLsµ{¦¡®Ø¬[¡C

¡@¡@¹ï©óDelphi 1.0ªº¥Î¤á¡A¥Ñ©ó¨S¦³DLLs¼ÒªO¡A¦]¦¹¡G

¡@¡@(1).«Ø¥ß¤@­Ó¤@¯ëªºÀ³¥Îµ{¦¡¡A¨Ã¥´¶}¤uµ{¤å¥ó¡F

¡@¡@(2).²¾¥hµ¡Åé©M¬ÛÀ³ªº¥N½X³æ¤¸¡F

¡@¡@(3).¦b¤uµ{¤å¥ó¤¤¡A§âprogram§ï¦¨library¡A²¾¥hUses¤l¥y¤¤ªºForms¡A¨Ã¥[¤J¾A·íªº®w³æ¤¸¡]¤@¯ëSysUtils¡BClasses¬O»Ý­nªº¡^¡A§R¥hbegin...end¤§¶¡ªº©Ò¦³¥N½X¡C

¡@¡@2.¥H¾A·íªºÀÉ®×¼Ðñ«O«ù¤å¥ó¡A¦¹®Élibrary«á¸òªº®w¦W¦Û°Ê­×§ï¡F

¡@¡@3.¿é¤J¹Lµ{¡B¨ç¼Æ¥N½X¡C¦pªG¹Lµ{¡B¨ç¼Æ·Ç³Æ¨Ñ¨ä¥¦À³¥Îµ{¦¡©I¥s¡A«h¦b¹Lµ{¡B¨ç¼ÆÀY«á¥[¤Wexport ½sĶ«ü¥Ü¡F

¡@¡@4.«Ø¥ßexports¤l¥y¡A¥]§t¨Ñ¨ä¥¦À³¥Îµ{¦¡©I¥sªº¨ç¼Æ©M¹Lµ{¦W¡C¥i¥H§Q¥Î¼Ð·Ç«ü¥Ü name ¡BIndex¡Bresident¥H¤è«K©M¥[³t¹Lµ{/¨ç¼Æªº©I¥s¡F

¡@¡@5.¿é¤J®wªì©l¤Æ¥N½X¡C³o¤@¨B¬O¥i¿ïªº¡F

¡@¡@6.½sĶµ{¦¡¡A²£¥Í°ÊºAÁåµ²®w¤å¥ó¡C¡@

10.2.1.2 °ÊºAÁåµ²®w¤¤ªº¼Ð·Ç«ü¥Ü¡@

¡@¡@¦b°ÊºAÁåµ²®wªº¿é¥X³¡¤À¡A¥Î¨ì¤F¤T­Ó¼Ð·Ç«ü¥Ü¡Gname¡BIndex¡Bresident¡C

¡@¡@1.name

¡@¡@name«á­±±µ¤@­Ó¦r¤¸¦ê±`¼Æ¡A§@¬°¸Ó¹Lµ{©Î¨ç¼Æªº¿é¥X¦W¡C¦p¡G¡@

exports

InStr name MyInstr;

¡@¡@¨ä¥¦À³¥Îµ{¦¡±N¥Î·s¦W¦r(MyInstr)©I¥s¸Ó¹Lµ{©Î¨ç¼Æ¡C¦pªG¤´§Q¥Î­ì¨Óªº¦W¦r(InStr)¡A«h¦bµ{¦¡°õ¦æ¨ì¤Þ¥ÎÂI®É·|¤Þµo¤@­Ó¨t²Î¿ù»~¡C

¡@¡@2.Index

¡@¡@Index«ü¥Ü¬°¹Lµ{©Î¨ç¼Æ¤À°t¤@­Ó¶¶§Ç¸¹¡C¦pªG¤£¨Ï¥ÎIndex«ü¥Ü¡A«h¥Ñ½sĶ¾¹«ö¶¶§Ç¶i¦æ¤À°t¡C

¡@¡@Index«á©Ò±µ¼Æ¦rªº½d³ò¬°1...32767¡C¨Ï¥ÎIndex¥i¥H¥[³t©I¥s¹Lµ{¡C

¡@¡@3.resident

¡@¡@¨Ï¥Îresident¡A«h·íDLLs¸ü¤J®É¯S©wªº¿é¥X¸ê°T©l²×«O«ù¦b°O¾ÐÅ餤¡C³o¼Ë·í¨ä¥¦À³¥Îµ{¦¡©I¥s¸Ó¹Lµ{®É¡A¥i¥H¤ñ§Q¥Î¦W¦r±½´yDLL¤J¤f­°§C®É¶¡¶}¾P¡C

¡@¡@¹ï©ó¨º¨Ç¨ä¥¦À³¥Îµ{¦¡±`±`­n©I¥sªº¹Lµ{©Î¨ç¼Æ¡A¨Ï¥Îresident«ü¥Ü¬O¦X¾Aªº¡C¨Ò¦p¡G¡@

exports

InStr name MyInStr resident;¡@

10.2.1.3 DLLs¤¤ªºÅܼƩM¬q¡@

¤@­ÓDLLs¾Ö¦³¦Û¤vªº¼Æ¾Ú¬q(DS)¡A¦]¦Ó¥¦Án©úªº¥ô¦óÅܼƳ£¬°¦Û¤v©Ò¨p¦³¡C©I¥s¥¦ªº¼Ò¸s²Õ¤£¯àª½±µ¨Ï¥Î¥¦©w¸qªºÅܼơC­n¨Ï¥Î¥²¶·³q¹L¹Lµ{©Î¨ç¼Æ¤¶­±¤~¯à§¹¦¨¡C¦Ó¹ïDLLs¨Ó»¡¡A¥¦¥Ã»·³£¨S¦³¾÷·|¨Ï¥Î©I¥s¥¦ªº¼Ò¸s²Õ¤¤Án©úªºÅܼơC

¡@¡@¤@­ÓDLLs¨S¦³¦Û¤vªº°ïÅ|¬q(SS)¡A¥¦¨Ï¥Î©I¥s¥¦ªºÀ³¥Îµ{¦¡ªº°ïÅ|¡C¦]¦¹¦bDLL¤¤ªº¹Lµ{¡B¨ç¼Æµ´¹ï¤£­n°²©wDS = SS¡C¤@¨Ç»y¨¥¦b¤p¼Ò¦¡½sĶ¤U¦³³oºØ°²³]¡A¦ý¨Ï¥ÎDelphi¥i¥HÁקK³oºØ±¡ªp¡CDelphiµ´¤£·|²£¥Í°²©wDS = SSªº¥N½X¡ADelphiªº¥ô¦ó°õ¦æ®É¶¡®w¹Lµ{/¨ç¼Æ¤]³£¤£§@³oºØ°²©w¡C»Ýª`·Nªº¬O¦pªGŪªÌ·Q´O¤J¸s¸s²Õ¦X»y¨¥¥N½X¡Aµ´¤£­n¨ÏSS©MDSµn¤J¦P¤@­Ó­È¡C¡@

10.2.1.4 DLLs¤¤ªº°õ¦æ®É¶¡¿ù©M³B²z¡@

¡@¡@¥Ñ©óDLLsµLªk±±¨îÀ³¥Îµ{¦¡ªº°õ¦æ¡A¾É­P«ÜÃø¶i¦æ²§±`³B²z¡A¦]¦¹½s¼gDLLs®É­n¤Q¤À¤p¤ß¡A¥H½T«O³Q©I¥s®É¯à¥¿±`°õ¦æ ¡C·íDLLs¤¤µo¥Í¤@­Ó°õ¦æ®É¶¡¿ù®É¡A¬ÛÀ³DLLs¨Ã¤£¤@©w±q°O¾ÐÅ餤²¾¥h¡]¦]¬°¦¹®É¨ä¥¦À³¥Îµ{¦¡¥i¯à¥¿¦b¥Î¥¦¡^¡A¦Ó©I¥sDLLsªºµ{¦¡²§±`¤¤¤î¡C³o¼Ë³y¦¨ªº°ÝÃD¬O·íDLLs¤w³Q­×§ï¡A­«·s¶i¦æ©I¥s®É¡A°O¾ÐÅ餤«O¯dªº¤´µM¥i¯à¬O¥H«eªºª©¥»¡A­×§ï«áªºµ{¦¡¨Ã¨S¦³±o¨ìÅçÃÒ¡C¹ï©ó³o­Ó°ÝÃD¡A¦³¥H¤U¨âºØ¸Ñ¨M¤èªk¡G

¡@¡@1.¦bµ{¦¡ªº²§±`³B²z³¡¤ÀÅ㦡±NDLL¨ø¥X°O¾ÐÅé¡F

¡@¡@2.§¹¥þµ²§ôWindows¡A¦Ó«á­«·s±Ò°Ê¡A°õ¦æ¬ÛÀ³ªºµ{¦¡¡C

¡@¡@¦P¤@¯ëªºÀ³¥Îµ{¦¡¬Û¤ñ¡ADLL¤¤°õ¦æ®É¶¡¿ùªº³B²z¬O«Ü§xÃøªº¡A¦Ó³y¦¨ªº«áªG¤]§ó¬°ÄY­«¡C¦]¦¹­n¨Dµ{¦¡³]­pªÌ¦b½s¼g¥N½X®É­n¦³¥R¤À¡B©P¨ìªº¦Ò¼{¡C¡@

10.2.1.5 ®wªì©l¤Æ¥N½Xªº½s¼g¡@

¡@¡@¶Ç²ÎWindows¤¤°ÊºAÁåµ²®wªº½s¼g¡A»Ý­n¨â­Ó¼Ð·Ç¨ç¼Æ¡GLibMain©MWEP¡A¥Î©ó±Ò°Ê©MÃö³¬DLL¡C¦bLibMain¤¤¡A¥i¥H°õ¦æ¶}ÂêDLL¼Æ¾Ú¬q¡B¤À°t°O¾ÐÅé¡Bªì©l¤ÆÅܼƵ¥ªì©l¤Æ¤u§@¡F¦ÓWEP¦b±q°O¾ÐÅ餤²¾¥hDLLs«e³Q©I¥s¡A¤@¯ë¥Î©ó¶i¦æ¥²­nªº²M²z¤u§@¡A¦pÄÀ©ñ°O¾ÐÅéµ¥¡CDelphi¥Î¦Û¤v¯S¦³ªº¤è¦¡¹ê²{¤F³o¨â­Ó¼Ð·Ç¨ç¼Æªº¥\¯à¡C³o´N¬O¦b¤uµ{¤å¥ó¤¤ªºbegin...end³¡¤À¥[¤Jªì©l¤Æ¥N½X¡C©M¶Ç²ÎWindowsµ{¦¡³]­p¤èªk¬Û¤ñ¡A¥¦ªº¥D­n¯S¦â¬O¡G

¡@¡@1.ªì©l¤Æ¥N½X¬O¥i¿ïªº¡C¤@¨Ç¥²­nªº¤u§@¡]¦p¶}Âê¼Æ¾Ú¬q¡^¥i¥H¥Ñ¨t²Î¦Û°Ê§¹¦¨¡C©Ò¥H¤j³¡¤À±¡ªp¤U¥Î¤á¤£·|¯A¤Î¨ì¡F

¡@¡@2.¥i¥H³]©w¦h­Óµ²§ô¹Lµ{¡Aµ²§ô®É«ö¶¶§Ç¨Ì¦¸³Q©I¥s¡F

¡@¡@3.LibMain©MWEP¹ï¥Î¤á³z©ú¡A¥Ñ¨t²Î¦Û°Ê©I¥s¡C

¡@¡@ªì©l¤Æ¥N½X§¹¦¨ªº¥D­n¤u§@¬O¡G

¡@¡@1.ªì©l¤ÆÅܼơB¤À°t¥þ§½°O¾ÐÅé¶ô¡Bµn¤Jµøµ¡ª«¥óµ¥ªì©l¤Æ¤u§@¡C¦b(10.3.2)¸`¡§§Q¥ÎDLLs¹ê²{À³¥Îµ{¦¡¶¡ªº¼Æ¾Ú¶Ç¿é¡¨¤¤¡A¥Î©ó¼Æ¾Ú¦@¨Éªº¥þ§½°O¾ÐÅé¶ô´N¬O¦bªì©l¤Æ¥N½X¤¤¤À°tªº¡C

¡@¡@2.³]©wDLLsµ²§ô®Éªº°õ¦æ¹Lµ{¡CDelphi¦³¤@­Ó¹w©w¸qÅܼÆExitProc¥Î©ó«ü¦Vµ²§ô¹Lµ{ªº¦ì§}¡C¥Î¤á¥i¥H§â¦Û¤vªº¹Lµ{¦W½áµ¹ExitProc¡C¨t²Î¦Û°Ê©I¥sWEP¨ç¼Æ¡A§âExitProc«ü¦Vªº¦ì§}¨Ì¦¸½áµ¹WEP°õ¦æ¡Aª½¨ìExitProc¬°nil¡C

¡@¡@¤UÃ䪺¤@¬qµ{¦¡¥]§t¤@­Óµ²§ô¹Lµ{©M¤@¬qªì©l¤Æ¥N½X¡A¥Î¨Ó±Ô­z¦p¦ó¥¿½T³]©wµ²§ô¹Lµ{¡C¡@

library Test;

{$S-}

uses WinTypes, WinProcs;

var

SaveExit: Pointer;¡@

procedure LibExit; far;

begin

if ExitCode = wep_System_Exit then

begin

{ ¨t²ÎÃö³¬®Éªº¬ÛÀ³³B²z }

end

else

begin

{ DLL¨ø¥X®Éªº¬ÛÀ³³B²z }

end;

ExitProc := SaveExit; { «ì´_­ì¨Óªºµ²§ô¹Lµ{«ü¼Ð }

end;¡@

begin

{DLLªºªì©l¤Æ¤u§@ }

SaveExit := ExitProc; { ¦sÀÉ­ì¨Óªºµ²§ô¹Lµ{«ü¼Ð }

ExitProc := @LibExit; { ¸Ë³]·sªºµ²§ô¹Lµ{ }

end.

¡@¡@¦bªì©l¤Æ¥N½X¤¤¡A­º¥ý§â­ì¨Óªºµ²§ô¹Lµ{«ü¼Ð¦sÀɨì¤@­ÓÅܼƤ¤¡A¦Ó«á¦A§â·sªºµ²§ô¹Lµ{¦ì§}½áµ¹ExitProc¡C¦Ó¦b¦Û©w¸qµ²§ô¹Lµ{LibExitµ²§ô®É¦A§âExitProcªº­È«ì´_¡C¥Ñ©óExitProc¬O¤@­Ó¨t²Î¥þ§½ÅܼơA©Ò¥H¦bµ²§ô®É«ì´_­ì¨Óªºµ²§ô¹Lµ{¬O¥²­nªº¡C

¡@¡@µ²§ô¹Lµ{LibExit¤¤¨Ï¥Î¤F¤@­Ó¨t²Î©w¸qÅܼÆExitCode¡A¥Î©ó¼Ð»xµ²§ô®Éªºª¬ºA¡C ExitCodeªº¨ú­È»P·N¸q¦p¤U¡G¡@

ªí10.1 ExitCodeªº¨ú­È»P·N¸q

¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w

¨ú ­È ·N ¸q

??????????????????????????????????????????

¡@¡@WEP_System_Exit WindowsÃö³¬¡@

WEP_Free_DLLx DLLs³Q¨ø¥X

¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¡@

¡@¡@µ²§ô¹Lµ{½sĶ®É¥²¶·Ãö³¬stack_checking¡A¦]¦Ó»Ý³]©w½sĶ«ü¥Ü {$S-} ¡C¡@

10.2.1.6 ½s¼g¤@¯ëDLLsªºÀ³¥ÎÁ|¨Ò¡@

¡@¡@¦b¤U­±ªºµ{¦¡¤¤§Ú­Ì§â¤@­Ó¦r¤¸¦ê¾Þ§@ªº¨ç¼ÆÀx¦s¨ì¤@­ÓDLLs¤¤¡A¥H«K»Ý­nªº®É­Ô©I¥s¥¦¡CÀ³¸Óª`·Nªº¤@ÂI¬O¡G¬°¤F«OÃÒ³o­Ó¨ç¼Æ¥i¥H³Q¨ä¥¦»y¨¥½s¼gªºµ{¦¡©Ò©I¥s¡A§@¬°°Ñ¼Æ¶Ç»¼ªº¦r¤¸¦êÀ³¸Ó¬OµLµ²§ô²Åªº¦r¤¸¼Æ¸s¸s²Õ«¬¦¡(§YPChar«¬¦¡)¡A¦Ó¤£¬OObject Pascalªº±aµ²§ô²ÅªºSrting«¬¦¡¡Cµ{¦¡²M³æ¦p¤U¡G

library Example;

uses

SysUtils,

Classes;

{ªð¦^¦r¤¸¦b¦r¤¸¦ê¤¤ªº¦ì¸m}

function InStr(SourceStr: PChar;Ch: Char): Integer; export;

var

Len,i: Integer;

begin

Len := strlen(SourceStr);

for i := 0 to Len-1 do

if SourceStr[i] = ch then

begin

Result := i;

Exit;

end;

Result := -1;

end;

exports

Instr Index 1 name 'MyInStr' resident;

begin

end.¡@

10.2.2 ©I¥sDLLs

¡@¡@¦³¨âºØ¤èªk¥i¥Î©ó©I¥s¤@­ÓÀx¦s¦bDLLs¤¤ªº¹Lµ{¡C

¡@¡@1.ÀRºA©I¥s©ÎÅã¥Ü¸Ë¸ü

¡@¡@¨Ï¥Î¤@­Ó¥~³¡Án©ú¤l¥y¡A¨ÏDLLs¦bÀ³¥Îµ{¦¡¶}©l°õ¦æ«e§Y³Q¸ü¤J¡C¨Ò¦p¡G¡@

¡@¡@function Instr(SourceStr : PChar;Check : Char); Integer; far; external 'UseStr';

¡@¡@¨Ï¥Î³oºØ¤èªk¡Aµ{¦¡µLªk¦b°õ¦æ®É¶¡ùبM©wDLLsªº©I¥s¡C°²¦p¤@­Ó¯S©wªºDLLs¦b°õ¦æ®ÉµLªk¨Ï¥Î¡A«hÀ³¥Îµ{¦¡±NµLªk°õ¦æ¡C

¡@¡@2.°ÊºA©I¥s©ÎÁô¦¡¸Ë¸ü

¡@¡@¨Ï¥ÎWindows API¨ç¼ÆLoadLibray©MGetProcAddress¥i¥H¹ê²{¦b°õ¦æ®É¶¡ùذʺA¸Ë¸üDLLs¨Ã©I¥s¨ä¤¤ªº¹Lµ{¡C

¡@¡@­Yµ{¦¡¥u¦b¨ä¤¤ªº¤@³¡¤À©I¥sDLLsªº¹Lµ{¡A©ÎªÌµ{¦¡¨Ï¥Î­þ­ÓDLLs¡A ©I¥s¨ä¤¤ªº­þ­Ó¹Lµ{»Ý­n®Ú¾Úµ{¦¡°õ¦æªº¹ê»Úª¬ºA¨Ó§PÂ_¡A¨º»ò¨Ï¥Î°ÊºA©I¥s´N¬O¤@­Ó«Ü¦nªº¿ï¾Ü¡C

¡@¡@¨Ï¥Î°ÊºA©I¥s¡A§Y¨Ï¸Ë¸ü¤@­ÓDLLs¥¢±Ñ¤F¡Aµ{¦¡¤´¯àÄ~Äò°õ¦æ¡C¡@

10.2.3 ÀRºA©I¥s

¡@¡@¦bÀRºA©I¥s¤@­ÓDLLs¤¤ªº¹Lµ{©Î¨ç¼Æ®É¡Aexternal«ü¥Ü¼W¥[¨ì¹Lµ{©Î¨ç¼ÆªºÁn©ú»y¥y¤¤¡C³Q©I¥sªº¹Lµ{©Î¨ç¼Æ¥²¶·±Ä¥Î»·©I¥s¼Ò¦¡¡C³o¥i¥H¨Ï¥Îfar¹Lµ{«ü¥Ü©Î¤@­Ó{$F +}½sĶ«ü¥Ü¡C

¡@¡@Delphi¥þ³¡¤ä´©¶Ç²ÎWindows°ÊºAÁåµ²®wµ{¦¡³]­p¤¤ªº¤TºØ©I¥s¤è¦¡¡A¥¦­Ì¬O¡G

¡@¡@¡´ ³q¹L¹Lµ{/¨ç¼Æ¦W

¡@¡@¡´ ³q¹L¹Lµ{/¨ç¼Æªº§O¦W

¡@¡@¡´ ³q¹L¹Lµ{/¨ç¼Æªº¶¶§Ç¸¹¡@

¡@¡@³q¹L¹Lµ{©Î¨ç¼Æªº§O¦W©I¥s¡Aµ¹¥Î¤áµ{¦¡³]­p´£¨Ñ¤FÆF¬¡©Ê¡A¦Ó³q¹L¶¶§Ç¸¹(Index)©I¥s¥i¥H´£°ª¬ÛÀ³DLLªº¸Ë¸ü³t«×¡C¡@

10.2.4 °ÊºA©I¥s¡@

10.2.4.1 °ÊºA©I¥s¤¤ªºAPI¨ç¼Æ¡@

¡@¡@°ÊºA©I¥s¤¤¨Ï¥ÎªºWindows API¨ç¼Æ¥D­n¦³¤T­Ó,§Y¡GLoadlibrary¡AGetProcAddress©MFreelibrary¡C

¡@¡@ 1.Loadlibrary: §â«ü©w®w¼Ò¸s²Õ¸ü¤J°O¾ÐÅé

¡@¡@»yªk¬°¡G¡@

¡@¡@function Loadlibrary(LibFileName: PChar): THandle;¡@

LibFileName«ü©w¤F­n¸Ë¸üDLLsªºÀÉ®×¼Ðñ¡A¦pªGLibFileName¨S¦³¥]§t¤@­Ó¸ô®|¡A«hWindows«ö¤U­z¶¶§Ç¶i¦æ§ä¨ì¡G

¡@¡@(1)¥Ø«e¤u§@¥Ø¿ý¡F

¡@¡@(2)Windows¥Ø¿ý(¥]§twin.comªº¥Ø¿ý)¡C¨ç¼ÆGetWindowDirectoryªð¦^³o¤@¥Ø¿ýªº¸ô®|¡F

¡@¡@(3)Windows¨t²Î¥Ø¿ý(¥]§t¨t²Î¤å¥ó¦pgdi.exeªº¥Ø¿ý)¡C¨ç¼ÆGetSystemDirectoryªð¦^³o¤@¥Ø¿ýªº¸ô®|¡F

¡@¡@(4)¥]§t¥Ø«e¥ô°È¥i°õ¦æ¤å¥óªº¥Ø¿ý¡C§Q¥Î¨ç¼ÆGetModuleFileName¥i¥Hªð¦^³o¤@¥Ø¿ýªº¸ô®|¡F

¡@¡@(5)¦C¦bPATHÀô¹ÒÅܼƤ¤ªº¥Ø¿ý¡F

¡@¡@(6)ºô¸ôªº¬M¶H¥Ø¿ý²M³æ¡C

¡@¡@¦pªG¨ç¼Æ°õ¦æ¦¨¥\¡A«hªð¦^¸Ë¸ü®w¼Ò¸s²Õªº¹ê¨Ò¥y¬`¡C§_«h¡Aªð¦^¤@­Ó¤p©óHINSTANCE_ERRORªº¿ù»~¥N½X¡C¿ù»~¥N½Xªº·N¸q¦p¤Uªí¡G¡@

¡@¡@ ªí10.2 Loadlibraryªð¦^¿ù»~¥N½Xªº·N¸q

¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w

¿ù»~¥N½X¡@¡@¡@¡@¡@¡@¡@¡@¡@·N¡@¡@¡@¡@¡@¡@¡@¡@¸q

????????????????????????????????????????????????????????????????????????????

¡@¡@¡@ 0 ¨t²Î°O¾ÐÅ餣°÷¡A¥i°õ¦æ¤å¥ó³Q¯}Ãa©Î©I¥s«Dªk

¡@¡@¡@ 2 ¤å¥ó¨S¦³³Qµo²{

¡@¡@¡@ 3 ¸ô®|¨S¦³³Qµo²{

¡@¡@¡@ 5 ¥ø¹Ï°ÊºAÁåµ²¤@­Ó¥ô°È©ÎªÌ¦³¤@­Ó¦@¨É©Îºô¸ô«OÅ@¿ù

¡@¡@¡@ 6 ®w»Ý­n¬°¨C­Ó¥ô°È«Ø¥ß¤ÀÂ÷ªº¼Æ¾Ú¬q

¡@¡@ ¡@ 8 ¨S¦³¨¬°÷ªº°O¾ÐÅé±Ò°ÊÀ³¥Îµ{¦¡

¡@¡@ 10 Windowsª©¥»¤£¥¿½T

¡@¡@¡@ 11 ¥i°õ¦æ¤å¥ó«Dªk¡C©ÎªÌ¤£¬OWindowsÀ³¥Îµ{¦¡¡A©ÎªÌ¦b.EXE¬M

¡@¡@ ¡@¡@ ¹³¤¤¦³¿ù»~

¡@¡@¡@ 12 À³¥Îµ{¦¡¬°¤@­Ó¤£¦Pªº§@·~¨t²Î³]­p(¦pOS/2µ{¦¡)

13 À³¥Îµ{¦¡¬°MS DOS4.0³]­p

¡@¡@¡@ 14 ¥i°õ¦æ¤å¥óªº«¬¦¡¤£ª¾¹D

¡@¡@¡@ 15 ¸Õ¹Ï¸Ë¸ü¤@­Ó¹ê¼Ò¦¡À³¥Îµ{¦¡(¬°¦­´ÁWindowsª©¥»³]­p)

16 ¸Õ¹Ï¸Ë¸ü¥]§t¥i¼gªº¦h­Ó¼Æ¾Ú¬qªº¥i°õ¦æ¤å¥óªº²Ä¤G­Ó¹ê¨Ò

¡@¡@¡@ 19 ¸Õ¹Ï¸Ë¸ü¤@­ÓÀ£ÁYªº¥i°õ¦æ¤å¥ó¡C¤å¥ó¥²¶·³Q¸ÑÀ£«á¤~¯à³Q¸Ëµô

¡@¡@¡@ 20 °ÊºAÁåµ²®w¤å¥ó«Dªk

¡@¡@¡@ 21 À³¥Îµ{¦¡»Ý­n32¦ìÂX®i

¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w

¡@¡@°²¦p¦bÀ³¥Îµ{¦¡¥ÎLoadlibrary©I¥s¬Y¤@¼Ò¸s²Õ«e¡A¨ä¥¦À³¥Îµ{¦¡¤w§â¸Ó¼Ò¸s²Õ¸ü¤J°O¾ÐÅé¡A«hLoadlibrary¨Ã¤£·|¸Ë¸ü¸Ó¼Ò¸s²Õªº¥t¤@¹ê¨Ò¡A¦Ó¬O¨Ï¸Ó¼Ò¸s²Õªº¡§¤Þ¥Î­p¼Æ¡¨¥[1¡C¡@

¡@¡@2.GetProcAddress¡G¾ß¨úµ¹©w¼Ò¸s²Õ¤¤¨ç¼Æªº¦ì§}

¡@¡@»yªk¬°¡G¡@

¡@¡@function GetProcAddress(Module: THandle; ProcName: PChar): TFarProc;¡@

Module¥]§t³Q©I¥sªº¨ç¼Æ®w¼Ò¸s²Õªº¥y¬`¡A³o­Ó­È¥ÑLoadlibraryªð¦^¡C¦pªG§âModule³]©w¬°nil¡A«hªí¥Ü­n¤Þ¥Î¥Ø«e¼Ò¸s²Õ¡C

¡@¡@ProcName¬O«ü¦V§t¦³¨ç¼Æ¦Wªº¥Hnilµ²§Àªº¦r¤¸¦êªº«ü¼Ð¡A©ÎªÌ¤]¥i¥H¬O¨ç¼Æªº¦¸§Ç­È¡C¦pªGProcName°Ñ¼Æ¬O¦¸§Ç­È¡A«h¦pªG¸Ó¦¸§Ç­Èªº¨ç¼Æ¦b¼Ò¸s²Õ¤¤¨Ã¤£¦s¦b®É¡AGetProcAddress¤´ªð¦^¤@­Ó«Dnilªº­È¡C³o±N¤Þ°_²V¶Ã¡C¦]¦¹¤j³¡¤À±¡ªp¤U¥Î¨ç¼Æ¦W¬O¤@ºØ§ó¦nªº¿ï¾Ü¡C¦pªG¥Î¨ç¼Æ¦W¡A«h¨ç¼Æ¦Wªº«÷¼g¥²¶·»P°ÊºAÁåµ²®w¤å¥óEXPORTS¸`¤¤ªº¹ïÀ³«÷¼g¬Û¤@­P¡C

¡@¡@¦pªGGetProcAddress°õ¦æ¦¨¥\¡A«hªð¦^¼Ò¸s²Õ¤¤¨ç¼Æ¤J¤f³Bªº¦ì§}¡A§_«hªð¦^nil¡C

3.Freelibrary¡G±q°O¾ÐÅ餤²¾¥X®w¼Ò¸s²Õ

¡@¡@»yªk¬°¡G¡@

¡@¡@procedure Freelibrary(Module : THandle);¡@

Module¬°®w¼Ò¸s²Õªº¥y¬`¡C³o­Ó­È¥ÑLoadlibraryªð¦^¡C

¡@¡@¥Ñ©ó®w¼Ò¸s²Õ¦b°O¾ÐÅ餤¥u¸Ë¸ü¤@¦¸¡A¦]¦Ó©I¥sFreelibrary­º¥ý¨Ï®w¼Ò¸s²Õªº¤Þ¥Î­p¼Æ´î¤@¡C¦pªG¤Þ¥Î­p¼Æ´î¬°0¡A«h¨ø¥X¸Ó¼Ò¸s²Õ¡C

¡@¡@¨C©I¥s¤@¦¸Loadlibrary´NÀ³©I¥s¤@¦¸FreeLibray¡A¥H«OÃÒ¤£·|¦³¦h¾lªº®w¼Ò¸s²Õ¦bÀ³¥Îµ{¦¡µ²§ô«á¤´¯d¦b°O¾ÐÅ餤¡C¡@

10.2.4.2 °ÊºA©I¥sÁ|¨Ò¡@

¡@¡@¹ï©ó°ÊºA©I¥s¡A§Ú­ÌÁ|¤F¦p¤Uªº¤@­Ó²³æ¨Ò¤l¡C¨t²Î¤@¦@¥]§t¨â­Ó½s¿è®Ø¡C¦b²Ä¤@­Ó½s¿è®Ø¤¤¿é¤J¤@­Ó¦r¤¸¦ê¡A¦Ó«á¦b²Ä¤G­Ó½s¿è®Ø¤¤¿é¤J¦r¤¸¡C¦pªG¸Ó¦r¤¸¥]§t¦b²Ä¤@­Ó½s¿è®Øªº¦r¤¸¦ê¤¤¡A«h¼ÐÅÒ®ØÅã¥Ü¸ê°T¡G¡§¦ì©ó²Än¦ì¡C¡¨¡A§_«hÅã¥Ü¸ê°T¡G¡§¤£¥]§t³o­Ó¦r¤¸¡C¡¨¡C¦p¹Ï¬Oµ{¦¡ªº°õ¦æ¤¶­±¡C

¿é¤JÀˬd¥\¯àªº¹ê²{¦bEdit2ªºOnKeyPress¨Æ¥ó³B²z¹Lµ{¤¤¡Aµ{¦¡²M³æ¦p¤U¡C¡@

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);

var

order: Integer;

txt: PChar;

PFunc: TFarProc;

Moudle: THandle;

begin

Moudle := Loadlibrary('c:\dlls\example.dll');

if Moudle > 32 then

begin

Edit2.text := '';

Pfunc := GetProcAddress(Moudle,'Instr');

txt := StrAlloc(80);

txt := StrPCopy(txt,Edit1.text);

Order := TInstr(PFunc)(txt,Key);

if Order = -1 then

Label1.Caption := '¤£¥]§t³o­Ó¦r¤¸ '

else

Label1.Caption := '¦ì©ó²Ä'+IntToStr(Order+1)+'¦ì';

end;

Freelibrary(Moudle);

end;

¡@¡@¦b§Q¥ÎGetProcAddessªð¦^ªº¨ç¼Æ«ü¼Ð®É¡A¥²¶·¶i¦æ±j¨î«¬¦¡Âà´«¡G¡@

Order := TInstr(PFunc)(text,Key);

¡@¡@TInStr¬O¤@­Ó©w¸q¦n¤Fªº¨ç¼Æ«¬¦¡¡G¡@

type

TInStr = function(Source: PChar;Check: Char): Integer;¡@

10.3 §Q¥ÎDLLs¹ê²{¼Æ¾Ú¶Ç¿é¡@

10.3.1 DLLs¤¤ªº¥þ§½°O¾ÐÅé¡@

¡@¡@Windows³W©w¡GDLLs¨Ã¤£¾Ö¦³¥¦¥´¶}ªº¥ô¦ó¤å¥ó©Î¥¦¤À°tªº¥ô¦ó¥þ§½°O¾ÐÅé¶ô¡C³o¨Çª«¥ó¥Ñª½±µ©Î¶¡±µ©I¥sDLLsªºÀ³¥Îµ{¦¡¾Ö¦³¡C³o¼Ë¡A·íÀ³¥Îµ{¦¡¤¤¤î®É¡A¥¦¾Ö¦³ªº¥´¶}ªº¤å¥ó¦Û°ÊÃö³¬¡A¥¦¾Ö¦³ªº¥þ§½°O¾ÐÅé¶ô¦Û°ÊÄÀ©ñ¡C³o´N·N¨ýµÛ¦sÀɦbDLLs¥þ§½ÅܼƤ¤ªº¤å¥ó©M¥þ§½°O¾ÐÅé¶ôÅܼƦbDLLs¨S¦³³Q³qª¾ªº±¡ªp¤U´NÅܬ°«Dªk¡C³o±Nµ¹¨ä¥¦¨Ï¥Î¸ÓDLLsªºÀ³¥Îµ{¦¡³y¦¨§xÃø¡C

¡@¡@¬°¤FÁקK¥X²{³oºØ±¡ªp¡A¤å¥ó©M¥þ§½°O¾ÐÅé¶ô¥y¬`¤£À³§@¬°DLLsªº¥þ§½ÅܼơA¦Ó¬O§@¬°DLLs¤¤¹Lµ{©Î¨ç¼Æªº°Ñ¼Æ¶Ç»¼µ¹DLLs¨Ï¥Î¡C©I¥sDLLsªºÀ³¥Îµ{¦¡À³¸Ó­t³d¹ï¥¦­ÌªººûÅ@¡C

¡@¡@¦ý¦b¯S©w±¡ªp¤U¡ADLLs¤]¥i¥H¾Ö¦³¦Û¤vªº¥þ§½°O¾ÐÅé¶ô¡C³o¨Ç°O¾ÐÅé¶ô¥²¶·¥Îgmem_DDEShareÄݩʶi¦æ¤À°t¡C³o¼Ëªº°O¾ÐÅé¶ôª½¨ì³QDLLsÅã¥ÜÄÀ©ñ©ÎDLLsµ²§ô®É³£«O«ù¦³®Ä¡C

¡@¡@¥ÑDLLsºÞ²zªº¥þ§½°O¾ÐÅé¶ô¬OÀ³¥Îµ{¦¡¶¡¶i¦æ¼Æ¾Ú¶Ç¿éªº¤S¤@³~®|¡A¤U­±§Ú­Ì±N±Mªù°Q½×³o¤@°ÝÃD¡C¡@

10.3.2 §Q¥ÎDLLs¹ê²{À³¥Îµ{¦¡¶¡ªº¼Æ¾Ú¶Ç¿é¡@

¡@¡@§Q¥ÎDLLs¹ê²{À³¥Îµ{¦¡¶¡ªº¼Æ¾Ú¶Ç¿éªº¨BÆJ¬°¡G

¡@¡@1. ½s¼g¤@­ÓDLLsµ{¦¡¡A¨ä¤¤¾Ö¦³¤@­Ó¥Îgmem_DDEShareÄݩʤÀ°tªº¥þ§½°O¾ÐÅé¶ô¡F

¡@¡@2. ¦øªA¾¹µ{¦¡©I¥sDLLs¡A¦V¥þ§½°O¾ÐÅé¶ô¼g¤J¼Æ¾Ú¡F

¡@¡@3. ¥Î¤áµ{¦¡©I¥sDLLs¡A±q¥þ§½°O¾ÐÅé¶ôŪ¨ú¼Æ¾Ú¡C¡@

10.3.2.1 ¥Î©ó¹ê²{¼Æ¾Ú¶Ç¿éªºDLLsªº½s¼g¡@

¡@¡@¥Î©ó¹ê²{¼Æ¾Ú¶Ç¿éªºDLLs»P¤@¯ëDLLsªº½s¼g°ò¥»¬Û¦P¡A¨ä¤¤¯S§Oªº¦a¤è¬O¡G

¡@¡@1. ©w¸q¤@­Ó¥þ§½Åܼƥy¬`¡G¡@

var

hMem: THandle;

¡@¡@2. ©w¸q¤@­Ó¹Lµ{¡Aªð¦^¸Ó¥þ§½Åܼƪº¥y¬`¡C¸Ó¹Lµ{­n¥]§t¦bexports¤l¥y¤¤¡C¦p¡G¡@

function GetGlobalMem: THandle; export;

begin

Result := hMem;

end;

¡@¡@3. ¦bªì©l¤Æ¥N½X¤¤¤À°t¥þ§½°O¾ÐÅé¶ô¡G

µ{¦¡²M³æ¦p¤U¡G¡@

begin

hMem := GlobalAlloc(gmem_MOVEABLE and gmem_DDEShare,num);

if hMem = 0 then

MessageDlg('Could not allocate memory',mtWarning,[mbOK],0);

end.

¡@¡@num¬O¤@­Ó¹w©w¸qªº±`¼Æ¡C

Windows API¨ç¼ÆGlobalAlloc¥Î©ó±q¥þ§½°O¾ÐÅé°ï¤¤¤À°t¤@¶ô°O¾ÐÅé¡A¨Ãªð¦^¸Ó°O¾ÐÅé¶ôªº¥y¬`¡C¸Ó¨ç¼Æ¥]¬A¨â­Ó°Ñ¼Æ¡A²Ä¤@­Ó°Ñ¼Æ¥Î©ó³]©w°O¾ÐÅé¶ôªº¤À°t¼Ð»x¡C¥i¥H¨Ï¥Îªº¤À°t¼Ð»x¦p¤Uªí©Ò¥Ü¡C

ªí10.3 ¥þ§½°O¾ÐÅé¶ôªº¤À°t¼Ð»x

¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w

¼Ð §Ó ·N ¸q

??????????????????????????????????????????????????????????????????

gmem_DDEShare ¤À°t¥i¥ÑÀ³¥Îµ{¦¡¦@¨Éªº°O¾ÐÅé

gmem_Discardable ¤À°t¥i©ß±óªº°O¾ÐÅé(¥u»Pgmem_Moveable³s¥Î)

gmem_Fixed ¤À°t©T©w°O¾ÐÅé

gmem_Moveable ¤À°t¥i²¾°Êªº°O¾ÐÅé

gmem_Nocompact ¸Ó¥þ§½°ï¤¤ªº°O¾ÐÅ餣¯à³QÀ£ÁY©Î©ß±ó

gmem_Nodiscard ¸Ó¥þ§½°ï¤¤ªº°O¾ÐÅ餣¯à³Q©ß±ó

gmem_NOT_Banked ¤À°t¤£¯à³Q¤À¬qªº°O¾ÐÅé

gmem_Notify ³qª¾¥\¯à¡C·í¸Ó°O¾ÐÅé³Q©ß±ó®É©I¥sGlobalNotify¨ç¼Æ

gmem_Zeroinit ±N©Ò¤À°t°O¾ÐÅé¶ôªº¤º®eªì©l¤Æ¬°¹s

¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¡@

¡@¡@¦³¨â­Ó¹w©w¸qªº±`¥Î¸s¸s²Õ¦X¬O¡G

GHND = gmem_Moveable and gmem_Zeroinit

GPTK = gmem_Fixed and gmem_Zeroinit

¡@¡@²Ä¤G­Ó°Ñ¼Æ¥Î©ó³]©w±ý¤À°tªº¦ì¤¸¸s²Õ¼Æ¡C¤À°tªº¦ì¤¸¸s²Õ¼Æ¥²¶·¬O32ªº­¿¼Æ¡A¦]¦Ó¹ê»Ú¤À°tªº¦ì¤¸¸s²Õ¼Æ¥i¯à¤ñ©Ò³]©wªº­n¤j¡C

¡@¡@¥Ñ©ó¥Îgmem_DDEShare¤À°tªº°O¾ÐÅé¦b¤À°t°O¾ÐÅ骺¼Ò¸s²Õ²×¤î®É¦Û°Ê©ß±ó¡A¦]¦Ó¤£¥²©I¥sGlobalFreeÅ㦡ÄÀ©ñ°O¾ÐÅé¡C

¡@


«á¤@­¶
«e¤@­¶
¦^¥Ø¿ý
¦^­º­¶