gpt4 book ai didi

java - 获取 .exe 的版本信息

转载 作者:太空宇宙 更新时间:2023-11-04 14:16:45 25 4
gpt4 key购买 nike

有人知道如何通过 Java 获取可执行文件/文件的版本信息吗?情况是,我的本地系统上有一个文件,如果服务器上的版本比我系统上的版本更新,我需要从服务器下载该文件。

最佳答案

花了几个小时在线编码后,我找到了一个使用 JNA 获取文件版本信息的解决方案。

import com.sun.jna.Library;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.PointerByReference;
import com.sun.jna.win32.W32APIOptions;
import java.io.IOException;


public class FileVersionInfo
{
interface Version extends Library {

Version INSTANCE = (Version) Native.loadLibrary("Version", Version.class, W32APIOptions.UNICODE_OPTIONS);

public int GetFileVersionInfoSizeW(String lptstrFilename, int dwDummy);

public boolean GetFileVersionInfoW(String lptstrFilename, int dwHandle,
int dwLen, Pointer lpData);

public int VerQueryValueW(Pointer pBlock, String lpSubBlock,
PointerByReference lplpBuffer, IntByReference puLen);

}

static class VS_FIXEDFILEINFO extends com.sun.jna.Structure {
public int dwSignature;
public int dwStrucVersion;
public int dwFileVersionMS;
public int dwFileVersionLS;
public int dwProductVersionMS;
public int dwProductVersionLS;
public int dwFileFlagsMask;
public int dwFileFlags;
public int dwFileOS;
public int dwFileType;
public int dwFileSubtype;
public int dwFileDateMS;
public int dwFileDateLS;

public VS_FIXEDFILEINFO(com.sun.jna.Pointer p){
super(p);
}
}
public static void main(String[] args) throws IOException {

int dwDummy = 0;
int versionlength = Version.INSTANCE.GetFileVersionInfoSizeW(
"C:\\Test\\chromeinstall.exe", dwDummy);

byte[] bufferarray = new byte[versionlength];
Pointer lpData = new Memory(bufferarray.length);

PointerByReference lplpBuffer = new PointerByReference();
IntByReference puLen = new IntByReference();
boolean FileInfoResult = Version.INSTANCE.GetFileVersionInfoW(
"C:\\Test\\chromeinstall.exe",
0, versionlength, lpData);
System.out.println(FileInfoResult);
int verQueryVal = Version.INSTANCE.VerQueryValueW(lpData,
"\\", lplpBuffer,
puLen);

VS_FIXEDFILEINFO lplpBufStructure = new VS_FIXEDFILEINFO(
lplpBuffer.getValue());
lplpBufStructure.read();

short[] rtnData = new short[4];
rtnData[0] = (short) (lplpBufStructure.dwFileVersionMS >> 16);
rtnData[1] = (short) (lplpBufStructure.dwFileVersionMS & 0xffff);
rtnData[2] = (short) (lplpBufStructure.dwFileVersionLS >> 16);
rtnData[3] = (short) (lplpBufStructure.dwFileVersionLS & 0xffff);

for (int i = 0; i < rtnData.length; i++) {
System.out.println(rtnData[i]);
}

}

关于java - 获取 .exe 的版本信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27638198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com