以编程方式使用C,C ++或Java获取Java和Flash的版本号

我想找到计算机上安装的当前Java版本的版本号以及任何具有闪存的给定Web浏览器上安装的Flash的当前版本。 有没有办法使用Java,C或C ++来做到这一点? 如果是这样,我应该研究哪个类/库?

如果你是Java

System.out.println(System.getProperty("java.version")); System.out.println(System.getProperty("java.vendor")); System.out.println(System.getProperty("java.vm.name")); 

产量

 1.7.0_03 Oracle Corporation Java HotSpot(TM) Client VM 

有更多关于Java的道具

  for(Map.Entry e : System.getProperties().entrySet()) { if (((String)e.getKey()).startsWith("java")) { System.out.println(e); } } 

 java.runtime.name=Java(TM) SE Runtime Environment java.vm.version=22.1-b02 java.vm.vendor=Oracle Corporation java.vendor.url=http://java.oracle.com/ java.vm.name=Java HotSpot(TM) Client VM java.vm.specification.name=Java Virtual Machine Specification java.runtime.version=1.7.0_03-b05 .... 

至于其他语言,我认为你可以通过从你的应用程序运行%JAVA_HOME%/java -version来读取输出

 java version "1.7.0_03" Java(TM) SE Runtime Environment (build 1.7.0_03-b05) Java HotSpot(TM) Client VM (build 22.1-b02, mixed mode, sharing) 

或者您可以像上面那样使用JavaProps应用程序,将其作为%JAVA_HOME%/java JavaProps并读取输出

从C / C ++中检测java版本可能很棘手,因为没有可用于获取已安装JRE属性的标准API。 一种方法是创建一个子进程来调用java -version并从此进程获取输出(也可以让子进程写入特定文件,然后从中检索数据),然后解析它并获取版本。

以下是我之前做过的Windows .exe启动程序的修改版本,它使用我刚才解释的内容(为java -version创建子java -version ,使子进程写入临时文件,打开文件并读取其内容,解析)版本):

 void printJVMVersion() { STARTUPINFO si; PROCESS_INFORMATION pi; size_t sizeOfStartupInfo = sizeof(STARTUPINFO); ZeroMemory(&si, sizeOfStartupInfo); si.cb = sizeOfStartupInfo; SECURITY_ATTRIBUTES sa = { sizeof(sa) }; // Open files in inheritable mode sa.bInheritHandle = TRUE; // Allow inheritance sa.lpSecurityDescriptor = NULL; // Handles to the child process si.dwFlags = STARTF_USESTDHANDLES; const std::string DEFAULT_TEMP_FILE_NAME = "temp_file.txt"; const size_t MAX_PATH = 256; char buffer[MAX_PATH]; char tempPathBuffer[MAX_PATH]; GetTempPath(MAX_PATH, tempPathBuffer); std::string file_name; if ( GetTempFileName(tempPathBuffer, "some_random_prefix", 0, buffer) != 0 ) { file_name = std::string(buffer); } else { file_name = DEFAULT_TEMP_FILE_NAME; } si.hStdError = CreateFileA(file_name.c_str(), GENERIC_WRITE, FILE_SHARE_READ, &sa, CREATE_ALWAYS, 0, NULL); si.hStdOutput = CreateFileA(file_name.c_str(), GENERIC_WRITE, FILE_SHARE_READ, &sa, CREATE_ALWAYS, 0, NULL); if (si.hStdOutput == NULL) { MessageBox(NULL, "Error checking for the installed Java Virtual Machine, operation aborted", "Launching", MB_ICONERROR | MB_OK); return false; } if (!CreateProcessA(NULL, "java -version", NULL, NULL, true, 0, NULL, NULL, &si, &pi)) { MessageBox(NULL, "It appears that neither you have the Java Virtual Machine installed on your system nor its properly configured", "Launching", MB_ICONERROR | MB_OK); ErrorExit("CreateProcessA"); return false; } WaitForSingleObject( pi.hProcess, INFINITE ); if( si.hStdError ) { CloseHandle( si.hStdError ); } if( si.hStdOutput ) { CloseHandle( si.hStdOutput ); } // "Parse" the txt file std::ifstream ifs(file_name.c_str()); std::string line; int versionIndex = 0; int value[2]; value[0] = value[1] = 0; while (std::getline(ifs, line)) { const std::string JAVA_VERSION_STRING = "java version "; size_t index = line.find(JAVA_VERSION_STRING.c_str()); if (index != std::string::npos) { // get either the 1.XX or 2.XX std::string version = line.substr(JAVA_VERSION_STRING.size()); std::string::iterator ite = version.begin(); std::string::iterator end = version.end(); std::string tmp = ""; for (; ite != end; ++ite) { char c = *ite; if (isdigit(c)) { tmp += c; } else if (c == '.') { value[versionIndex] = atoi(tmp.c_str()); versionIndex++; tmp = ""; // If we have, version, major and minor, then another set of digits is unnecessary if (versionIndex == 2) break; } } std::cout << "detected java version: " << (value[0]) << ", " << (value[1]) << std::endl; } } // Delete the temp file DeleteFile(file_name.c_str()); } 

希望这可以有所帮助