PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Win2000 per VB-Programm runterfahren



toemchen
11.07.2004, 16:10
Hallo,

mit meiner Roboter-Mechanik/Elektronik bin ich nun kurz vor folgendem Milestone: Das Großhirn Epia-Board wird endlich von den Akkus versorgt, eine C-Control überprüft die Spannungen der einzelnen Akkus und sendet dies seriell zum Epia-Board. Dort zeichnet ein VisualBasic-Programm auf und sendet seriell ein "Schalt mich aus" an die C-Control, wenn die Akkus zu schwach werden.

Die Frage ist nun: Wie kann sich nach dem Kommando "Schalt mich aus" (darauf kann die C-Control ja verzögert reagieren) sich der Rechner erstmal selbst runterfahren? Kann ich das außerhalb VisualBasic regeln, mit ner Batch-Datei? Gibts das unter Win2000 überhaupt? Oder lautet das Zauberwort WinAPI?

Ich weiß noch nicht einmal, wo ich nachsehen sollte. Ich hoffe, ich habe meinen Wunsch genau genug beschrieben.

Noch ein paar Infos: Die 5VStandby, die PowerGood und die PowerOn Leitung sind bei der Versorgung des Epia Boards (noch) nicht belegt. Momentan arbeite ich noch mit VisualBasic 4, werde aber auf 6 umsteigen.

Vielen Dank für Eure Hilfe schon mal.

Toemchen

Rodney
11.07.2004, 16:30
Es geht auf alle Fälle per API-Befehl von dem PC selber.

Ich kann mich aus meiner VB Zeit noch daran erinnern, dass es irgendwas mit Shutdown war(ist ne WinAPI Funktion) , musst du selber mal suchen. Dort kann man dann noch als Paramter übergeben ob er neustarten, herunterfahren oder in den Standby gehen soll.

NumberFive
11.07.2004, 17:02
WINUSERAPI
BOOL
WINAPI
ExitWindowsEx(
IN UINT uFlags,
IN DWORD dwReserved);

#define EWX_LOGOFF 0
#define EWX_SHUTDOWN 0x00000001
#define EWX_REBOOT 0x00000002
#define EWX_FORCE 0x00000004
#define EWX_POWEROFF 0x00000008

ExitWindowsEx(EWX_SHUTDOWN,SHTDN_REASON_MAJOR_SYST EM);

ich weiß nur leider nicht mehr wie das mit dem declariren in vb war.

toemchen also doch nicht unser software schade.

Gruß

Johannes
11.07.2004, 17:08
Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, _
ByVal dwReserved As Long) As Long

Gruß
Johannes

God
11.07.2004, 19:15
Ich weiß noch nicht einmal, wo ich nachsehen sollte.
Toemchen

Gute Sites zu VB sind:
www.vbarchiv.de
oder
www.activevb.de

mfg God

Freiheitspirat
12.07.2004, 10:33
Wieso läßt Du nicht die C-Control ein Impuls auf die PowerOn Leitung geben ?
Damit kann die das Mainboard beliebig hoch- und runterfahren...

toemchen
12.07.2004, 11:19
Ja vielen Dank erstmal!

@diverse VB-Berater: Danke, wird sobald wie möglich ausprobiert. Und daß sich das VB-Programm damit hintenrum selbst abschießt, macht ihm nichts aus, oder?

@NumberFive: Wenn ich doch nur mal eine Mini-Anwendung programmieren will, welche die Akkulaufzeit mißt und zuletzt Shutdown macht, darf ich das doch selbst machen? :-)

@Freiheitspirat: Ich weiß nicht, ob das Mainboard wirklich mit diesen Signalen was anfängt. Wie gesagt, momentan sind alle diese Leitungen (5V Standby-Spannung, PowerOn, PowerGood) nicht belegt und trotzdem läuft das Mainboard fröhlich los. Aber es wäre schon wünschenswert, wenn die C-Control ein Runterfahren des Epia-Boards auch erzwingen könnte. Sie soll auch einmal als Watchdog fungieren.

Freiheitspirat
12.07.2004, 11:45
Nun, ich weiß nicht wie Du die Stromversorgung geregelt hast, aber bei meinem Epia MII 12000 mit passendem mini-box PW-120 muß ich zum hochfahren PowerOn (wie bei jedem PC) schalten.
Ich weiß nur noch nicht genau, ob man den entsprechenden Pin einfach an einen IO-Port des Controlers verbinden und bei Bedarf nach Masse ziehen kann. Aber warum eigentlich nicht ?

Johannes
12.07.2004, 11:47
Das das VB Programm beim runterfahren beendet wird, sollte ihm nichts ausmachen. Schließlich kann sich ein VB ja auch ohne Runterfahren selbst beenden. Ich selbst habe diese API-Funktion noch nie verwendet. Sag dann mal bescheid, ob es funktioniert hat.

Gruß
Johannes

NumberFive
13.07.2004, 21:47
Die funktion habe ich schon mehr fach im einsatzz aller dinst nur von c++ aus da ist sie her wenn man nicht will das sein app likation hart beendet wird muß man sich selbst benden nach den funktions auf ruch die zeit hat man dann noch. weil das system wird herunter gefahren und nicht ab geschossen.

wenn man das übe die hard ware mach wird windows nicht immer sauber beendet aber es ist sicher auch ein möglich keit wo ich warscheinlich beides machen würde erst per software den pc herrunter fahren falls die zeit nicht reicht über die hard ware da ding beenden. dran denken wenn windows läft muß die power taste lange drücken bis sich der pc runter fährt. mein erfahrung mit ein normalen atx board bei epia kann das ja anders sein

Gruß

Johannes
13.07.2004, 21:54
Wieos wird das dann nicht sauber beendet? Beim ATX-Board sollte er doch automatisch alles beenden. Und wenn man keine Anwendungssoftware offen hat, sollte das doch gehen, ohne das Daten verloren gehen, oder? Aber die Hardware-Methode gefällt mir sowieso nicht :-)

Gruß
Johannes

recycle
14.07.2004, 01:06
Wieos wird das dann nicht sauber beendet? Beim ATX-Board sollte er doch automatisch alles beenden.
Ob Windows die Programme schliesst und runterfährt oder in den Standby-Modus geht oder alle Programme geöffnet lässt und die Daten per "Suspend to Ram" oder "Suspend to Disk" sichert, kannst du in Bios und Windows einstellen. Das geht natürlich nur, wenn die Hardware das unterstützt und funktioniert wie vieles bei Windows nur mit ein bischen Glück ;-)



Aber die Hardware-Methode gefällt mir sowieso nicht

Dass man im Bios und Windows einstellen kann, was passiert, wenn man den Button drückt, heisst eigentlich, dass die "Hardware Methode"gar nicht soviel mit Hardware zutun hat.

Je nach BIOS und Bios-Einstellungen, hat der Powerbutton oft 2 Funktionen:
- kurz drücken: dann darf Windows sich überlegen was es macht (siehe oben)
- lange drücken: dann schaltet das Bios den Rechner aus, egal ob Windows das passt oder nicht

Wenn man die Sache so einrichtet, dass Windows beim betätigen des Powerbuttons runterfährt (kurzer Impuls), dürfte das eigentlich gleichwertig mit einem API-Aufruf sein.
Wenn man es so einrichtet, dass der Rechner auch gegen den Willen von Windows über das Bios abgeschaltet wird (langer Impuls), ist das natürlich nicht ganz so elegant ;-)

Dass der Powerbutton auch über Windows ausgewertet wird, kann man bei manchen Notebooks ganz gut feststellen. Wenn sich da Windows ordentlich aufhängt, kann man den Power-Button drücken soviel und solange man will und es passiert nichts. Da hilft dann manchmal nur noch Netzstecker ziehen und Akku rausnehmen.

Johannes
14.07.2004, 11:38
Jaja, stimmt wohl alles. Aber nach Numberfives Post klang es so, das selbst beim kurzen Impuls nicht alles sauber beendet wird.

Gruß
Johannes

NumberFive
15.07.2004, 20:48
hallo recycle,

na so ganz bin ich da nicht deiner meinung mit dem Notebook gebe ich dir recht. kenne das aus leitvoller erfahrung. wenn mit notebook programmiert komm man öfter in die verlegenheit.

klar ist das es sehr stark vom board treiber abhängt was passiert. den das alles tut nur wenn board und windows sich zu 100% verstehen.

Mit der software lösung tut es immer auf dem system. da kannst auch das
ding nur in den schlaf modus schicken muß halt nur den richtigen parameter mit geben.

Meine erfahrung war halt folgende wenn ich das per software mache
hat es immer funktionier wenn per hard das gemacht wurde gab es bios'e
die nicht immer auf das ende von windows gewarte haben sondern irgend wann ein den strom abgestellt haben.

Eine vorteil habe ich noch wenn ich es per software mach ich kann die an wendung die ich beenden muß noch sauber beenden. before ich den rechner runter fahre.

Windows Nachrichten WM_QUIT und WM_CLOSE
WM_QUIT = Application jetzt und hier beenden
WM_CLOSE fenster schliessen wenn letztes Fenester dann wir die application beendet.

Aber eines ist auch klar hat sehr viel mit Software disgn und ansichten zu
tun ich denke es gibt nicht die Lösung.

recycle
15.07.2004, 22:50
Hallo NumberFive


klar ist das es sehr stark vom board treiber abhängt was passiert.
den das alles tut nur wenn board und windows sich zu 100%
verstehen.
Dass ist leider häufig der grosse Haken. Das Herunterfahren, die diversen Stromspar-Modi, Suspend to Disk usw. funktionieren leider nur, wenn Windows, installierte Hardware, Gerätetreiber und Mainboard sich verstehen.

Wenn man für seinen Robby auf alte Hardware die man noch übrig hat zurückgreift, ist die Chance, dass es da Probleme gibt natürlich noch grösser als bei aktuellen Rechnern.

Da kannst du aber mit dem softwareseitigen Herunterfahren auch Pech haben. Bei Win98 und WinME z.B. war das Problem, dass sich Rechner überhaupt nicht richtig herunterfahren liessen zeitweise sehr verbreitet.

Wenn du bei Win 2000 den ACPI Modus abstellst, z.B. weil der sich mit irgendwelcher älteren Hardware nicht versteht, kannst du den Rechner z.B. auch nur noch am Schalter ausmachen.

Aber selbst wenn Hardware und Windows prinzipiell zusammenspielen, kanns natürlich immer noch Probleme geben, wenn irgendein Prozess hängen bleibt.
Mir ist es z.B. eine Zeit lang häufig passiert, dass ich Windows "gesagt" habe es soll runterfahren, den Bildschirm abgestellt habe und gegangen bin und am nächsten morgen lief der Rechner immer noch, weil irgendwas hängen geblieben ist.


Eine vorteil habe ich noch wenn ich es per software mach ich kann die an wendung die ich beenden muß noch sauber beenden. before ich den rechner runter fahre.
Dass du per Software flexibler bist und noch bestimmte Dinge abfragen und auf eventuelle Probleme reagieren kannst, ist völlig klar.

Mir ging es eigentlich nicht darum, welche Lösung besser ist. Was ich sagen wollte ist, dass Windows bei ATX-Boards "normalerweise" auch beim drücken des Powerbuttons heruntergefahren wird und nicht wie früher bei ganz alten Rechnern einfach der Strom abgeschaltet wird.


Aber eines ist auch klar hat sehr viel mit Software disgn und ansichten zu tun ich denke es gibt nicht die Lösung.
Ich glaube, wenn die gesamte Steuerung vom Robby über den PC geschieht, wird es meist auch am einfachsten und sinnvollsten sein, wenn diese Software den PC auch herunterfährt.
Wenn auf dem PC Datenbanken oder andere Programme laufen, bei denen Daten verloren gehen könnten auch.

Wenn der Robby aber autonom über einen µC gesteuert wird und auf dem PC nur irgendwelche Zusatzsoftware für den Robby läuft, bei der nicht grossartig Daten verloren gehen können, fände ich es sinnvoller, wenn er den ein- und ausschaltet.
Und wenn er ihn einschalten soll, muss er eh den Powerbutton "benutzen" - dann kann er ihn da ja auch gleich wieder ausschalten ;-)

Aber neben aller Theorie gibt es ja auch noch rein praktische Aspekte.
Wenn man nicht gut programmieren kann, tendiert man vermutlich eher zur "Hardware-Lösung", wenn man Probleme mit dem Lötkolben hat vermutlich eher zur Software.

NumberFive
20.07.2004, 18:28
schön geschrieben dem kann ich mich nur anschliesen.

PS: wer jeden tag programmiert dem fällt das mit der software halt leichter
hast schon recht

andi84
25.08.2004, 00:27
nochmal zum Thema Software-Runterfahren:
Windows mag es auf dauer gar nicht, wenn man ihm einfach den Saft abdreht, selbst dann, wenn nichts mehr läuft sind oft noch Änderungen des MFT (Master-File-Table) im RAM statt auf der Platte; das kann auf Dauer zu Problemen führen. Per Software ist sicherlich der gesündere Weg.
Man kann ja eigentlich auch die POWER-LED oder den POWER_ON anschluss zum Netzteil überwachen: dann weiss die C-Control, was das Glöckchen geschlagen hat und kann zur Not doch noch den großen Entsafter spielen.

Win9X und Win2k sind nebenbei ein klein bisschen unterschiedlich, was den Power-Down angeht:
Unter win 95, 98 Me sieht das so aus:


Declare Function ExitWindowsEx& Lib "user32" (ByVal uFlags As Long, _
ByVal dwReserved As Long)

Public Const EWX_FORCE = 4
Public Const EWX_LOGOFF = 0
Public Const EWX_REBOOT = 2
Public Const EWX_SHUTDOWN = 1

Private Sub cmdShutdown_Click()

Dim MsgRes As Long

'Make sure that the user really want to shutdown
MsgRes = MsgBox("Are you sure you want to Shut Down Windows 95?", vbYesNo Or vbQuestion)

'If the user selects no, exit this sub
If MsgRes = vbNo Then Exit Sub

'else, shutdown windows and unload this form
Call ExitWindowsEx(EWX_SHUTDOWN, 0)


Unter 2000 und XP so:



Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Boolean, ByRef NewState As typTOKEN_PRIVILEGES, ByVal BufferLength As Long, ByRef PreviousState As typTOKEN_PRIVILEGES, ByRef ReturnLength As Long) As Boolean
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, ByRef TokenHandle As Long) As Boolean
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, ByRef lpLuid As typLUID) As Boolean
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Const TOKEN_QUERY As Long = &H8
Private Const TOKEN_ADJUST_PRIVILEGES As Long = &H20
Private Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege"
Private Const SE_PRIVILEGE_ENABLED As Long = &H2

Private Const EWX_LOGOFF As Long = 0
Private Const EWX_SHUTDOWN As Long = &H1
Private Const EWX_REBOOT As Long = &H2
Private Const EWX_FORCE As Long = &H4
Private Const EWX_POWEROFF As Long = &H8
Private Const EWX_FORCEIFHUNG As Long = &H10

Private Type typLUID
LowPart As Long
HighPart As Long
End Type

Private Type typLUID_AND_ATTRIBUTES
pLuid As typLUID
Attributes As Long
End Type

Private Type typTOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(64) As typLUID_AND_ATTRIBUTES
End Type

If OpenProcessToken(GetCurrentProcess(), (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hTokenHandle) Then
If LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, tmpLuid) Then

With tkpNewState
' Ok we can now adjust the shutdown priviledges:
.PrivilegeCount = 1
With .Privileges(0)
.Attributes = SE_PRIVILEGE_ENABLED
.pLuid.HighPart = tmpLuid.HighPart
.pLuid.LowPart = tmpLuid.LowPart
End With '.privileges(0)
End With 'tkpnewstate

If AdjustTokenPrivileges(hTokenHandle, 0, tkpNewState, Len(tkpPreviousState), tkpPreviousState, lngBufferLen) Then
CloseHandle hTokenHandle
If ExitWindowsEx(Flags, &H0) Then
ShutDownMachine = True
End If
End If
End If
End If

thille
25.08.2004, 08:17
Es gibt da ein kleines Tool, das mit XP ausgeliefert wird, genannt shutdown.exe, das funktioniert auch unter W2K, damit kann man in einer Batchdatei einen Rechner oder ein ganzes Netz ordnungsgemäß herunterfahren und ausschalten oder neustarten.

Gruß

Torsten

19.12.2004, 15:06
Die funktion habe ich schon mehr fach im einsatzz aller dinst nur von c++ aus da ist sie her wenn man nicht will das sein app likation hart beendet wird muß man sich selbst benden nach den funktions auf ruch die zeit hat man dann noch. weil das system wird herunter gefahren und nicht ab geschossen.

wenn man das übe die hard ware mach wird windows nicht immer sauber beendet aber es ist sicher auch ein möglich keit wo ich warscheinlich beides machen würde erst per software den pc herrunter fahren falls die zeit nicht reicht über die hard ware da ding beenden. dran denken wenn windows läft muß die power taste lange drücken bis sich der pc runter fährt. mein erfahrung mit ein normalen atx board bei epia kann das ja anders sein

Gruß