友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
依依小说 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

windows环境下32位汇编语言程序设计-第50部分

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




 

               。data

szSelect       db           '您选择的目录';0

szNoSelect     db           '您按下了取消键';0

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

; 代码段

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

               de

 

include        _BrowseFolder。asm

start:

               invoke GetCurrentDirectory;sizeof szPath;addr szPath

               invoke _BrowseFolder;NULL;addr szPath

               。if    eax

                     invoke MessageBox;NULL;offset szPath;

                     offset szSelect;MB_OK

               。else

                      invoke MessageBox;NULL;offset szNoSelect;NULL;MB_OK

               。endif

               invoke ExitProcess;NULL

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

               end    start

该文件仅包含几句调用和显示结果的代码,全部的功能集中在_BrowseFolder。asm中,用include语句包含进主文件中,这样安排代码的原因是目录浏览对话框的实现比较复杂,把功能模块写成一个单独的文件可以便于在其他文件中引用,读者也可以直接把这个源文件不加修改地用在其他地方。_BrowseFolder。asm文件的内容如下:

 

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

; IUnknown 接口定义

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

externdef                     IID_IUnknown:IID         

LPUNKNOWN                     typedef DWORD

LPPUNKNOWN                    typedef ptr LPUNKNOWN

 

IUnknown_QueryInterfaceProto  typedef proto :DWORD; :DWORD; :DWORD

IUnknown_AddRefProto          typedef proto :DWORD 

IUnknown_ReleaseProto         typedef proto :DWORD

IUnknown_QueryInterface       typedef ptr IUnknown_QueryInterfaceProto

IUnknown_AddRef               typedef ptr IUnknown_AddRefProto

IUnknown_Release              typedef ptr IUnknown_ReleaseProto

      

IUnknown struct DWORD

        QueryInterface         IUnknown_QueryInterface   ?

        AddRef                 IUnknown_AddRef       ?

        Release                IUnknown_Release      ?

IUnknown ends

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

;IMalloc 接口定义

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

externdef                     IID_IMalloc:IID          

LPMALLOC                      typedef DWORD

LPPMALLOC                     typedef ptr LPMALLOC

 

IMalloc_AllocProto            typedef proto :DWORD; :DWORD

IMalloc_ReallocProto          typedef proto :DWORD; :DWORD;:DWORD

IMalloc_FreeProto             typedef proto :DWORD; :DWORD

IMalloc_GetSizeProto          typedef proto :DWORD; :DWORD

IMalloc_DidAllocProto         typedef proto :DWORD; :DWORD

IMalloc_HeapMinimizeProto     typedef proto :DWORD

 

IMalloc_Alloc                 typedef ptr IMalloc_AllocProto

IMalloc_Realloc               typedef ptr IMalloc_ReallocProto

IMalloc_Free                  typedef ptr IMalloc_FreeProto

IMalloc_GetSize               typedef ptr IMalloc_GetSizeProto

IMalloc_DidAlloc              typedef ptr IMalloc_DidAllocProto

IMalloc_HeapMinimize          typedef ptr IMalloc_HeapMinimizeProto

 

IMalloc struct DWORD

        QueryInterface         IUnknown_QueryInterface        ?

        AddRef                 IUnknown_AddRef                ?

        Release                IUnknown_Release               ?



 
来源:电子工业出版社 作者:罗云彬 上一页         回书目         下一页          
上一页         回书目         下一页          
  


第8章 通用对话框


8。3 浏览目录对话框(2)

    
        Alloc                  IMalloc_Alloc                  ?

        Realloc                IMalloc_Realloc                ?

        Free                   IMalloc_Free                   ?

        GetSize                IMalloc_GetSize                ?

        DidAlloc               IMalloc_DidAlloc               ?

        HeapMinimize           IMalloc_HeapMinimize           ?

IMalloc ends

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

                       。data   ?

_BrowseFolderTmp         dd    ?

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

                       nst

_szDirInfo             db      '请选择目录:';0

 

                       de

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

; 弹出选择目录的对话框

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

_BrowseFolderCallBack   proc    hWnd;uMsg;lParam;lpData

                        local   @szBuffer'260':byte

 

        mov             eax;uMsg

        。if             eax   BFFM_INITIALIZED

                        invoke  SendMessage;hWnd;BFFM_SETSELECTION;

                        TRUE;_BrowseFolderTmp

        。elseif         eax   BFFM_SELCHANGED

                        invoke   SHGetPathFromIDList;lParam;addr @szBuffer

                        invoke   SendMessage;hWnd;BFFM_SETSTATUSTEXT;

                               0;addr @szBuffer

        。endif

        xor             eax;eax

        ret

 

_BrowseFolderCallBack   endp

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

_BrowseFolder       proc       _hWnd;_lpszBuffer

                    local      @stBrowseInfo:BROWSEINFO

                    local      @stMalloc

                    local      @pidlParent;@dwReturn

 

                    pushad

 

;********************************************************************

; 初始化库

;********************************************************************

                invoke   CoInitialize;NULL

                invoke   SHGetMalloc;addr @stMalloc

                。if      eax  E_FAIL

                         mov   @dwReturn;FALSE

                         jmp   @F

                。endif    

                invoke    RtlZeroMemory;addr @stBrowseInfo;sizeof @stBrowseInfo

;********************************************************************

; SHBrowseForFolder 选择一个目录,把不含路径的目录名放入

; stBrowseInfo。pszDisplayName 中,SHGetPathFromIDList 把

; stBrowseInfo。pszDisplayName 转换成含全部路径的目录名

;********************************************************************

                push     _hWnd

                pop      @stBrowseInfo。hwndOwner

                push     _lpszBuffer

                pop      _BrowseFolderTmp

                mov      @stBrowseInfo。lpfn;offset _BrowseFolderCallBack

                mov      @stBrowseInfo。lpszTitle;offset _szDirInfo

                mov      @stBrowseInfo。ulFlags;

                         BIF_RETURNONLYFSDIRS or BIF_STATUSTEXT

                invoke   SHBrowseForFolder;addr @stBrowseInfo

                mov      @pidlParent;eax

                。if      eax !=  NULL

                         invoke  SHGetPathFromIDList;eax;_lpszBuffer

                         mov   eax;TRUE

                。else

                         mov   eax;FALSE

                。endif

                mov      @dwReturn;eax

;********************************************************************

; 释放库

;********************************************************************

                mov      eax;@stMalloc

                mov      eax;'eax'

                invoke   (IMalloc PTR 'eax')。Free;@stMalloc;@pidlParent  

                mov      eax;@stMalloc

                mov      eax;'eax'

                invoke   (IMalloc PTR 'eax')。Release;@stMalloc

 

                @@:

                invoke   CoUninitialize

                popad

                mov      eax;@dwReturn

                ret

 

_BrowseFolder   endp

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

8。3。2  使用浏览目录对话框

浏览目录对话框的实现分为两个部分:初始化部分和对话框功能部分。

1。 初始化库

浏览目录对话框要用到接口,所以必须首先调用CoInitialize函数来初始化库并调用SHGetMalloc函数来获取一个IMalloc类型的接口,这个接口实际上是一个内存块,中间包含各种功能模块的入口地址。在对话框返回的时候,再调用接口中的Free模块释放接口,并调用CoUninitialize函数释放库。

编程是一个很大的课题,有关组件中的IUnknown接口和IMalloc接口等工作机理的内容本身就是一个比较深奥的问题,这不是本书所要涉及的内容,读者可以不必深入研究_BrowseFolder。asm文件中关于这两种接口的定义,只要将定义部分和代码中初始化和释放库的代码直接拿过来用就是了,这也是本书将这个模块单独放入一个文件的原因。如果读者对编程的内容感兴趣,可以访问here。is/inasm(可能需要使用代理服务器访问),这是一个讨论如何用Win32汇编编写程序的站点。

库的相关函数包含在ole32。dll中,所以源程序中必须包含下列语句:

include     ole32。inc

includelib  ole32。lib

2。 显示对话框

显示对话框的功能函数包含在Shell32。dll中,所以在源程序的头部也应该有下列包含语句:

include       shell32。inc

includelib    shell32。lib

显示对话框的功能由SHBrowseForFolder函数实现,函数的用法是:

invoke        SHBrowseForFolder,lpbi

mov           lpItemIDList;eax          ;返回一个ITEMIDLIST结构指针

参数lpbi指向一个包含对话框初始化数据的BROWSEINFO结构:

返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!