Во-первых, ваши типы не правы. a имеет целые числа, а имя не является целым числом.
Что было бы лучше (с использованием STL), так это использовать пару из строки и целого числа (вы можете использовать символ для всего, что имеет значение, если только вы не хотите, чтобы люди были 2 147 483 000 лет). [ 112]
int array_size = 4; // as an example
// the array, but now the type is of a pairing of string and integer.
std::array<std::pair<std::string, int>, array_size> a;
a[0] = {"joao", 12}; // how to set a name
Или какие угодно имена.
Часть Вашей проблемы - то, что у Вас есть несколько неправильных подписей PInvoke. Самый известный SetSystemTime должен иметь непустое возвращаемое значение. Вот корректная подпись
/// Return Type: BOOL->int
///lpSystemTime: SYSTEMTIME*
[System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint="SetSystemTime")]
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
public static extern bool SetSystemTime([InAttribute()] ref SYSTEMTIME lpSystemTime) ;
Мое подозрение - то, что блокировка возвращаемого значения испортила стек, и функция SetSystemTime по существу закончилась с неправильными данными.
Согласно коду Вы имеете тут же, Вы не увеличиваете час. Похоже на установку системного времени на то же самое время, как это было при вызове Win32GetSystemTime.
Попытка:
systime.wHour = (ushort)(sysTime.Hour + 1);
Проблема касается UTC времени и местного времени. См. эту ссылку: http://www.codeproject.com/Messages/2998246/problem-with-SetSystemTime-fucntion-of-Kernel32-dl.aspx
Надеюсь, это вам поможет.
TimeSpan diffLocalTime = DateTime.Now - DateTime.UtcNow;
SystemTime systemTime = new SystemTime();
systemTime.Second = ...
systemTime.Minute =....
systemTime.Hour -= (ushort)(diffLocalTime.Hours + 1); // 00:59:59 I rounded as 1 hour
bool result = SetSystemTime(ref systemTime);
Это использование Работает правильно для местного часового пояса.