Well, I surely didn't mean to dig THAT deep! : ))
Here's the code that works for me. Please have a look and see if I missed something. I'm out of my comfort zone dealing with the aliens, always afraid of leaking memory, etc.
Also, is there an elegant way to replace the tail of multiple `] [ f ] if`?
USING:
alien alien.data alien.libraries alien.syntax
destructors formatting io.binary kernel libc locals math sequences
windows.types
;
IN: winver
<< "version" "version.dll" stdcall add-library >>
LIBRARY: version
FUNCTION: DWORD GetFileVersionInfoSizeA (
LPCSTR lptstrFilename,
LPDWORD lpdwHandle )
FUNCTION: DWORD GetFileVersionInfoSizeW (
LPCWSTR lptstrFilename,
LPDWORD lpdwHandle )
ALIAS: GetFileVersionInfoSize GetFileVersionInfoSizeW
FUNCTION: BOOL GetFileVersionInfoA (
LPCSTR lptstrFilename,
DWORD dwHandle,
DWORD dwLen,
LPVOID lpData )
FUNCTION: BOOL GetFileVersionInfoW (
LPCWSTR lptstrFilename,
DWORD dwHandle,
DWORD dwLen,
LPVOID lpData )
ALIAS: GetFileVersionInfo GetFileVersionInfoW
FUNCTION: BOOL VerQueryValueA (
LPCVOID pBlock,
LPCSTR lpSubBlock,
LPVOID *lplpBuffer,
PUINT puLen )
FUNCTION: BOOL VerQueryValueW (
LPCVOID pBlock,
LPCSTR lpSubBlock,
LPVOID *lplpBuffer,
PUINT puLen )
ALIAS: VerQueryValue VerQueryValueW
: translation-prefix ( alien -- string )
LPDWORD deref 4 memory>byte-array 2 cut [ le> ] bi@
"\\StringFileInfo\\%04x%04x\\" sprintf ;
: version-query ( alien -- string )
translation-prefix "FileVersion" append ;
:: (file-version) ( path data-size -- string/f )
[
data-size malloc &free :> data
path 0 data-size data GetFileVersionInfo [
f LPVOID <ref> :> translation
data "\\VarFileInfo\\Translation" translation f VerQueryValue [
f LPCSTR <ref> :> result
data translation version-query result f VerQueryValue
[ result LPCSTR deref ] [ f ] if
] [ f ] if
] [ f ] if
] with-destructors ;
: file-version ( path -- string/f )
dup f GetFileVersionInfoSize dup 0 > [ (file-version) ] [ 2drop f ] if ;
alien alien.data alien.libraries alien.syntax
destructors formatting io.binary kernel libc locals math sequences
windows.types
;
IN: winver
<< "version" "version.dll" stdcall add-library >>
LIBRARY: version
FUNCTION: DWORD GetFileVersionInfoSizeA (
LPCSTR lptstrFilename,
LPDWORD lpdwHandle )
FUNCTION: DWORD GetFileVersionInfoSizeW (
LPCWSTR lptstrFilename,
LPDWORD lpdwHandle )
ALIAS: GetFileVersionInfoSize GetFileVersionInfoSizeW
FUNCTION: BOOL GetFileVersionInfoA (
LPCSTR lptstrFilename,
DWORD dwHandle,
DWORD dwLen,
LPVOID lpData )
FUNCTION: BOOL GetFileVersionInfoW (
LPCWSTR lptstrFilename,
DWORD dwHandle,
DWORD dwLen,
LPVOID lpData )
ALIAS: GetFileVersionInfo GetFileVersionInfoW
FUNCTION: BOOL VerQueryValueA (
LPCVOID pBlock,
LPCSTR lpSubBlock,
LPVOID *lplpBuffer,
PUINT puLen )
FUNCTION: BOOL VerQueryValueW (
LPCVOID pBlock,
LPCSTR lpSubBlock,
LPVOID *lplpBuffer,
PUINT puLen )
ALIAS: VerQueryValue VerQueryValueW
: translation-prefix ( alien -- string )
LPDWORD deref 4 memory>byte-array 2 cut [ le> ] bi@
"\\StringFileInfo\\%04x%04x\\" sprintf ;
: version-query ( alien -- string )
translation-prefix "FileVersion" append ;
:: (file-version) ( path data-size -- string/f )
[
data-size malloc &free :> data
path 0 data-size data GetFileVersionInfo [
f LPVOID <ref> :> translation
data "\\VarFileInfo\\Translation" translation f VerQueryValue [
f LPCSTR <ref> :> result
data translation version-query result f VerQueryValue
[ result LPCSTR deref ] [ f ] if
] [ f ] if
] [ f ] if
] with-destructors ;
: file-version ( path -- string/f )
dup f GetFileVersionInfoSize dup 0 > [ (file-version) ] [ 2drop f ] if ;
18.06.2019, 21:09, "John Benediktsson" <mrj...@gmail.com>:
I don't think so, but that'd be a cool thing to add!On Tue, Jun 18, 2019 at 10:37 AM Alexander Ilin <ajs...@yandex.ru> wrote:Hello!
Is there a vocab in Factor to extract the Version Information resource from an executable file on Windows?
I'm writing an app that needs to know the "FileVersion" string from the "StringFileInfo" block.
---=====---
Александр
---=====---
Александр
_______________________________________________ Factor-talk mailing list Factor-talk@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/factor-talk