⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opensave.asm

📁 一个十六进制编辑器源代码,cool!
💻 ASM
字号:
	_InitOpenSaveDlg proto
	_GetOpenFileName proto:DWORD ,:DWORD 
	_GetSaveFileName proto:DWORD  ,:DWORD 
	_GetOpenFile	PROTO:DWORD 
	_GetSaveFile	PROTO:DWORD 
	_OpenFile	proto:DWORD
	_SaveFile	proto:DWORD 
	_GetModify	proto
.data?
	ofn_open	OPENFILENAME <?>
	ofn_save	OPENFILENAME <?>
	szFileter db 255 dup(?)
	;DEBUG=0
.code
;----------------打开文件------------
_InitOpenSaveDlg proc
	m2m ofn_open.hwndOwner,hWnd
	m2m ofn_open.hInstance,hInstance
	mov ofn_open.lStructSize,sizeof ofn_open
	mov ofn_open.lpstrFile,offset szFileName
	mov ofn_open.nMaxFile,MAX_PATH
	invoke _IniGetStr,0,ctext('fileter')
	mov eax,lpIniBuf
	invoke lstrcpy,addr szFileter,eax
	push eax
	.while BYTE ptr [eax]
		.if BYTE ptr [eax]=='|'
			mov BYTE ptr [eax],0
		.endif
		inc eax
	.endw
	pop ofn_open.lpstrFilter
	invoke RtlMoveMemory,addr ofn_save,addr ofn_open,sizeof OPENFILENAME
	mov ofn_open.Flags,OFN_HIDEREADONLY or OFN_FILEMUSTEXIST  or OFN_EXPLORER
	mov ofn_save.Flags,OFN_HIDEREADONLY or OFN_OVERWRITEPROMPT
	ret
_InitOpenSaveDlg endp
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
_GetOpenFileName proc,lpBuf,@hwnd
	mov eax,lpBuf
	mov BYTE ptr [eax],0
	mov ofn_open.lpstrFile,eax
	m2m ofn_open.hwndOwner,@hwnd
	invoke GetOpenFileName,addr ofn_open
	.if eax	
		mov eax,ofn_open.lpstrFile
	.endif
	ret
_GetOpenFileName endp
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
_GetSaveFileName proc lpBuf,@hwnd
	mov eax,lpBuf
	mov BYTE ptr [eax],0
	mov ofn_save.lpstrFile,eax
	m2m ofn_open.hwndOwner,@hwnd
	invoke GetSaveFileName,addr ofn_save
	.if eax	
		mov eax,ofn_save.lpstrFile
	.endif
	ret
_GetSaveFileName endp
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
_OpenFile proc uses ecx esi edi lpFile
local @szBuf[MAX_PATH ]:BYTE ,nSize
local @hFile,@FileLen,byteReaded,wParam
	invoke CreateFile,lpFile,GENERIC_READ or GENERIC_WRITE ,0,0,OPEN_EXISTING,0,0
	cmp eax,INVALID_HANDLE_VALUE
	jz _err_
	mov @hFile,eax
	invoke GetFileSize,eax,NULL
	mov nSize,eax
	.if eax>HUGE_FILE
		;内存映射的方法打开
		invoke MessageBox,hWnd,addr szHugeFile,addr szAppName,20h+MB_OKCANCEL 
		.if eax==IDCANCEL
			invoke CloseHandle,@hFile
			xor eax,eax
			ret
		.else
			invoke lstrcmpi,lpFile,addr szFileName
			.if eax==0
				ret
			.endif
			invoke CreateFileMapping,@hFile,0,PAGE_READWRITE ,0,0,0
			test  eax,eax
			jz _err_
			mov wParam, eax
			invoke MapViewOfFile,eax, FILE_MAP_WRITE,0,0,0
			test  eax,eax
			jz _err_
			push eax
			call _Release
			pop lpMemFile
			invoke EnableMenuItem,hMenu,1003,MF_GRAYED ;保存,另存为不可用
			invoke EnableMenuItem,hMenu,1004,MF_GRAYED 
			invoke CloseHandle,wParam
			mov dwFileType,FILE_MAP
		.endif
	.else
		;一般的方法打开文件
		add eax,EXTRASIZE
		__alloc eax
		test eax,eax
		jz _err_
		push eax
		lea ecx,wParam
		invoke ReadFile,@hFile,eax,nSize,ecx,0
		invoke EnableMenuItem,hMenu,1003,MF_ENABLED ;保存,另存为可用
		invoke EnableMenuItem,hMenu,1004,MF_ENABLED 
		call _Release
		pop lpMemFile
		mov dwFileType,FILE_NORMAL
	.endif
	invoke _HisMenuAdd,lpFile;添加到历史文件
	invoke CloseHandle,@hFile
	m2m dwFileSize,nSize
	invoke _InitData ,0
	invoke _SetWindowTitle,hWnd,lpFile
	invoke lstrcpy,addr szFileName,lpFile
	call _ReDraw
	and FLAG_ALL,NOT FLAG_FILECHANGE
	mov eax,TRUE 
	jmp _ret_
_err_:
	call _ShowError
_ret_:
	ret
_OpenFile endp
;-------------------保存文件-------------
_SaveFile proc uses edi esi ecx lpFile
local @hFile,wParam
local @szBuf[255]:BYTE
	invoke CreateFile,lpFile,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0
	cmp eax,INVALID_HANDLE_VALUE
	je _err_
	mov @hFile,eax
	invoke WriteFile,@hFile,lpMemFile,dwFileSize,addr wParam,NULL
	test eax,eax
	jz _err_
	invoke CloseHandle,@hFile
	.if dwFileType==FILE_NORMAL
		invoke _SetWindowTitle,hWnd,lpFile
		invoke lstrcpy,addr szFileName,lpFile
		invoke _HisMenuAdd,lpFile
	.endif
	and FLAG_ALL,not FLAG_FILECHANGE
	mov eax,TRUE 
	jmp _ret_
_err_:
	call _ShowError
_ret_:
	ret
_SaveFile endp


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -