Как установить часы Windows, используя C ++ - PullRequest
3 голосов
/ 18 августа 2011

Я пытаюсь установить системные часы Windows, используя C ++. Я пытаюсь с помощью следующего кода (не работает):

#include "stdafx.h"
#include "iostream"
#include "windows.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[]) {

    SYSTEMTIME st;
    st.wDay = 1;
    st.wMonth = 5;
    st.wYear = 2011;
    st.wHour = 12;
    st.wMinute = 15;
    bool result = SetLocalTime(&st);
    cout << result;
    return 0;
}

Может кто-нибудь указать на мою ошибку? Заранее спасибо.

Ответы [ 4 ]

6 голосов
/ 18 августа 2011

Какая версия Windows? В Vista + вам необходимы права администратора для установки времени. Запустите вашу программу от имени администратора, и она должна работать.

Что ж, как писал Адам ниже, привилегии администратора строго не требуются, но давайте начнем делать так, чтобы это работало простым способом; -)

Кроме того, я хотел бы ZeroMemory (& st, sizeof (st)), чтобы дополнительные элементы, такие как секунды, не содержали недопустимых значений. А еще лучше, просто инициализировать всех членов структуры.

4 голосов
/ 18 августа 2011

st инициализирован не полностью и содержит недопустимые значения. Инициализируйте его полностью, и код работает. Если бы вы вызвали GetLastError (), он бы сразу же дал вам подсказку, потому что возвращал 87, то есть ERROR_INVALID_PARAMETER. Поля дня недели, секунд и миллисекунд, несомненно, содержат недопустимые значения.

4 голосов
/ 18 августа 2011

Из документации SetLocalTime ():

Вызывающий процесс должен иметь привилегию SE_SYSTEMTIME_NAME.Эта привилегия по умолчанию отключена.Функция SetLocalTime включает привилегию SE_SYSTEMTIME_NAME перед изменением местного времени и отключает привилегию перед возвратом.Для получения дополнительной информации см. Запуск со специальными привилегиями.

Возможное решение - включить UAC в параметрах компоновщика:

Откройте диалоговое окно свойств проекта, перейдите в Linker-> Manifest и установите UACв "requireAdministrator".

Недостатком является то, что вам нужно запустить Visual Studio от имени администратора для отладки вашей программы.

2 голосов
/ 18 августа 2011

Вам нужно инициализировать параметры, которые вам не нужны, в 0.

Заменить:

SYSTEMTIME st;

на:

SYSTEMTIME st;
ZeroMemory(&st, sizeof(st));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...