八宝书库 > 文学其他电子书 > 深入浅出MFC第2版(PDF格式) >

第17部分

深入浅出MFC第2版(PDF格式)-第17部分

小说: 深入浅出MFC第2版(PDF格式) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




           #0015 

           #0016  mon。obj : mon。c 

           #0017     cl /W3 /GX /Zi /YX /Od /DWIN32 /D_CONSOLE /FR /c mon。c 

           #0018 

           #0019  exedump。obj : exedump。c 

           #0020     cl /W3 /GX /Zi /YX /Od /DWIN32 /D_CONSOLE /FR /c exedump。c 

           #0021 

           #0022  objdump。obj : objdump。c 

           #0023     cl /W3 /GX /Zi /YX /Od /DWIN32 /D_CONSOLE /FR /c objdump。c 



       如果是很简单的情況,例如本节的  JBACKUP  只有一个  C  原代码,那么这样也行 (在 



       命令列之下): 



           cl jbackup。c     A 将获得 jbackup。exe 



                                                                                              31 


…………………………………………………………Page 94……………………………………………………………

    注意,环境变量要先设定好(请参考本章稍早的「如何产生Generic。exe 」一节)。 



    第3章的Frame_ 程序则是这样完成的: 



    cl my。cpp mfc。cpp       my。exe 

                              将获得 



    至于到底该联结哪些链接库,全让CL。EXE 去伤脑筋就好了。 



JBACKUP :Win32 Console 程序设计 



    撰写console 程序,有几个重点请注意: 



    1。 进入点为main 。 



             pr intf scanf cin cout  

    2。 可以使用      、     、   、    等标准输出入装置。 



    3。 可以调用和GUI 无关的Win32 API 。 



    我的这个JBACKUP 程序可以有一个或两个参数,用法如下: 



      C:SomeoneDir》JBACKUP SrcDir 'DstDir' 



      例如JBACKUP g: k: 



      将磁盘目录SrcDir  中的新文件拷贝到磁盘目录DstDir , 



      并将DstDir  的赘余文件杀掉。 



                 DstDir      k:                  …MO … 

      如果没有指定          ,预设为      (那是我的可写入光驱              的代码啦) 



      并将k:  的磁盘目录设定与SrcDir 相同。 



      例如JBACKUP g: 



      而目前g: 是g:u002doc 



                 g:u002doc   k:u002doc        k:u002doc  

      那么相当于把              备份到            中,并杀掉             的赘余文件。 



    JBACK 检查SrcDir  中所有的文件和DstDir  中所有的文件,把比较新的文件从SrcDir 



    中拷贝到DstDir 去,并把DstDir  中多出来的文件删除,使ScrDir 和DstDir  的文件保 



                                                                              32 


…………………………………………………………Page 95……………………………………………………………

持完全相同。之所以不做xcopy 完全拷贝动作,为的是节省拷贝时间(做为备份装置, 



通常是软盘或磁带或可擦写光盘MO,读写速度并不快)。 



JBACKUP 没有能力处理SrcDir 底下的子目录文件。如果要处理子目录,漂亮的作法是 



使用递归(recursive ),但是有点伤脑筋,这一部份留给你了。我的打字速度还算快,多 



切换几次磁盘目录不是问题,呵呵呵。 



JBACKUP 使用以下数个Win32 APIs : 



       GetCurrentDirectory 



       FindFirstFile 



       FindNextFile 



       pareFileTime 



       CopyFile 



       DeleteFile 



在处理完毕命令列参数中的SrcDir 和DstDir 之后,JBACKUP 先把SrcDir  中的所有 



文件(不含子目录文件)搜寻一遍,储存在一个数组srcFiles' '  中,每个数组元素是一 



个我自定的SRCFILE 数据结构: 



     typedef struct _SRCFILE 



     { 



         WIN32_FIND_DATA fd; 



         BOOL bIsNew; 



     } SRCFILE; 



     SRCFILE srcFiles'FILEMAX'; 



    WIN32_FIND_DATA fd; 



         // prepare srcFiles''。。。 



         bRet = TRUE; 



         iSrcFiles = 0; 



         hFile = FindFirstFile (SrcDir; &fd); 



         while  (hFile  != INVALID_HANDLE_VALUE && bRet) 



         { 



              if  (fd。dwFileAttributes == FILE_ATTRIBUTE_ARCHIVE) { 



                  srcFiles'iSrcFiles'。fd = fd; 



                  srcFiles'iSrcFiles'。bIsNew = FALSE; 



                  iSrcFiles++; 



              } 



                                                                                    33 


…………………………………………………………Page 96……………………………………………………………

       bRet = FindNextFile (hFile; &fd); 



     } 



再把DstDir  中的所有文件(不含子目录文件)搜寻一遍,储存在一个destFiles' ' 数组 



中,每个数组元素是一个我自定的DESTFILE 数据结构: 



     typedef struct _DESTFILE 



     { 



         WIN32_FIND_DATA fd; 



         BOOL bMatch; 



     } DESTFILE; 



     DESTFILE destFiles'FILEMAX'; 



     WIN32_FIND_DATA fd; 



        bRet = TRUE; 



        iDestFiles = 0; 



        hFile = FindFirstFile (DstDir; &fd); 



        while  (hFile  != INVALID_HANDLE_VALUE && bRet) 



        { 



             if  (fd。dwFileAttributes == FILE_ATTRIBUTE_ARCHIVE) { 



                 destFiles'iDestFiles'。fd = fd; 



                 destFiles'iDestFiles'。bMatch = FALSE; 



                  iDestFiles++; 



             } 



            bRet = FindNextFile (hFile; &fd); 



     } 



然后比对srcFiles' ' 和destFiles' ' 之中的所有文件名称以及建档日期,找出scrFiles' ' 



               desFiles' '                     bIsNew          TRUE 

中的哪些文件比                 中的文件更新,然后将其                    字段设为          。同时也 



        desFiles' '            srcFiles' '            bMatch        FALSE 

对存在于              中而不存在于                中的文件,令其               字段为          。 



           srcFiles' '               bIsNew       TRUE             DstDir  

最后,检查               中的所有文件,将                字段为         者,拷贝到            去。 



      destFiles' '               bMatch        FALSE  

并检查              中的所有文件,将               字段为           者统统杀掉。 



JBACKUP  的源代码与可执行文件放在书附盘片的Jbackup。01 子目录中。 



                                                                                        34 


…………………………………………………………Page 97……………………………………………………………

MFCCON :MFC Console 程序设计 



    当你的进度还在第1章的Win32 基本程序观念,我却开始讲如何设计一个MFC console 



    程序,是否有点时地不宜? 



    是有一点!所以我挑一个最单纯而无与别人攀缠纠葛的MFC 类别,写一个40 行的小 



    程序。目标纯粹是为了做一个导入,并与Win32 console 程序做一比较。 



    我所挑选的两个单纯的MFC 类别是CStdioFile 和CString : 



                             CObject 



                      CFile                   CString 



                           CStdioFile 



                           CMemFile 



                          CSocketFile 



                         COleStreamFile 



    在MFC 之中,CFile 用来处理正常的文件I/O 动作。CStdioFile 衍生自CFile,一个 



    CStdioFile       C runtime   f open          stream     Stream  

            对象代表以            函数       所开启的一个          文件。        文件 



    有缓冲区,可以文字模式(预设情况)或二进制模式开启。 



    CString 对象代表一个字符串,是一个完全独立的类别。 



    我的例子用来计算小于100 的所有费伯纳契数列(Fabonacci sequence )。费伯纳契数列 



    的计算方式是: 



               1 

    1。 头两个数为 。 



    2。 接下来的每一个数是前两个数的和。 



                                                                                35 


…………………………………………………………Page 98……………………………………………………………

                   以下便是  MFCCON。CPP  內容: 



                   #0001  // File   : MFCCON。CPP 

                   #0002  // Author : J。J。Hou / Top Studio 

                   #0003  // Date   : 1997。04。06 

                   #0004  // Goal   : Fibonacci sequencee; less than 100 

                   #0005  // Build  : cl /MT mfccon。cpp  (/MT means Multithreading) 

                   #0006 

                   #0007  #include  

                   #0008  #include  

                   #0009 

                   #0010  int main() 

                   #0011  { 

                   #0012  int lo; hi; 

                   #0013  CString str; 

                   #0014  CStdioFile fFibo; 

                   #0015 

                   #0016      fFibo。Open (〃FIBO。DAT〃; CFile::modeWrite | 

                   #0017                  CFile::modeCreate | CFile::typeText); 

                   #0018 

                   #0019      str。Format (〃%sn〃; 〃Fibonacci sequencee; less than 100 :〃); 

                   #0020      printf(〃%s〃; (LPCTSTR) str); 

                   #0021      fFibo。WriteString (str); 

                   #0022 

                   #0023      lo = hi = 1; 

                   #0024 

                   #0025      str。Format (〃%dn〃; lo); 

                   #0026      printf(〃%s〃; (LPCTSTR) str); 

                   #0027      fFibo。WriteString (str); 

                   #0028 

                   #0029      while (hi 《 100) 

                   #0030      { 

                   #0031          str。Format (〃%dn〃; hi); 

                   #0032          printf(〃%s〃; (LPCTSTR) str); 

                   #0033          fFibo。WriteString (str); 

                   #0034          hi = lo + hi; 

                   #0035          lo = hi lo; 

                   #0036      } 

                   #0037 

                   #0038      fFibo。Close (); 

                   #0039      return 0; 

                   #0040  } 



                   以下是执行结果(在  console  窗口和  FIBO。DAT 档案中,结果都一样): 



36 


…………………………………………………………Page 99……………………………………………………………

Fibonacci sequencee; less than 100  : 



1 1 2 3 5 8 



13 



21 



34 



55 



89 



这么简单的例子中,我们看到MFC Console 程序的几个重点: 



1。 程序进入点仍为main 



2。 需包含所使用之类别的头文件(本例为AFX。H ) 



3。 可直接使用与GUI 无关的MFC 类别(本例为CStdioFile 和CString ) 



4。 编辑时需指定/MT,表示使用多执行线程版本的C runtime  函数库。 



第4点需要多做说明。在MFC console 程序中一定要指定多线程版的C runtime  函数库, 



所以必须使用/MT 选项。如果不做这项设定,会出现这样的联结错误: 



Microsoft  (R) 32…Bit Incremental Linker Version 5。00。7022 



Copyright  (C) Microsoft Corp 1992…1997。 All rights

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的