www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - get executable version

reply Machine Code <jckj33 gmail.com> writes:
is there something on std library or package on dub to get a 
executable version on windows? just in case I don't need to dig 
into winapi.



FileVersionInfo.GetVersionInfo(path).FileVersion

https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.fileversioninfo.fileversion?view=netframework-4.8
May 31 2019
parent reply rikki cattermole <rikki cattermole.co.nz> writes:
On 01/06/2019 7:07 AM, Machine Code wrote:
 is there something on std library or package on dub to get a executable 
 version on windows? just in case I don't need to dig into winapi.
 

 
 FileVersionInfo.GetVersionInfo(path).FileVersion
 
 https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.fileversioninfo.fileversion?v
ew=netframework-4.8 
 
You'll need to go to WinAPI. Here is a jumping off point[0] and yes we have bindings for it[1] (although missing the Ex versions). [0] https://docs.microsoft.com/en-us/windows/desktop/api/winver/nf-winver-getfileversioninfow [1] https://github.com/dlang/druntime/blob/8fd52019826259dc92ab712f4b37a3f0ea4d8265/src/core/sys/windows/winver.d
May 31 2019
parent Machine Code <jckj33 gmail.com> writes:
On Friday, 31 May 2019 at 19:22:03 UTC, rikki cattermole wrote:
 On 01/06/2019 7:07 AM, Machine Code wrote:
 is there something on std library or package on dub to get a 
 executable version on windows? just in case I don't need to 
 dig into winapi.
 

 
 FileVersionInfo.GetVersionInfo(path).FileVersion
 
 https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.fileversioninfo.fileversion?view=netframework-4.8
 
You'll need to go to WinAPI. Here is a jumping off point[0] and yes we have bindings for it[1] (although missing the Ex versions). [0] https://docs.microsoft.com/en-us/windows/desktop/api/winver/nf-winver-getfileversioninfow [1] https://github.com/dlang/druntime/blob/8fd52019826259dc92ab712f4b37a3f0ea4d8265/src/core/sys/windows/winver.d
Thanks I wrote this D version, if anyone is interested or would like to point out any mistake/improvement: string getFileVersionString(string filename) { import core.sys.windows.windows : MAX_PATH; import core.sys.windows.winbase : GetModuleFileName; import core.sys.windows.windef : DWORD, UINT, LPBYTE, NULL, LPSTR, TCHAR; import core.sys.windows.winver : GetFileVersionInfoSize, GetFileVersionInfo, VerQueryValue, VS_FIXEDFILEINFO; import std.windows.syserror : wenforce; import std.string : format; import std.conv : wtext; import std.traits : fullyQualifiedName; wchar* szVersionFile = cast(wchar*)filename.wtext.ptr; DWORD verHandle = 0; UINT size = 0; LPBYTE lpBuffer = NULL; DWORD verSize = wenforce(GetFileVersionInfoSize(szVersionFile, &verHandle), fullyQualifiedName!GetFileVersionInfoSize ~ " failed"); wchar[] verData = new wchar[verSize]; wenforce(GetFileVersionInfo(szVersionFile, verHandle, verSize, verData.ptr), fullyQualifiedName!GetFileVersionInfo ~ " faield"); if(!VerQueryValue(cast(const(void)*)verData.ptr, cast(const(wchar)*)"\\".ptr, cast(void**)&lpBuffer, &size)) { assert(0, fullyQualifiedName!VerQueryValue ~ " failed"); } if(!size) { assert(0, "no size"); } auto verInfo = cast(VS_FIXEDFILEINFO*)lpBuffer; if (verInfo.dwSignature == 0xfeef04bd) { return format!"%d.%d.%d.%d"( (verInfo.dwFileVersionMS >> 16 ) & 0xffff, (verInfo.dwFileVersionMS >> 0 ) & 0xffff, (verInfo.dwFileVersionLS >> 16 ) & 0xffff, (verInfo.dwFileVersionLS >> 0 ) & 0xffff ); } return ""; }
May 31 2019