ºìÁªLinuxÃÅ»§
Linux°ïÖú

±à³ÌʵÓÃƪ--C£«£«Builder¿ª·¢¶¯»­DLL

·¢²¼Ê±¼ä:2006-05-03 11:33:23À´Ô´:ºìÁª×÷Õß:°®µÄ±ßÔµ
ÎÒÃÇÔÚWindows98»·¾³ÏÂÖ´Ðп½±´Îļþ¡¢²éÕÒÎļþµÈ¼ÆËã»úºÄʱ½Ï³¤µÄ²Ù×÷ʱ£¬ Windows»áÏÔʾһ¸öС µÄ¶¯»­£¬Ö¸Ê¾ÕýÔÚ½øÐеIJÙ×÷£¬ÓëËÀ°åµÄ¾²Ö¹Í¼ÏñÏà±ÈÔöÉ«²»ÉÙ¡£ÄÇôÎÒÃÇ×Ô¼º¿ª·¢Èí¼þʱ£¬ÄÜ·ñÒ²ÏÔʾһ¸öÕâÑùµÄ¶¯»­ÌáʾÄØ£¿±ÊÕß¿ª·¢ÁËÒ»¸öÄܹ»ÔÚPBϵ÷ÓõĶ¯»­DLL£¬ÓÉÓÚ²ÉÓöàÏ̱߳à³Ì£¬PBµ÷ÓõÄDLLº¯ÊýÄܹ»¼°Ê±½«¿ØÖÆȨ½»»¹¸øPB£¬²»Ó°ÏìÓ¦ÓÃϵͳµÄÔËת¡£

Ò»¡¢´úÂëÓë±àÒëÑ¡Ïî

ÔÚC£«£«BuilderÖд´½¨Ò»¸ö¿Õ°×µÄDLLÏîÄ¿¡£

´´½¨Ò»¸ö¿Õ°×µÄForm£¬ÐÞ¸ÄËüµÄÊôÐÔΪ:

BorderStyle=bsDialog
BorderIcons µÄ ×Ó Êô ÐÔ ¾ù ΪFalse
FormStyle=fsStayOnTop
Position= poScreenCenter
Name=StatusForm

ÔÚFormÉÏÌí¼ÓÒ»¸öWin32ϵÄAnimate¿Ø¼þAnimate1£¬ÐÞ¸ÄËüµÄÊôÐÔΪAlign=alTop

ÔÚFormÉÏÌí¼ÓÒ»¸öStandard ϵÄButton ¿Ø¼þButton_Cancel£¬ÔÙÌí¼ÓSystemϵÄTimer¿Ø¼þTimer1£¬ ÉèÖö¨Ê±Intervalʱ¼äλ250£¬½Ï¿ìÏìÓ¦Óû§µÄÈ¡ÏûÇëÇó¡£

ÒòΪPBÓ¦ÓÃϵͳÓ붯»­´°Ìå´úÂë·Ö±ðÊôÓÚÁ½¸öỊ̈߳¬²»ÄܲÉÓÃPBÏß³ÌÖ±½Ó¹Ø±Õ¶¯»­´°ÌåÏ̵߳Ĵ°¿Ú£¬ ·ñÔò»áÒýÆðϵͳÔËÐв»Õý³££¬Òò´Ë²ÉÓÃPBÏß³ÌÉèÖùرձêÖ¾£¬¶ø¶¯»­Ï̲߳ÉÓÃTimer¿Ø¼þ¶¨Ê±¼ì²é±ê Ö¾£¬Ò»µ©¼ì²âµ½¹Ø±Õ±êÖ¾£¬¾Í¹Ø±Õ´°¿Ú£¬Çå³ýÏ̱߳êÖ¾£¬½áÊø¶¯»­Ï̡߳£

ÏÂÃæ¸ø³ö±àÂë¼°±àÂëÔ­Àí£º

(1)DLLÖ÷Ìå´úÂ룺

/ £ªDLL Ö÷ Ìå ´ú Âë
¡¡ £ª ¶¨ ÒåDLL ¹« Óà ±ä Á¿
£ªg_CommonAVI ¶ÔAnimate ¿Ø ¼þ
¶¯ »­ Àà ÐÍ Ë÷ Òý
¡¡£ªgi_Canceled Button_Cancel
°´ Å¥ ÊÇ ·ñ ±» Ñ¡ Ôñ ¹ý
¡¡£ªgi_AVIType Òª ÏÔ Ê¾ µÄ ¶¯ »­ Àà ÐÍ£¬
ÓÉDLL Êä ³ö º¯ Êý ×ö Ϊ ²Î Êý Êä Èë
¡¡£ªgi_RequestClose Çë Çó ¶¯ »­ Ïß ³Ì ¹Ø ±Õ ±ê Ö¾
¡¡£ªgi_WindowActive ¶¯ »­ ´° ¿Ú Ëù ´¦ µÄ ×´ ̬
¡¡£ªlpsWinTitle ¶¯ »­ ´° Ìå µÄ ±ê Ì⣬
ÓÉDLL Êä ³ö º¯ Êý ×ö Ϊ ²Î Êý Êä Èë
¡¡£ª/

¡¡ ¡¡TCommonAVI g_CommonAVI[]={
¡¡ ¡¡ aviNone, aviFindFolder,
¡¡ ¡¡ aviFindFile, aviFindComputer,
¡¡ ¡¡aviCopyFiles, aviCopyFile,
¡¡ ¡¡ aviRecycleFile, aviEmptyRecycle,
¡¡ ¡¡aviDeleteFile
¡¡ ¡¡};
¡¡ ¡¡int gi_Canceled=0,gi_AVIType=0;
¡¡ ¡¡int gi_RequestClose=0,gi_WindowActive=0;
¡¡ ¡¡char lpsWinTitle[256];
¡¡ ¡¡HWND hWndParent=NULL;

¡¡ ¡¡/ £ª ¶¨ ÒåDLL Êä ³ö º¯ Êý £ª/
¡¡ ¡¡extern ¡°C" __declspec(dllexport) int pascal Dll
? EntryPoint(HINSTANCE hinst, unsigned
long reason, void £ª);
¡¡ ¡¡extern ¡°C" __declspec(dllexport) int pascal
ShowStatus Window
(int AVIType,LPSTR WinTitle,long hWnd);
extern ¡°C" __declspec(dllexport)
int pascal GetStatus(int ai_CloseWin);
extern ¡°C" __declspec(dllexport)
int pascal CloseStatusWindow();

¡¡ ¡¡ / £ª ¶¨ Òå Ïß ³ÌTformThread: £ª/
¡¡ ¡¡class TFormThread : public TThread{
¡¡ ¡¡public: // User declarations
¡¡ ¡¡__fastcall TFormThread(bool CreateSuspended);
¡¡ ¡¡void __fastcall Execute(void);
¡¡ ¡¡};
¡¡ ¡¡__fastcall TFormThread::
TFormThread(bool CreateSuspended):
TThread(CreateSuspended){
¡¡ ¡¡}
/ £ª ¶¯ »­ Ïß ³Ì Ö´ ÐÐ ´ú Â룬
¶¯ »­ ´° Ìå µÄ ¶¨ ʱ Æ÷ ¿Ø ¼þ »á ¹Ø ±Õ Ëü£¬
Çå ³ý ´° Ìå ´æ ÔÚ ±ê Ö¾ ºó ½á Êø Ïß ³Ì µÄ ÔË ÐÐ
£ª/
¡¡ ¡¡void __fastcall TFormThread::Execute(void){
¡¡ ¡¡gi_WindowActive=1;
¡¡ ¡¡ StatusForm=new TStatusForm(NULL);

¡¡ ¡¡ StatusForm £­>Caption=lpsWinTitle;
¡¡ ¡¡ StatusForm £­>ShowModal();
¡¡ ¡¡ gi_WindowActive=0;
¡¡ ¡¡ delete StatusForm;
¡¡ ¡¡ gi_RequestClose=0;
¡¡ ¡¡}
¡¡ ¡¡/ £ª ¶¨ Òå Ò» ¸ö Ïß ³Ì ʵ Àý Ö¸ Õë £ª/
¡¡ ¡¡TFormThread £ªFormThread;
¡¡ ¡¡ / £ª Êä ³ö º¯ Êý ´ú Âë ʵ ÏÖ ²¿ ·Ö
¡¡ ¡¡ £ª DllEntryPoint 32 λDLL Èë ¿Ú
¡¡ ¡¡ £ª ShowStatusWindow ÏÔ Ê¾ ¶¯ »­ ´° ¿Ú£¬
Ëü ͨ ¹ý ´´ ½¨ Ò» ¸ö Ïß ³Ì À´ ´´ ½¨ ´° ¿Ú£¬
±Ü Ãâ ÓÉ ÓÚ ´° ¿Ú µÄMODAL Êô ÐÔ ¶ø ʹ
¿Ø ÖÆ È¨ ²» ÄÜ ¼° ʱ µÄ ·µ »¹ ¸ø µ÷ Óà Õß
¡¡ ¡¡ £ª GetStatus È¡ µÃ¡° È¡ Ïû¡± ×´ ̬£¬
¼´ Óà »§ ÓРû ÓÐ Ñ¡ Ôñ¡° È¡ Ïû¡± °´ Å¥
¡¡ ¡¡ £ª CloseStatusWindow ¹Ø ±Õ ¶¯ »­ ´° ¿Ú£¬
¡¡ ¡¡ £ª/
¡¡ ¡¡__declspec(dllexport) int WINAPI DllEntryPoint
(HINSTANCE hinst, unsigned long reason, void £ª)
¡¡ ¡¡{
¡¡ ¡¡return 1;
¡¡ ¡¡}

¡¡__declspec(dllexport) int pascal ShowStatusWindow
(int AVIType,LPSTR WinTitle,long hWnd){
¡¡hWndParent=(HWND)hWnd;
memset(lpsWinTitle,0,sizeof(lpsWinTitle));
¡¡strncpy(lpsWinTitle,WinTitle,sizeof(lpsWin Title) £­1);
if (AVIType>0 £¦ £¦ AVIType<=8) gi_AVIType="AVIType;" ¡¡ ¡¡
FormThread="new" TFormThread(true); ¡¡ ¡¡ ¡¡
FormThread £­>Priority = tpNormal;
¡¡ ¡¡ FormThread £­>Resume();
¡¡ ¡¡}

¡¡__declspec(dllexport) int pascal GetStatus
(int ai_CloseWin){
¡¡ ¡¡if (gi_Canceled)
¡¡ ¡¡if (gi_WindowActive){
¡¡ ¡¡gi_RequestClose=1;
¡¡ ¡¡ while(gi_RequestClose);
¡¡ ¡¡ }

¡¡ ¡¡ return gi_Canceled;
¡¡ ¡¡}

¡¡ ¡¡__declspec(dllexport) int pascal CloseStatusWindow(){
¡¡ ¡¡ if (gi_WindowActive){
¡¡ ¡¡gi_RequestClose=1;
¡¡ ¡¡ while(gi_RequestClose);
¡¡ ¡¡}

¡¡ ¡¡ return gi_Canceled;
¡¡ ¡¡}

(2)´°ÌåStatusForm µÄ´úÂ룺

¡¡ ¡¡TStatusForm £ªStatusForm;
¡¡ ¡¡extern int gi_Canceled;
¡¡ ¡¡extern int gi_AVIType;
¡¡ ¡¡extern TCommonAVI g_CommonAVI[];
¡¡ ¡¡__fastcall TStatusForm::TStatusForm
(HWND ParentWindow)
¡¡ ¡¡ : TForm(ParentWindow)
¡¡ ¡¡{
¡¡ ¡¡ gi_Canceled=0;
¡¡ ¡¡}
¡¡ ¡¡// È¡ Ïû °´ Å¥ ²¢ ²» Ö± ½Ó ¹Ø ±Õ ´° Ì壬
¶ø Ö¸ ʾ Éè Öà ȡ Ïû ±ê Ö¾£¬ ¹© µ÷ Óà Õß ²é ¿´
¡¡ ¡¡void __fastcall TStatusForm::Button_CancelClick
(TObject £ªSender)
¡¡ ¡¡{
¡¡ ¡¡gi_Canceled=1;
¡¡ ¡¡// ModalResult=mrCancel;
¡¡ ¡¡}
¡¡ ¡¡ ¡¡// ¼¤ »î ¶¯ »­£¬ ÔÚFORMCREATE Ê ¼þ ÖÐ
¡¡ ¡¡void __fastcall TStatusForm::FormCreate
(TObject £ªSender)
¡¡ ¡¡{
¡¡ ¡¡ Animate1 £­>CommonAVI=g_CommonAVI[gi_AVI
Type];
¡¡ ¡¡ Animate1 £­>Active = true;
¡¡ ¡¡}
¡¡
¡¡extern int gi_RequestClose;
¡¡// ¶¨ ʱ Æ÷ Ê ¼þ ¼ì ²â µ½ ½á Êø ±ê Ö¾ ¹Ø ±Õ ´° Ìå
¡¡void __fastcall TStatusForm::Timer1Timer
(TObject £ªSender)
¡¡ ¡¡{
¡¡ ¡¡ if (gi_RequestClose){
¡¡ ¡¡ ModalResult=mrOk;
¡¡ ¡¡ }
¡¡ ¡¡}

ÉèÖñàÒëÑ¡Ï´ò¿ªProject Options ¶Ô»°¿ò£¬Çå³ýLinkerÊôÐÔÒ³ÖеÄUse Dynamic RTL±êÖ¾£¬Çå³ýPackagesÊôÐÔÒ³ÖеÄBuild with runtime packages¡£ ÕâÑùÖ»Òªµ¥¸öDLL¾Í¿ÉÒÔÔËÐÐÁË£¬¶ø²»±Ø°²×° һЩ¶¯Ì¬Á¬½ÓÔËÐÐʱ¼ä¿â¡£

¶þ¡¢Ê¹Óö¯»­DLL

1.¶¨Ò壺

¡¡ ¡¡//Declare £­> Global External Functions
¡¡ ¡¡FUNCTION Long ShowStatusWindow
(Long AVIType,String WinTitle,long hWnd)
£¦LIBRARY ¡°STATWIN.DLL" ALIAS FOR
¡°Show StatusWindow"

¡¡ ¡¡FUNCTION Long GetCancelStatus
(Long CloseWindow) £¦LIBRARY
¡°STATWIN.DLL" ALIAS FOR ¡°GetStatus"

¡¡ ¡¡FUNCTION Long CloseStatusWindow() £¦
¡¡LIBRARY ¡°STATWIN.DLL" ALIAS FOR
¡°CloseStatusWindow"

2.µ÷Óãº

¡¡ ¡¡long ll_EndTime
¡¡ ¡¡// ÏÔ Ê¾ ²é ÕÒ ÎÄ ¼þ ¼Ð ¶¯ »­
¡¡ ¡¡ShowStatusWindow(2)
¡¡ ¡¡setpointer(HourGlass!)

¡¡ ¡¡ll_EndTime = Cpu() £« 10 £ª 1000
¡¡ ¡¡DO
¡¡ ¡¡ if GetCancelStatus(0)=1 then
¡¡ ¡¡ exit
¡¡ ¡¡end if
¡¡ ¡¡ // ×ö Ïë ×ö µÄ Ê Çé
¡¡ ¡¡LOOP UNTIL cpu() > ll_EndTime

¡¡ ¡¡CloseStatusWindow()
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ