Помощь - Поиск - Пользователи - Календарь
Полная версия: SetSystemTime
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
18192123
Требуется установить системное время с использованием функции:

BOOL SetSystemTime(
const SYSTEMTIME* lpSystemTime
);



Вот что у меня получилось:

#include "stdafx.h"
#include "windows.h"
#include <stdio.h>
#include <conio.h>
#include <winbase.h>
#include <windef.h>

//....
SYSTEMTIME New_ST;
GetSystemTime(&New_ST);
printf("%02d \n", New_ST.wHour); //посмотрим, каким было системное время

New_ST.wHour = 10; //изменим часы
SetSystemTime(&New_ST);

GetSystemTime(&New_ST); //посмотрим результат
printf("%02d", New_ST.wHour);
getch();
//....



Скажи пожалуйста, правильно ли я использую функцию?
меня смущают получаемые результаты: например реальное время 18:...
результаты работы: до - 14, после 12...
volvo
Цитата
меня смущают получаемые результаты: например реальное время 18:...
результаты работы: до - 14, после 12...
GetSystemTime возвращает время UTC, так что совсем не проблема, что это не будет совпадать с твоим, локальным временем. А вот то, что после SetSystemTime у тебя не возвращается то же время, которое установлено только что - это уже хуже... И после SetSystemTime и после GetSysTime получи коды ошибки (GetLastError), и убедись что ошибок не было (я надеюсь, привилегия SE_SYSTEMTIME_NAME доступна под твоей учетной записью?)...
18192123
Цитата(volvo @ 13.09.2008 19:56) *

И после SetSystemTime и после GetSysTime получи коды ошибки (GetLastError), и убедись что ошибок не было...



SYSTEMTIME New_ST;
GetSystemTime(&New_ST);
printf("%02d \n", New_ST.wHour); //посмотрим, каким было системное время
printf("(%d)\n", GetLastError());

New_ST.wHour = 10; //изменим часы
SetSystemTime(&New_ST);
printf("(%d)\n", GetLastError());

GetSystemTime(&New_ST); //посмотрим результат
printf("%02d", New_ST.wHour);
printf("(%d)\n", GetLastError());



В каждом из случаев вызова GetLastError() - код ошибки 2....
volvo
Цитата
В каждом из случаев вызова GetLastError() - код ошибки 2....
blink.gif При чем здесь ошибка №2? Это ж "ERROR_FILE_NOT_FOUND: The system cannot find the file specified." Какой именно файл не найден, спрашивается? Кстати, в первом случае у тебя GetLastError() вызывается для операции printf, а не для GetSystemTime. Нужно вызывать получение кода ошибки сразу после проверяемой операции.

Пока думается только о том, что у тебя вызывается не глобальная Get/SetSystemTime, а одноименная функция из какого-нибудь namespace... Попробуй:

	SYSTEMTIME New_ST;
::GetSystemTime(&New_ST);
DWORD dwErr = GetLastError();
printf("%02d\nGetSystemTime LastError() = %d", New_ST.wHour, dwErr);

New_ST.wHour = 14; //изменим часы
::SetSystemTime(&New_ST);
dwErr = GetLastError();
printf("SetSystemTime LastError() = %d\n", dwErr);

::GetSystemTime(&New_ST); //посмотрим результат
dwErr = GetLastError();
printf("%02d\nGetSystemTime LastError() = %d\n", New_ST.wHour, dwErr);

P.S. Что с привилегиями?
18192123
Цитата(volvo @ 13.09.2008 23:07) *

Пока думается только о том, что у тебя вызывается не глобальная Get/SetSystemTime, а одноименная функция из какого-нибудь namespace... Попробуй:


результаты первого(новый параметр 14) и второго запуска (19) запуска на картиночке...

и получается, что 2-й раз изменения не происходят...

ээ...а насчёт привилегий я не знаю...как можно проверить??
volvo
Цитата
а насчёт привилегий я не знаю...как можно проверить??


"Пуск" -> "Выполнить" -> cmd -> whoami /PRIV

(проверял под Windows XP SP3, в SP2 этого может еще не быть). А вообще, если ты работаешь под админским аккаунтом, то привилегии все у тебя есть, если под ограниченным пользовательским - тогда имеет смысл проверить...
18192123
Цитата(volvo @ 14.09.2008 20:40) *

если ты работаешь под админским аккаунтом

именно под ним..
18192123
То же самое задание попыталась реализовать в С++ Builder6
В Edit1 вводится системное время, которое нужно установить...


SYSTEMTIME New_ST;
char msgbuf[4096];
New_ST.wHour = StrToInt(Edit1->Text); //изменим часы
::SetSystemTime(&New_ST);
//контроль ошибок
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
msgbuf, sizeof(msgbuf), NULL );
Edit2->Text=msgbuf; // выдаёт ошибку "Параметр задан неверно" и соответственно никаких изменений времени не //происходит



В чём может быть причина??
volvo
Цитата
В чём может быть причина??
В том, что остальные поля (кроме wHour) содержат некорректные значения (ты ж их не инициализируешь никак). Если тебе надо изменить показания часов, надо сначала из прочитать, правда?

void __fastcall TForm1::Button14Click(TObject *Sender)
{
SYSTEMTIME New_ST;
char msgbuf[4096];

::GetSystemTime(&New_ST); // заполним все поля значениями
New_ST.wHour = StrToInt(Edit1->Text); // изменим часы
if(::SetSystemTime(&New_ST) == 0) {
//контроль ошибок
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),msgbuf, sizeof(msgbuf), NULL );
Edit2->Text=msgbuf;
}
}

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.