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 ;
 
 
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

Reply via email to