error C2227: left of '->lpDesktopL' must point to class/struct/union

0

Witam. W c++ na co dzień nie piszę i nie ukrywam że nie jestem w tym dobry, jednak muszę w programie Javowym zmienić datę systemową. Ponieważ Windows7 wymaga do tej operacji uprawnień administratora nie mogę zrobić tego za pomocą commandline'a. Postanowiłem więc spróbować zrobić to w c++. Przy wywołaniu funkcji createProcessAsUserA otrzymywałem błąd:
Unhandled exception at 0x7c902128 in TimeT.exe: 0xC0000005: Access violation reading location 0x00000000.
Podejrzewam że z powodu braku inicjalizacji składowych LPSTARTUPINFOA.
Kiedy jednak próbuję przypisać wartości tym polom dostaję błąd kompilacji:
1>TimeT.cpp 1>.\TimeT.cpp(32) : error C2227: left of '->lpDesktopL' must point to class/struct/union
Z góry dziękuję za pomoc.
Pozdrawiam

 // TimeT.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


#include <iomanip>
#include <iostream>
#include <windows.h>
#include <winbase.h>
#include <userenv.h>
using namespace std;
class TimeT
{
      public:
             int main();
             bool zmien();
};
int main()
{
    TimeT* t = new TimeT();
    t->zmien();
}
bool TimeT::zmien()
{
     HANDLE HAND;
     int result = LogonUserA("tomo", ".", "tomek", 2, 0, &HAND);
     cout << result;
     PROCESS_INFORMATION pi;
	 LPSTARTUPINFOA* si;
	 si = new LPSTARTUPINFOA();
	 si->lpDesktopL = "winsta0\\default";
	 //si.cb = sizeof(si);
	//si.dwFlags = STARTF_USESHOWWINDOW;
	//si.wShowWindow = SW_HIDE;
	//si.lpTitle = L"System";
	 if (INVALID_HANDLE_VALUE != HAND)
	 {
		result = CreateProcessAsUserA(HAND,
			"",
			"cmd",
			0,
			0,
			false,
			NORMAL_PRIORITY_CLASS,
			0,
			0,
			*si,
			&pi);
	 }
     /*if(result)
     {
     SYSTEMTIME st;
     st.wYear = 2000;
     st.wMonth = 5;
     st.wDay = 12;
     st.wHour = 16;
     st.wMinute = 8;
     st.wSecond = 31;
     st.wMilliseconds = 55;
     ::SetSystemTime(&st);
     }*/
     //cout << GetLastError();
     system("pause");
	 return true;
}
0

http://msdn.microsoft.com/en-us/library/ms682512%28v=vs.85%29.aspx

Hm, nie wiem z resztą po co chcesz inicjalizować te pola tej struktury.

LPSTARTUPINFOA* si;
si = new LPSTARTUPINFOA();

Typ LPSTARTUPINFOA to jest już wskaźnik. Teraz co robisz to deklarujesz i tworzysz wskaźnik do wskaźnika, który na nic sensownego i tak nie wskazuje. Zrób to jak w przykładzie powyżej.

A tak swoją drogą to wcale nie jest to najlepszy sposób na to, co chcesz osiągnąć. Nie musisz starać się o uruchomienie nowego procesu na prawach innego użytkownika, nie utrudniaj sobie życia. Stwórz małą aplikację, która zmienia datę, dodaj do niej manifest, który sprawi, że przed uruchomieniem sam Windows zajmie się podniesieniem uprawnień (wyguglaj "requestedexecutionlevel").

0

Dodam, że STARTUPINFO nie ma pola o nazwie lpDesktopL, co zresztą kompilator skwitował błędem.

0

Dziękuję za odpowiedzi. Muszę to zrobić w postaci dll dołączanej do projektu.
Teraz wygląda to tak:

 
// TimeX.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iomanip>
#include <iostream>
#include <windows.h>
#include <winbase.h>
#include <userenv.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
     HANDLE HAND;
     int result = LogonUser(L"tomo", L".", L"tomek", 2, 0, &HAND);
     cout << result;
	 cout << GetLastError();
     PROCESS_INFORMATION pi;
	 STARTUPINFO si;
	 ZeroMemory( &si, sizeof(si) );
	si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );
	 if (INVALID_HANDLE_VALUE != HAND)
	 {
		 //cout<<"wywoluje polecenie";
		result = CreateProcessAsUser(HAND,
			NULL,
			L"notepad",
			NULL,
			NULL,
			false,
			NORMAL_PRIORITY_CLASS,
			NULL,
			NULL,
			&si,
			&pi);
	 }
}

mam błąd

Unhandled exception at 0x7c82f29c in TimeX.exe: 0xC0000005: Access violation writing location 0x00402176.
Co jeszcze jest nie tak?

0

Czy nie prościej od razu zmienić ten czas:
http://msdn.microsoft.com/en-us/library/ms724942%28v=vs.85%29.aspx

0

Windows7 wymaga uprawnień administratora do zmiany daty więc nie wystarczy wywołać tej funkcji, na xp ona działa na 7 już nie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1