Я пишу программу, которая нуждается в винной версии версии 2.6 или новее. Я хотел бы получить его как логическое, поэтому я пытался использовать следующий код:
#include <string>
#include <iostream>
#include "WineCheck.h"
#include <cstdlib>
using namespace std;
bool checkForWine()
{
// Create variables for checking wine state
bool wineIsThere = false;
bool wineIsVersion = false;
// Check dpkg if wine is there
if (string(system("dpkg -l | cut -c 4-9 | grep \\ wine\\ ")) == " wine ")
{
wineIsThere = true;
// Check version
if (double(system("wine --version | cut -c 6-8")) >= 2.6)
wineIsVersion = true;
}
// Return
if (wineIsThere && wineIsVersion)
return true;
else
return false;
}
Во-первых, это мое мнение, что вы не должны беспокоиться об этом. Wine 2.6 должен просто включаться в зависимости от вашего сценария конфигурации и/или вашего файла пакета. Ориентация на определенную систему управления пакетами в исходном коде программы не является хорошей идеей, если вы хотите поддерживать переносимость других дистрибутивов GNU/Linux, которые не используют этот пакет.
Чтобы ответить на ваш вопрос. Есть два пути, по которым я могу это сделать. Вы можете проверить /var/lib/dpkg/status
. Прочитайте файл по строкам, пока не дойдете до этого раздела. Если вы не нашли раздел или строка Status:...
не указала installed
то вино не установлено. Строка Version:...
сообщит вам, какая версия установлена. Я проверил этот метод, установив и удалив Wine на Debian Wheezy. Вы не сказали, с чем вы работаете, но очевидно, что вы используете систему упаковки Debian, поэтому это должно работать и с Ubuntu и другими дистрибутивами на базе Debian.
$cat /var/lib/dpkg/status
...
Package: wine
Status: install ok installed
Priority: optional
Section: otherosf
Installed-Size: 80
Maintainer: Debian Wine Party <[email protected]>
Architecture: amd64
Version: 1.4.1-4
...
Другой вариант - использование libdpkg
. Я нашел пример, в котором перечислены все установленные пакеты.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dpkg/dpkg.h>
#include <dpkg/dpkg-db.h>
#include <dpkg/pkg-array.h>
#include "filesdb.h"
const char thisname[] = "example1";
int
main(int argc, const char *const *argv)
{
struct pkg_array array;
struct pkginfo *pkg;
int i;
enum modstatdb_rw msdb_status;
standard_startup();
filesdbinit();
msdb_status = modstatdb_open(msdbrw_readonly);
pkg_infodb_init(msdb_status);
pkg_array_init_from_db(&array);
pkg_array_sort(&array, pkg_sorter_by_name);
for (i = 0; i < array.n_pkgs; i++) {
pkg = array.pkgs[i];
if (pkg->status == stat_notinstalled)
continue;
printf("Package --> %s\n", pkg->set->name);
}
pkg_array_destroy(&array);
modstatdb_shutdown();
standard_shutdown();
}