שאלה חשובה על ++C

  • פותח הנושא NORT
  • פורסם בתאריך

NORT

New member
שאלה חשובה על ++C

כתבתי תוכנית שעושה משהו פשוט יחסית (מבצעת כיבוי למחשב בשעה שמכניסים לה) . אצלי במחשב זה עובד מצויין אבל שלחתי את זה לכמה חברים שיבדקו אצלם ואצלם זה לא עובד (שלחתי רק את הקובץ EXE הקימפול נעשה אצלי ) למישהו יש הסבר ? ואיך אפשר לשנות את זה ? (לכולם יש את אותה מערכת הפעלה WIN XP)
 

אלדד28

New member
מה יהיה היום?

אני חושב שזה בגלל ה-MOV של ה-JMP במיקרוקרנל שלהם. באמת. תציע להם לג'מפר את ספק הכוח שלהם דרך לוח החשמל השכונתי. אולי כדאי שתסביר מה זה "אצלם זה לא עובד". מה קורה? יש שגיאה? זה רץ? נתקע? עף? מה בדיוק הבעיה?
 

NORT

New member
לא מכבה את המחשב

הנה הקוד כימעט בשלמותו (לא הוספתי את הכנסת הפרמטרים שמיתבצע ב MAIN) יש סיבה שאצלי המחשב נכבה בזמן ואצלם הוא ממשיך לידלוק כרגיל?
BOOL MySystemShutdown() { HANDLE hToken; TOKEN_PRIVILEGES tkp; // Get a token for this process. if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return( FALSE ); // Get the LUID for the shutdown privilege. LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // one privilege to set tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Get the shutdown privilege for this process. AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); if (GetLastError() != ERROR_SUCCESS) return FALSE; // Shut down the system and force all applications to close. if (!ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0)) return FALSE; return TRUE; } void MyTime(int offMin,int offHoure) { time_t now = time(0); struct tm* lt = localtime(&now); int min =lt->tm_min; int houre =lt->tm_hour; if(offHoure<=houre && offMin<=min) MySystemShutdown(); }​
 

gilad_no

New member
אתה לא סוגר את הידית לאחר שימוש

הנה קוד שלי לREBOOT (שעובד בXP)
BOOL Restart() { if (IsNT()) { HANDLE hToken; if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken)) return FALSE; TOKEN_PRIVILEGES Tp; LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME, &Tp.Privileges[0].Luid); Tp.PrivilegeCount = 1; Tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken,FALSE,&Tp,0,(PTOKEN_PRIVILEGES)NULL,0); DWORD dwError=GetLastError(); CloseHandle(hToken); if (dwError!=ERROR_SUCCESS) return FALSE; } return ExitWindowsEx(EWX_REBOOT,0); }​
 

NORT

New member
אבל איך יתכן שבמחשב א יעבוד

ובמחשב ב לא ? גם לא הבנתי מה לא בסדר בקוד שלי
 

gilad_no

New member
בתור התחלה,

אתה לא סוגר את הידית עם CLOSEHANDLE. דבר שני, אתה בכלל לא בודק אם הפונקציה הצליחה. תבנה LOG שייכתוב בדיוק אם הכל הצליח (ואם לא, שייכתוב למשל את הערך של GETLASTERROR). דבר שני, *אל* תשתמש בEWC_FORCE. אם כבר, תשים אם EWX_FORCEIFHUNG (תקרא בMSDN לקבלת עוד הסברים לגבי ההבדלים).
 
למעלה