Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
public class Student {
private int id;
public int getId() {
return this.id;
}
public setId(int newId) {
this.id = newId;
}
}
Приведенный ниже код дает вам исключение с нулевым указателем.
public class School {
Student obj_Student;
public School() {
try {
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Поскольку вы используете Obj_Student
, но вы забыли инициализировать его, как в правильном коде, показанном ниже:
public class School {
Student obj_Student;
public School() {
try {
obj_Student = new Student();
obj_Student.setId(12);
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
То, что действительно необходимо сделать, сохранить настройки папка Application Data.
Невозможно поднять всего одну функцию или любую другую часть единственного процесса, потому что уровень повышения является атрибутом для каждого процесса. Точно так же, как с беременностью, Ваш процесс может или быть поднят или нет. При необходимости в некоторой части кода для выполнения поднятый, необходимо запустить отдельный процесс.
Однако, если можно реализовать функцию как COM-объект, можно выполнить поднятый косвенно, путем создания поднятого COM-объекта, как это:
HRESULT
CreateElevatedComObject (HWND hwnd, REFGUID guid, REFIID iid, void **ppv)
{
WCHAR monikerName[1024];
WCHAR clsid[1024];
BIND_OPTS3 bo;
StringFromGUID2 (guid, clsid, sizeof (clsid) / 2);
swprintf_s (monikerName, sizeof (monikerName) / 2, L"Elevation:Administrator!new:%s", clsid);
memset (&bo, 0, sizeof (bo));
bo.cbStruct = sizeof (bo);
bo.hwnd = hwnd;
bo.dwClassContext = CLSCTX_LOCAL_SERVER;
// Prevent the GUI from being half-rendered when the UAC prompt "freezes" it
MSG paintMsg;
int MsgCounter = 5000; // Avoid endless processing of paint messages
while (PeekMessage (&paintMsg, hwnd, 0, 0, PM_REMOVE | PM_QS_PAINT) != 0 && --MsgCounter > 0)
{
DispatchMessage (&paintMsg);
}
return CoGetObject (monikerName, &bo, iid, ppv);
}
Лучшая статья, которую я видел, является этим:
http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx
Это объясняет вниз вшивому песчаному из того, что продолжается негласно, когда существующие приложения Microsoft поднимают подсказку контроля учётных записей и немного, как сделать это самостоятельно, или по крайней мере Вы будете знать что Ваш против заставить его работать...
(отметьте примеры, которые он показывает, управляемый C++),
Я думаю, что Aydsman на правильном пути здесь. С добавлением поддержки Именованных каналов.NET 3.5, у Вас есть достойный механизм IPC для общения с поднятым дочерним процессом.
Windows SDK "Перекрестные Технологические Образцы" имеет приложение "UACDemo", которое показывает примеры приложения Windows Forms C#, которое запускает процесс администратора для выполнения задачи, которая требует повышения (т.е. пишущий в %programfiles%
).
Это - большая начальная точка для записи Вашей собственной функциональности. Я расширил этот образец для использования.Net Remoting и IPC для вызова между моим процессом обычного пользователя и моим поднятым процессом, который позволяет мне сохранять исполняемый файл повышения универсальным и реализовывать специализированный код в рамках приложения.
Найденный хорошей статьей, которая касается этого здесь:
Большинство приложений не требует прав администратора во время выполнения. Если Ваше приложение не поддерживает перекрестное состояние сеанса, в то время как оно выполняет и не делает чего-то как изменение политики локальной защиты, оно должно очень хорошо работать с маркером стандартного пользователя. Иногда определенные части Вашего приложения будут требовать прав администратора, и необходимо выделить те части в отдельный процесс. Я войду в это немного позже.
Похож на статью, говорит об использовании C++, таким образом, я нашел другую статью, которая касается, как назвать этот код с помощью P/Invoke. Так должно быть выполнимым от.NET.