按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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结构: