¡¡ Õª Òª ¸ÃÎÄÌá³öÁËÒ»ÖÖÔÚWindows3.1±£»¤Ä£Ê½ÏÂ,ͨ¹ý¶¯Ì¬Á¬½Ó¿â(DLL)Éú³ÉÖжϷþÎñ³ÌÐò´úÂë,ʵÏÖÍâÉèÓëWindowsÓ¦ÓóÌÐòʵʱͨÐŵÄÓÐЧ·½·¨¡£
Ò»¡¢Ç° ÑÔ
¼ÆËã»úµÄÈÕÒæÆÕ¼°ºÍ¼ÆËã»ú¼¼ÊõÈÕÒæ³ÉÊì,ʹµÃ¼ÆËã»úÔÚ¹¤Òµ¿ØÖƼà²âÖеÄÓ¦Óý¥½¥ÉîÈë¡£µ«¹¤ÒµÓ¦Óò»Í¬ÓÚÆäËü·½Ãæ,ËüÒªÇóÓнÏÇ¿µÄʵʱÐÔ¡£ÏÖÔÚÓкܶàµÄDOSÈí¼þÔÚÔËÐйý³ÌÖÐͨ¹ý¹Ò½ÓÍⲿÖжϷ½Ê½ÊµÏÖDOSÓ¦ÓÃÈí¼þÓëÍâÉèµÄʵʱͨÐÅ,ÕâÖÖ·½·¨ÊµÏÖÆðÀ´Ê®·Ö¼òµ¥¡£¶øÔÚWindowsÖÐÓ¦ÓóÌÐòÄÜ·ñÒ²Äܹ»ÀûÓÃÍⲿӲÖжÏʵÏÖÍâÉèÓëWindowsÓ¦ÓóÌÐòµÄʵʱͨÐÅÄØ?´ð°¸Êǿ϶¨µÄ¡£ÕâÀïµÄ¹Ø¼üÊÇÒª½â¾öºÃÖжϴúÂëÓëWindowsÓ¦ÓóÌÐòÏ໥֮¼ä½»»»ÐÅÏ¢µÄÎÊÌâ¡£
´ÓÍâÉè·¢ËÍÒì²½µÄÓ²ÖжÏ,ͨ¹ýÖжϴ¦Àí³ÌÐò´«µÝÒ»ÌõÐÅÏ¢¸øWindowsÓ¦ÓóÌÐò¡£Õâʱ¿ÉÒÔ³õʼ»¯Ïà¹Ø¶Ë¿Ú,×¼±¸ºÃÊý¾Ý,È»ºó½øÐÐÊý¾Ý´«ËÍ,´Ó¶ø×öµ½ÊµÊ±Í¨ÐÅ¡£
ʵÏÖWindowsÓ¦ÓóÌÐòÏìÓ¦ÍⲿÖжϵķ½·¨Óкܶà,ÈçMicrosoft¹«Ë¾×Ô¼º¿ª·¢µÄSDK¡¢DDKÈí¼þ°ü,ʹÓÃǶÈëʽ»ã±àµÈµÈ¡£±¾ÎĽ«½éÉÜÒ»ÖÖÔÚBC++3.1µÄ»ù´¡ÉÏÀûÓÃWindows 3.1ÓµÓеÄһЩ¹¦ÄÜʵÏÖWindowsʵʱͨÐŵÄʵÀý¡£
¶þ¡¢ÖжϴúÂëµÄλÖÃ
ÔÚWindowsÖÐ,¼¸ºõËùÓеÄÒ첽ʼþ¶¼ÊÇÓÉÖжϴ¦Àí³ÌÐòÀ´¹ÜÀíµÄ¡£Öжϴ¦Àí³ÌÐò°üº¬ÔÚÉ豸Çý¶¯³ÌÐòÖÐ,ÓÉWindowsÔÚ»·¾³³õʼ»¯Öа²×°¡£ÀýÈç,KEYBOARD.DRV¡¢MOUSE.DRVºÍCOMM.DRV¾ùº¬ÓÐÖжϴ¦Àí³ÌÐò,ÒÔ´¦ÀíÏàÓ¦µÄ¼üÅÌ¡¢Êó±êºÍ´®ÐпڵÄÒì²½Öжϡ£¿ÉÒÔ·ÂÕÕ±ê×¼É豸Çý¶¯³ÌÐò,±àдÖжϴ¦Àí´úÂë,ÒÔÏìÓ¦ÍâÉèµÄͨÐÅÇëÇó,´Ó¶øÍê³ÉÒ»´ÎʵʱͨÐÅ¡£
ÖжϴúÂë¼È¿ÉÒÔ°üº¬ÔÚÓ¦ÓóÌÐòµÄ¿ÉÖ´ÐдúÂëÖÐ,Ò²¿ÉÒÔ°üº¬ÔÚ¶¯Ì¬Á¬½Ó¿â(DLL)ÖС£°üº¬ÔÚÓ¦ÓóÌÐòÖеĴúÂëÖ»ÄÜÔÚÒ»¸ö³ÌÐòÖÐʹÓÃ,¶øÔÚ¶¯Ì¬Á¬½Ó¿âÖеĴúÂëÔò¿ÉÒÔÔÚWindowsϵͳÖÐËùÓеÄÓ¦ÓóÌÐòËù¹²Ïí¡£ÕâÑù²»½öÔÚÕû¸öWindowsϵͳÖÐÖ»ÓÐÒ»¸öÖжϴúÂëµÄ¸±±¾,Ìá¸ßÁËÄÚ´æµÄʹÓÃЧÂÊ,¸üÖØÒªµÄÊÇ¿ÉÒÔ·ÀÖ¹ÓÉÓÚͬʱ´æÔÚ¶à¸öÖжϴúÂëµÄ¸±±¾¶ø·¢Éú³åÍ»¡£±¾ÎĽ«ÔÚDLLÖбàÖÆÖжϴ¦Àí³ÌÐò¡£
µ±¶¯Ì¬Á¬½Ó¿â±»×°Èëʱ,Òªµ÷ÓÃDLL¿âµÄÈë¿ÚµãLibMain(),ÀûÓÃÕâÒ»µã¿ÉÒÔÖ´ÐÐһЩ³õʼ»¯¹¤×÷,¿ÉÒÔ·ÖÅäһЩÄÚ´æ¿é,¿ÉÒÔ³õʼ»¯Ò»Ð©È«¾Ö±äÁ¿»òÕß¾²Ì¬±äÁ¿,¿ÉÒÔ°²×°ÖжϷþÎñ³ÌÐòµÄ´úÂëµÈµÈ¡£ÀýÈç:
void interrupt (oldIsr)(--CPPARGS)
/* ¾ÉµÄÖжϷþÎñ³ÌÐòµØÖ· */
LibMain(HANDLE hInstance,WORD wDataSeg,WORD cbHeapSize,L
PSTR
lpszCmdLine)
{
¡
oldIsr=getvect(IRQNum);
/* IRQNumÖ¸ÖжϺŠ*/
setvect(IRQNum,newIsr);
/* newIsrÖ¸ÐÂÖжϷþÎñ³ÌÐò´úÂë */
return(1);
}
º¯Êýsetvect()¼È¿ÉÔÚʵģʽÏÂ,Ò²¿ÉÔÚ±£»¤Ä£Ê½ÏÂÉèÖÃÖжϴ¦ÀíÏòÁ¿¡£
ÉÏÊö´úÂëÒ²¿ÉÒÔ·ÅÔÚÒ»¸öÓÉÓû§ÉèÖõÄÒý³ö(export)º¯ÊýÖÐ,ÔÚÓ¦ÓóÌÐòÖÐÓû§¿ÉÒÔµ÷ÓôËÒý³öº¯ÊýÀ´°²×°ÖжϷþÎñ³ÌÐò´úÂë¡£
ÓÉÓÚÖжϿÉÒÔÔÚÈκÎʱ¿Ì·¢Éú,ÖжϴúÂë±ØÐëפÁôÔÚÄÚ´æÖÐ,²¢ÇÒÔÚÓ¦ÓóÌÐòÔËÐеĹý³ÌÖÐÒ»Ö±´¦ÓÚijһ¹Ì¶¨ÄÚ´æÖС£ÕâÒ»µãÎÞÂÛÊÇÔÚʵģʽ»¹ÊÇÔÚ±£»¤Ä£Ê½Ï¶¼ÊÇÒ»Öµġ£
ÔÚDLLµÄÄ£¿é¶¨ÒåÎļþÖÐӦעÒâ:
1.CODEÓï¾äΪ¹Ì¶¨´úÂë¶Î,¼´FIXED;
2.EXPORTSÓï¾äÒªÒý³ö±»Ó¦ÓóÌÐòºÍÆäËüDLLÓÃ×÷Èë¿ÚµãµÄº¯Êý¡£
Èý¡¢Í¨ÐÅ»úÖÆ
±àдʵʱͨÐÅÀý³Ì¹Ø¼üÔÚÓÚ±ØÐëÈÏʶµ½,Ò첽ʼþ¶ÔÓ¦ÓóÌÐòµÄ´¥·¢ÊÇÒì²½·¢ÉúµÄ,²»ÔÚWindowsµÄÏûÏ¢´¦Àí»úÖÆºÍ¶àÈÎÎñ·¶Î§ÄÚ¡£ÎªÁËʹͨÐÅÀý³ÌÄܹ»ÕýÈ·µØ¹¤×÷,ͨÐÅÀý³Ì±ØÐë֪ͨWindowsÓÐÒ첽ʼþ·¢Éú,ÇÒ²»ÄÜ´ò¶ÏÓ¦ÓóÌÐòµÄÈÎÎñ¹ÜÀí»òÏûÏ¢Á÷¡£Òª×÷µ½ÕâÒ»µã,ͨÐÅÀý³Ì±ØÐëͨ¹ýµ÷ÓÃPostMessage»òPostAppMessageº¯ÊýÏòÓ¦ÓóÌÐòµÄÏûÏ¢¶ÓÁÐÖмÓÈëÒ»ÌõÏûÏ¢¡£
ÐèҪעÒâµÄÊÇ,ÔÚDLLÖе÷ÓÃPostMessage(HWND hwnd, ¡)ʱ,±ØÐëÏÈÈ·¶¨hwndµÄʵ¼ÊÖµ,¿ÉÒÔͨ¹ýʹÓÃÒý³öº¯ÊýµÄ°ì·¨À´ÊµÏÖ,ÈçÏÂËùʾ:
static HWND hWndApp;
void FAR PASCAL SetIsrWin(HWND hwnd)
{
hWndApp=hwnd;
}
È»ºóÔÚÓ¦ÓóÌÐòµÄ´°¿Úº¯ÊýÖÐ,¶ÔWM-CREATEÏûÏ¢½øÐд¦Àíʱµ÷Óô˺¯ÊýÀ´³õʼ»¯DLLÖеľ²Ì¬±äÁ¿hWndApp:
CASE WM-CREATE:
¡
SetIsrWin(hwnd); /* hwndÖ¸Ó¦ÓóÌÐò´°¿Ú¾ä±ú */
¶¨ÒåÒ»¸öÔÚÓ¦ÓóÌÐòÖÐʹÓõÄÏûÏ¢:
#define ISRM-RUPT WM-USER+255×îºóÔÚDLLÖеÄÖжϷþÎñ³ÌÐò´úÂëÖÐ,µ÷ÓÃPostMessage¼´¿ÉÍê³ÉWindowsÓ¦ÓóÌÐòºÍÖжϷþÎñ³ÌÐò´úÂëÏ໥µÄÐÅÏ¢½»Á÷:
void interrupt newIsr(--CPPARGS)
{
¡
PostMessage(hWndApp,WM-RUPT,wParam,lParam);
¡
}