[11-22]MASM32编程获取文件语言、版本信息v3

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;FileName:VerInfo3.asm
;Function:Demothewaytogetfile'sversioninformationandlanguage
;Author:PurpleEndurer
;
;LOG
;----------------------------------------------------------------------------------------
;2006-11-22CandisplayinCN
;2006-11-20Addedcomments!
;2006-09-14Created!
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.386
.model flat, stdcall
option casemap: none
include/masm32/ include/windows.inc

include/masm32/ include/kernel32.inc
includelib/masm32/ lib/kernel32.lib
include/masm32/ include/user32.inc
includelib/masm32/ lib/user32.lib
include/masm32/ include/shell32.inc
includelib/masm32/ lib/shell32.lib
include/masm32/ include/comdlg32.inc
includelib/masm32/ lib/comdlg32.lib
include/masm32/ include/version.inc
includelib/masm32/ lib/version.lib


WinMain PROTO: DWORD,: DWORD,: DWORD,: DWORD
ResizeConctrol PROTO
ShowVerInfo PROTO:LPSTR
btnShow_Click PROTO
btnBrowse_Click PROTO


;.const
IDC_BtnBrowse equ101
IDC_BtnShow equ103
IDC_EdtFileSpec equ105
IDC_EdtVerInfo equ107
c_BufLen EQUMAX_PATH


c_EditFileSpecLeft equ2
c_EditFileSpecTop equ5
c_EditFileSpecWidth equ300
c_EditFileSpecHeight equ20

c_BtnBrowseTop equc_EditFileSpecTop
c_BtnBrowseLeft equ(c_EditFileSpecLeft+c_EditFileSpecWidth+10)
c_BtnBrowseWidth equ70
c_BtnBrowseHeight equc_EditFileSpecHeight

c_BtnShowTop equc_EditFileSpecTop
c_BtnShowLeft equ(c_BtnBrowseLeft+c_BtnBrowseWidth+10)
c_BtnShowWidth equ70
c_BtnShowHeight equc_BtnBrowseHeight

c_EdtVerInfoLeft equ2
c_EdtVerInfoTop equ30
c_EdtVerInfoWidth equc_BtnShowLeft+c_BtnShowWidth+2
c_EdtVerInfoHeight equ165

c_WinWidth equc_EdtVerInfoLeft+c_EdtVerInfoWidth+10
c_WinHeight equc_EdtVerInfoTop+c_EdtVerInfoHeight+30

m_CatStr MACROszStr:REQ
invokeSendMessage,g_hEditVerInfo,EM_REPLACESEL, FALSE, ADDRszStr
ENDM

m_GoNextLine MACRO
invokeSendMessage,g_hEditVerInfo,EM_REPLACESEL, FALSE, ADDRg_szCR
ENDM


.data
g_szClsName db "FileVerInfoCls",0
g_szAppName db "文件版本信息",0
g_szEditCls db "EDIT",0
g_szBtnCls db "button",0
g_szBtnBrowseText db "&B浏览",0
g_szBtnShowText db "&S显示",0
g_szEnterFileErr db "请先输入文件说明符",0
g_szFailGetVerSize db "获取文件版本信息大小失败!",0
g_szFailAllocMem db "申请内存失败!",0
g_szFailGetVerInfo db "获取文件版本信息失败!",0
g_szFailFailGetLangPage db "获取语言和代码页失败!",0
g_szCR db0dh,0ah,0
g_szOp db "properties",0
g_szPeFileFilter db "*.EXE;*.DLL",0, "*.EXE;*.DLL",0,0


.data?
g_hInstanceHINSTANCE?
g_hWndMainHANDLE?
g_hEditFileSpecHANDLE?
g_hBtnShowHANDLE?
g_hBtnBrowseHANDLE?
g_hEditVerInfoHANDLE?
g_szFileSpec dbc_BufLendup(?)
g_ofnOPENFILENAME<?>
g_ShlExecInfoSHELLEXECUTEINFO<?>

.code
start:
invokeGetModuleHandle,NULL
movg_hInstance, eax
invokeWinMain,g_hInstance,NULL,NULL,SW_SHOWDEFAULT
invokeExitProcess, eax


WinMain prochInst: DWORD,hPrevInst: DWORD,CmdLine: DWORD,CmdShow: DWORD
LOCALwc:WNDCLASSEX
LOCALmsg:MSG
LOCALhwnd:HWND

movwc.cbSize,SIZEOFWNDCLASSEX
movwc.style,CS_HREDRAW orCS_VREDRAW
movwc.lpfnWndProc, OFFSETWndProc
movwc.cbClsExtra,NULL
movwc.cbWndExtra,NULL
mov eax,g_hInstance
movwc.hInstance, eax
movwc.hbrBackground,COLOR_APPWORKSPACE
movwc.lpszMenuName,NULL
movwc.lpszClassName, OFFSETg_szClsName
invokeLoadIcon,NULL,IDI_APPLICATION
movwc.hIcon, eax
movwc.hIconSm, eax
invokeLoadCursor,NULL,IDC_ARROW
movwc.hCursor, eax
invokeRegisterClassEx, addrwc
invokeCreateWindowEx,WS_EX_TOPMOST, ADDRg_szClsName,/
ADDRg_szAppName,WS_OVERLAPPEDWINDOW+WS_VISIBLE,/
CW_USEDEFAULT,CW_USEDEFAULT,c_WinWidth,c_WinHeight,/
NULL,NULL,hInst,NULL
movhwnd, eax
.while TRUE
invokeGetMessage, ADDRmsg,NULL,0,0
.BREAK .IF(! eax)

;---processkeystrokesdirectlyinthemessageloop
.ifmsg.message==WM_SYSKEYUP
.ifmsg.wParam==VK_B ;Alt+B
invokePostMessage,hwnd,WM_COMMAND,IDC_BtnBrowse,BM_CLICK
.elseifmsg.wParam==VK_S ;Alt+S
invokePostMessage,hwnd,WM_COMMAND,IDC_BtnShow,BM_CLICK
.endif
.endif
;------------------------------------------------
invokeTranslateMessage, ADDRmsg
invokeDispatchMessage, ADDRmsg
.endw
mov eax,msg.wParam
ret
WinMain endp


WndProc prochWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
LOCALrect:RECT
LOCALhdc: DWORD

.ifuMsg==WM_CREATE
mov eax,hWnd
movg_hWndMain, eax

;---Createfilespeceditbox
invokeCreateWindowEx,NULL, offsetg_szEditCls,NULL,
WS_CHILD+WS_VISIBLE+ES_AUTOHSCROLL+WS_BORDER,/
c_EditFileSpecLeft,c_EditFileSpecTop,c_EditFileSpecWidth,c_EditFileSpecHeight,/
hWnd,IDC_EdtFileSpec,g_hInstance,NULL
movg_hEditFileSpec, eax

;---Createbrowsebutton
invokeCreateWindowEx,NULL, offsetg_szBtnCls, offsetg_szBtnBrowseText,/
WS_CHILD+WS_VISIBLE,c_BtnBrowseLeft,c_BtnBrowseTop,c_BtnBrowseWidth,c_BtnBrowseHeight,/
hWnd,IDC_BtnBrowse,g_hInstance,NULL
movg_hBtnBrowse, eax

;---Createshowbutton
invokeCreateWindowEx,NULL, offsetg_szBtnCls, offsetg_szBtnShowText,/
WS_CHILD+WS_VISIBLE,c_BtnShowLeft,c_BtnShowTop,c_BtnShowWidth,c_BtnShowHeight,/
g_hWndMain,IDC_BtnShow,g_hInstance,NULL
movg_hBtnShow, eax

;---Createfileverinfoeditbox
invokeCreateWindowEx,NULL, addrg_szEditCls,NULL,/
WS_CHILD+WS_VISIBLE+ES_MULTILINE+WS_HSCROLL+WS_VSCROLL+WS_BORDER,/
c_EdtVerInfoLeft,c_EdtVerInfoTop,c_EdtVerInfoWidth,c_EdtVerInfoHeight,/
g_hWndMain,IDC_EdtVerInfo,g_hInstance,NULL
movg_hEditVerInfo, eax

;---InitializeOPENFILENAMEstructure
invokeRtlZeroMemory, offsetg_ofn,sizeofg_ofn
movg_ofn.lStructSize,sizeofOPENFILENAME
mov eax,g_hInstance
movg_ofn.hInstance, eax
movg_ofn.nMaxFile,c_BufLen
movg_ofn.Flags,OFN_HIDEREADONLY+OFN_FILEMUSTEXIST+OFN_PATHMUSTEXIST+OFN_EXPLORER
movg_ofn.lpstrFilter, OFFSETg_szPeFileFilter
movg_ofn.lpstrFile, OFFSETg_szFileSpec
mov eax,g_hWndMain
movg_ofn.hWndOwner, eax

;---InitializeSHELLEXECUTEINFOstructure
invokeRtlZeroMemory, offsetg_ShlExecInfo,sizeofSHELLEXECUTEINFO
movg_ShlExecInfo.cbSize,sizeofg_ShlExecInfo
movg_ShlExecInfo.fMask,SEE_MASK_INVOKEIDLIST
movg_ShlExecInfo.lpVerb, offsetg_szOp
movg_ShlExecInfo.lpFile, offsetg_szFileSpec

.elseifuMsg==WM_COMMAND
.IFlParam
mov edx,wParam
mov eax, edx
shr edx,16
.if dx==BN_CLICKED
.IF ax==IDC_BtnShow
invokebtnShow_Click
.else
invokebtnBrowse_Click
.endif
.ENDIF
.endif
.elseifuMsg==WM_DESTROY
invokePostQuitMessage,NULL
.elseifuMsg==WM_SIZE
invokeResizeConctrol
xor eax, eax
jz@F
.else
@@:
invokeDefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax, eax
ret
WndProc endp


btnShow_Click proc
invokeGetWindowText,g_hEditFileSpec, ADDRg_szFileSpec,SIZEOFg_szFileSpec
.IF eax==0
invokeMessageBox,g_hWndMain, OFFSETg_szEnterFileErr, OFFSETg_szAppName,MB_ICONERROR+MB_OK
.ELSE
;---clearthefileverinfobox
invokeSendMessage,g_hEditVerInfo,WM_SETTEXT,0,NULL
invokeShowVerInfo, OFFSETg_szFileSpec
.if eax>0
.IF eax==1
mov eax, OFFSETg_szFailGetVerSize
.ELSEIF eax==2
mov eax, OFFSETg_szFailAllocMem
.ELSEIF eax==3
mov eax, OFFSETg_szFailGetVerInfo
.ELSEIF eax==4
mov eax, OFFSETg_szFailFailGetLangPage
.ENDIF
invokeMessageBox,g_hWndMain, eax, OFFSETg_szAppName,MB_ICONERROR+MB_OK
.else
invokeShellExecuteEx, offsetg_ShlExecInfo
.endif
.ENDIF
ret
btnShow_Click endp


btnBrowse_Click proc
invokeGetOpenFileName, ADDRg_ofn
.if eax!=0
invokeSendMessage,g_hEditFileSpec,WM_SETTEXT,0, OFFSETg_szFileSpec
.endif
ret
btnBrowse_Click endp


ResizeConctrol PROC
LOCALst_Rect:RECT

invokeGetClientRect,g_hWndMain, ADDRst_Rect

;---ResizetheShowbutton
mov eax,st_Rect.right
sub eax,5+c_BtnShowWidth
push eax
invokeMoveWindow,g_hBtnShow, eax,c_BtnShowTop,c_BtnShowWidth,c_BtnShowHeight, TRUE

;---ResizetheShowbutton
pop eax
sub eax,5+c_BtnShowWidth
push eax
invokeMoveWindow,g_hBtnBrowse, eax,c_BtnBrowseTop,c_BtnBrowseWidth,c_BtnBrowseHeight, TRUE

;---Resizethefilespeceditbox
pop eax
sub eax,10
invokeMoveWindow,g_hEditFileSpec,c_EditFileSpecLeft,c_EditFileSpecTop, eax,c_EditFileSpecHeight, TRUE

;---ResizetheVerinfoeditbox
mov eax,st_Rect.right
sub eax,5

mov edi,st_Rect.bottom
sub edi,30

invokeMoveWindow,g_hEditVerInfo,c_EdtVerInfoLeft,c_EdtVerInfoTop, eax, edi, TRUE

ret
ResizeConctrol ENDP


;/
;Result:
;eax==0sucess
;eax==1Failtogetfileverinfosize
;eax==2Failtoallocglobalmemory
;eax==3Failtogetfileverinfo
;eax==4Failtogetthelanguageidandcodepage
;/
ShowVerInfo PROClpszFileSpec:LPSTR
LOCALdwBufSize: DWORD
LOCALhMem:HANDLE
LOCALbInfoStr[MAX_PATH]: byte
LOCALlpszValue:LPSTR
LOCALbLangCharset[9]: byte

invokeGetFileVersionInfoSize,lpszFileSpec, ADDRdwBufSize
or eax, eax
jnz@F
mov eax,1
ret
@@:
movdwBufSize, eax
invokeGlobalAlloc,GMEM_ZEROINIT, eax
cmp eax,NULL
jnz@F
mov eax,2
ret
@@:
movhMem, eax
;BOOLGetFileVersionInfo(
;LPTSTRlptstrFilename,//pointertofilenamestring
;DWORDdwHandle,//ignored
;DWORDdwLen,//sizeofbuffer
;LPVOIDlpData//pointertobuffertoreceivefile-versioninfo.
;);

invokeGetFileVersionInfo,lpszFileSpec,0,dwBufSize,hMem
or eax, eax
jnz@F
invokeGlobalFree,hMem
mov eax,3
ret
g_szTranslation db "/VarFileInfo/Translation",0
@@:
;BOOLVerQueryValue(
;constLPVOIDpBlock,//addressofbufferforversionresource
;LPTSTRlpSubBlock,//addressofvaluetoretrieve
;LPVOID*lplpBuffer,//addressofbufferforversionpointer
;PUINTpuLen//addressofversion-valuelengthbuffer
;);


invokeVerQueryValue,hMem, OFFSETg_szTranslation, ADDRlpszValue, ADDRdwBufSize
or eax, eax
jnz@F
invokeGlobalFree,hMem
mov eax,4
ret
g_szProductName db'ProductName',0
g_szProductVersion db'ProductVersion',0
g_szFileDescription db'FileDescription',0
g_szLegalCopyright db'LegalCopyright',0
g_szFileVersion db'FileVersion',0
g_szCompanyName db'CompanyName',0
g_szLegalTradeMarks db'LegalTradeMarks',0
g_szInternalName db'InternalName',0
g_szOriginalFileName db'OriginalFileName',0
g_szComments db "Comments",0

g_lpszInfolabel dword
dword OFFSETg_szFileVersion
dword OFFSETg_szFileDescription
dword OFFSETg_szLegalCopyright
dword OFFSETg_szComments
dword OFFSETg_szProductVersion
dword OFFSETg_szProductName
dword OFFSETg_szCompanyName
dword OFFSETg_szLegalTradeMarks
dword OFFSETg_szInternalName
dword OFFSETg_szOriginalFileName
c_lpszInfoLen equ($-g_lpszInfo)/4

c_language_cn equ1
ifc_language_cneq1
g_szProductName_cn db'产品名称',0
g_szProductVersion_cn db'产品版本',0
g_szFileDescription_cn db'说明',0
g_szLegalCopyright_cn db'版权',0
g_szFileVersion_cn db'文件版本',0
g_szCompanyName_cn db'公司名称',0
g_szLegalTradeMarks_cn db'合法商标',0
g_szInternalName_cn db'内部名称',0
g_szOriginalFileName_cn db'源文件名',0
g_szComments_cn db "备注",0

g_lpszInfo_cnlabel dword
dword OFFSETg_szFileVersion_cn
dword OFFSETg_szFileDescription_cn
dword OFFSETg_szLegalCopyright_cn
dword OFFSETg_szComments_cn
dword OFFSETg_szProductVersion_cn
dword OFFSETg_szProductName_cn
dword OFFSETg_szCompanyName_cn
dword OFFSETg_szLegalTradeMarks_cn
dword OFFSETg_szInternalName_cn
dword OFFSETg_szOriginalFileName_cn
c_lpszInfo_cn_Len equ($-g_lpszInfo_cn)/4
g_szLang_cn db "语言"
g_szBlkColonBlk db ":",0
else
g_szLang db "Langeage"
g_szBlkColonBlk db ":",0
endif
g_szPre db'StringFileInfo/',0 ;080404B0
g_szInfoFmt db "%s%s/%s",0
g_szHexFmt db "%08X",0

@@:
;---Now,lpszValueisapointertofour4bytesofHexnumber,
;firsttwobytesarelanguageid,andlasttwobytesarecodepage.
;However,Lang_Charset_Stringneedsastringof4hexdigits,
;thefirsttwocharacterscorrespondtothelanguageid
;andlasttwothelasttwocharactercorrespondtothecodepageid.

ifc_language_cneq1
m_CatStrg_szLang_cn
else
m_CatStrg_szLang
endif
mov eax,lpszValue
mov eax,[ eax]
push eax

;---Getthedescriptionstring
;DWORDVerLanguageName(
;DWORDwLang,//Microsoftlanguageidentifier
;LPTSTRszLang,//pointertobufferforlanguagedescriptionstring
;DWORDnSize//sizeofbuffer
;);
movzx eax, ax
movdwBufSize, eax
invokeVerLanguageName,dwBufSize, ADDRbInfoStr,MAX_PATH
or eax, eax
jz@F
m_CatStrbInfoStr
@@:
m_GoNextLine
pop eax

;---Changetheorderofthelanguageidandcodepage
rol eax,16

;---Convertthelanguageidandcodepageintoa8bytesHexstringrepresentation
invokewsprintf, ADDRbLangCharset, ADDRg_szHexFmt, eax

;---Forexample,thelanguageidandcodepagemaylooklike040904E4
;Ortopullitallapart:
;04------=SUBLANG_ENGLISH_USA
;--09----=LANG_ENGLISH
;----04E4=1252=CodepageforWindows:Multilingual

c_showTranslation equ0
ifc_showTranslationeq1
;---Showthelanguageidandcodepageineditbox
m_CatStrg_szTranslation

m_CatStrg_szBlkColonBlk
m_CatStrbLangCharset
m_GoNextLine
endif

xor eax, eax
.while eax<c_lpszInfoLen
push eax
or eax, eax
jz@F
shl eax,2 ;eax<--eax*4
@@:
push eax

ifc_language_cneq1
invokeSendMessage,g_hEditVerInfo,EM_REPLACESEL, FALSE,[ eax+g_lpszInfo_cn]
else
invokeSendMessage,g_hEditVerInfo,EM_REPLACESEL, FALSE,[ eax+g_lpszInfo]
endif

m_CatStrg_szBlkColonBlk
pop eax
invokewsprintf, ADDRbInfoStr, ADDRg_szInfoFmt, OFFSETg_szPre, ADDRbLangCharset,[ eax+g_lpszInfo]
invokeVerQueryValue,hMem, ADDRbInfoStr, ADDRlpszValue, ADDRdwBufSize
or eax, eax
jz@F
invokeSendMessage,g_hEditVerInfo,EM_REPLACESEL, FALSE,lpszValue
@@:
m_GoNextLine
pop eax
inc eax
.endw
invokeGlobalFree,hMem
xor eax, eax
ret
ShowVerInfo ENDP


endstart
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值