| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 823 人关注过本帖
标题:关于文件另存为 程序的 奇怪状况
只看楼主 加入收藏
wsz9903011
Rank: 1
等 级:新手上路
帖 子:35
专家分:7
注 册:2009-4-24
结帖率:90.91%
收藏
已结贴  问题点数:20 回复次数:7 
关于文件另存为 程序的 奇怪状况
_GetSaveFile    proc    lpBuffer,dwBufferSize
        local    @stOpenFileName:OPENFILENAME
        invoke    RtlZeroMemory,addr @stOpenFileName,sizeof OPENFILENAME
        invoke    RtlZeroMemory,lpBuffer,dwBufferSize
        mov    @stOpenFileName.lStructSize,SIZEOF @stOpenFileName
        mov    @stOpenFileName.Flags,OFN_OVERWRITEPROMPT or OFN_CREATEPROMPT
        push    hWinMain
        pop    @stOpenFileName.hwndOwner
        mov    @stOpenFileName.lpstrFilter,offset szAllFile
        push    lpBuffer
        pop    @stOpenFileName.lpstrFile
       ;mov     @stOpenFileName.lpstrFile,offset lpBuffer
        mov    @stOpenFileName.nMaxFile,MAX_PATH
        invoke    GetSaveFileName,addr @stOpenFileName;创建一个Save公共对话框,以便用户指定驱动器、目录和文件名
        ret
_GetSaveFile    endp
参数lpBuffer代表文件缓冲 dwBufferSize 为文件缓冲名长度  问题是这里用
push    lpBuffer
pop    @stOpenFileName.lpstrFile
(顺便问下 这2句是怎么实现的 为什么用PUSH 与POP???)

但我换成mov     @stOpenFileName.lpstrFile,offset lpBuffer 就无法编译通过
理应是正确的嘛
假设 “另存为”的框框 的那个默认文件名 是123  怎么搞呢?? 直接
@stOpenFileName.lpstrFile,“123”  不行哦


[ 本帖最后由 wsz9903011 于 2009-8-31 22:53 编辑 ]
搜索更多相关主题的帖子: 文件 状况 
2009-08-31 22:30
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:20 
(顺便问下 这2句是怎么实现的 为什么用PUSH 与POP???)
因为mov 不能在两个内存地址之间传递数据 只能借助寄存器或push pop
貌似应表述为 在两个内存变量之间传递数据

[ 本帖最后由 zklhp 于 2009-9-1 17:46 编辑 ]
2009-09-01 17:34
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
_GetSaveFile    proc    lpBuffer,dwBufferSize
这个 lpBuffer 是参数的?
2009-09-01 17:38
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
首先 这里 lpBuffer 已经指向了一个字符串 就是指针了 再offset 没意义~~
再有 这里 lpBuffer 本来是宏汇编器自动替换 生成的 最终是转换成[ebp+……] 一类东西 当然不能offset 了
必须用push 的原因 刚才说了~~~
2009-09-01 17:41
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
@stOpenFileName.lpstrFile,“123”
@stOpenFileName.lpstrFile,CTXT(“123”) 这样貌似就对了
2009-09-01 17:43
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
最后一句  汇编不同与高级语言 有时是受cpu影响的 比如mov 不能在两内存中交换数据一类 没办法 只能遵守~
而且 我们的masm 是宏汇编 很多高级语言的特性最终也要转换成汇编代码 所以 要从指令本身理解~~~
2009-09-01 17:45
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用zklhp在2009-9-1 17:41的发言:
首先 这里 lpBuffer 已经指向了一个字符串 就是指针了 再offset 没意义~~
再有 这里 lpBuffer 本来是宏汇编器自动替换 生成的 最终是转换成[ebp+……] 一类东西 当然不能offset 了
必须用push 的原因 刚才说了~~~

取lpBuffer地址可以用lea~~~
2009-09-01 17:47
wsz9903011
Rank: 1
等 级:新手上路
帖 子:35
专家分:7
注 册:2009-4-24
收藏
得分:0 
谢谢老大详细讲解 小生茅塞顿开
2009-09-02 00:56
快速回复:关于文件另存为 程序的 奇怪状况
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025800 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved