Java: выполненный как администратор

RAII Это - странное название простого, но потрясающего понятия. Лучше имя Объем Связанное управление ресурсами (SBRM). Идея состоит в том, что часто Вы, оказывается, выделяете ресурсы при начинании блока и должны выпустить его в выходе блока. Выход из блока может произойти нормальным управлением потоком, выпрыгнув из него, и даже исключением. Для покрытия всех этих случаев код становится более сложным и избыточным.

Просто пример, делающий его без SBRM:

void o_really() {
     resource * r = allocate_resource();
     try {
         // something, which could throw. ...
     } catch(...) {
         deallocate_resource(r);
         throw;
     }
     if(...) { return; } // oops, forgot to deallocate
     deallocate_resource(r);
}

, Как Вы видите, существует много способов, которыми мы можем получить pwned. Идея состоит в том, что мы инкапсулируем управление ресурсами в класс. Инициализация его объекта получает ресурс ("Приобретение Ресурса, Инициализация"). В то время, когда мы выходим из блока (область действия блока), ресурс освобожден снова.

struct resource_holder {
    resource_holder() {
        r = allocate_resource();
    }
    ~resource_holder() {
        deallocate_resource(r);
    }
    resource * r;
};

void o_really() {
     resource_holder r;
     // something, which could throw. ...
     if(...) { return; }
}

, Который хорош, если у Вас есть собственные классы, которые не являются только в целях выделения/освобождения ресурсов. Выделение просто было бы дополнительным беспокойством, чтобы сделать их задание. Но как только Вы просто хотите выделить/освободить ресурсы, вышеупомянутое становится неловким. Необходимо записать переносящийся класс для каждого вида ресурса, который Вы получаете. Для упрощения этого интеллектуальные указатели позволяют Вам автоматизировать тот процесс:

shared_ptr create_entry(Parameters p) {
    shared_ptr e(Entry::createEntry(p), &Entry::freeEntry);
    return e;
}

Обычно, интеллектуальные указатели являются тонкими обертками вокруг нового / удаляют, это просто, оказывается, звонит delete, когда ресурс, которым они владеют, выходит из объема. Некоторые интеллектуальные указатели, как shared_ptr позволяют Вам говорить им так называемое средство удаления, которое используется вместо delete. Это позволяет Вам, например, управлять дескрипторами окна, ресурсами регулярного выражения и другим произвольным материалом, пока Вы говорите shared_ptr о правильном средстве удаления.

существуют различные интеллектуальные указатели в различных целях:

unique_ptr

является интеллектуальным указателем, который владеет объектом исключительно. Это не находится в повышении, но это, вероятно, появится в следующем Стандарте C++. Это non-copyable, но поддерживает передача права собственности . Некоторый пример кода (следующий C++):

Код:

unique_ptr p(new plot_src); // now, p owns
unique_ptr u(move(p)); // now, u owns, p owns nothing.
unique_ptr v(u); // error, trying to copy u

vector> pv; 
pv.emplace_back(new plot_src); 
pv.emplace_back(new plot_src);

В отличие от auto_ptr, unique_ptr может быть помещен в контейнер, потому что контейнеры будут в состоянии содержать non-copyable (но подвижный) типы, как потоки и unique_ptr также.

scoped_ptr

является интеллектуальным указателем повышения, который не copyable и не подвижен. Это - идеальная вещь, которая будет использоваться, когда Вы хотите удостовериться, что указатели удалены при выходе из объема.

Код:

void do_something() {
    scoped_ptr sp(new pipe);
    // do something here...
} // when going out of scope, sp will delete the pointer automatically. 

shared_ptr

для общего владения. Для этого это и copyable и подвижно. Несколько экземпляров интеллектуального указателя могут владеть тем же ресурсом. Как только последний интеллектуальный указатель, владеющий ресурсом, выходит из объема, ресурс будет освобожден. Некоторый пример реального мира одного из моих проектов:

Код:

shared_ptr p(new plot_src(&fx));
plot1->add(p)->setColor("#00FF00");
plot2->add(p)->setColor("#FF0000");
// if p now goes out of scope, the src won't be freed, as both plot1 and 
// plot2 both still have references. 

, Как Вы видите, источник графика (функция fx) совместно используется, но у каждого есть отдельная запись, на которой мы выбираем цвет. Существует weak_ptr класс, который используется, когда код должен относиться к ресурсу, принадлежавшему интеллектуальному указателю, но не должен владеть ресурсом. Вместо того, чтобы передать необработанный указатель, необходимо тогда создать weak_ptr. Это выдаст исключение, когда это заметит, что Вы пытаетесь получить доступ к ресурсу weak_ptr путем доступа, даже при том, что нет никакого shared_ptr, больше владеющего ресурсом.

40
задан Martijn Courteaux 27 June 2011 в 17:56
поделиться

2 ответа

Вы должны создайте файл манифеста, в котором указано, что вашему приложению требуются права администратора. Вы можете включить манифест в исполняемый файл или сохранить его как отдельный файл (yourapp.exe.manifest)

http://msdn.microsoft.com/en-us/library/bb756929.aspx

20
ответ дан 27 November 2019 в 01:53
поделиться

Ответ ZippyV в порядке, если вы собираетесь запустить javaw.exe с правами системного администратора, что, если чистый код Java блокируется UAC (например, при попытке записать файл в привилегированный каталог), то это то, что вам нужно сделать.

Если, однако, вы пытаетесь запустить что-то внешнее, но только с повышением прав, вы можете связать exe, который повышает уровень команды. Вот один .

8
ответ дан 27 November 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: