AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language DisplaySwitch über ShellExecute oder WinExec funktioniert nicht

DisplaySwitch über ShellExecute oder WinExec funktioniert nicht

Ein Thema von martinwk · begonnen am 27. Jan 2020 · letzter Beitrag vom 28. Jan 2020
Antwort Antwort
Seite 1 von 2  1 2   
martinwk

Registriert seit: 27. Jan 2020
2 Beiträge
 
#1

DisplaySwitch über ShellExecute oder WinExec funktioniert nicht

  Alt 27. Jan 2020, 14:24
Delphi-Version: XE7
DisplaySwitch.exe (Dienstprogramm in system32) gestattet die Umschaltung internes/externes Display über die Kommandozeile:
DisplaySwitch /internal
oder
DisplaySwitch /external
Man kann auch aus der Zeile ein Batchprogramm machen, dieses aufrufen: Funktioniert.
Auch ein Link auf das Batchprogramm funktioniert.

Rufe ich aber DisplaySwitch.exe mit dem jeweiligen Parameter via ShellExecute oder WinExec auf, passiert nichts.
Ebenso, wenn ich cmd.exe als auszuführendes Programm angebe mit "/c DisplaySwitch /external" als Parameter. Dann blinkt nur kurz die Konsole auf.

So etwas habe ich noch nie erlebt, habe bis dato unzählige Programme, Batchdateien, auch Links, problemlos via ShellExecute aufgerufen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.570 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht

  Alt 27. Jan 2020, 14:32
Möglichweise benötigt der Aufruf erhöhte Rechte.
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.694 Beiträge
 
Delphi XE4 Professional
 
#3

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht

  Alt 27. Jan 2020, 14:34
Hallo,
welcher Fehlercode? Vielleicht sagt auf GetLastError was.
Geht es prinzipiell nicht, oder nur auf deinem Rechner?
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.368 Beiträge
 
Delphi 2010 Professional
 
#4

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht

  Alt 27. Jan 2020, 14:36
Frage: Wird das Prgramm aufgerufen wenn Du die Batch Datei anstelle der .exe aufrufst? (.bat/.cmd in Dein Projekt Verzeichniss kopieren damit der absolute Pfad keine Probleme darstellt)
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.221 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht

  Alt 27. Jan 2020, 14:41
Ein bisschen Code wäre nicht schlecht. Dann sähe man auch wie es sich z.B. mit übergebenen Fensterhandles (HWND) verhält...
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
863 Beiträge
 
Delphi 6 Professional
 
#6

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht

  Alt 27. Jan 2020, 15:34
Hmm..

Setze mal einfach 'cmd.exe /A /C ' vor deinen Aufruf.

also:

Code:
cmd.exe /A /C DisplaySwitch /internal
Manche Batch-Befehle laufen nur in der CMD...
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)

Geändert von HolgerX (27. Jan 2020 um 15:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
35.847 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht

  Alt 27. Jan 2020, 16:31
Ohne cmd.exe bekommt er den Fehlercode von der DisplaySwitch.exe, anstatt dem von der cmd.exe.

fehlende Suchpfade, wenn/da ohne Pfadeangabe?
wenn mit, dann vielleicht falscher Pfad?
usw.

Also ja, ein bissl Code kann nie schaden, damit jemand dort eventuelle Fehler bemerken könnte,
und für dich gilt: Rückgabewerte prüfen, damit du erfährts warum es nicht geht. (Datei nicht gefunden, falsche Parameter, Programmfehler, ...)
siehe ERRORLEVEL, bzw. hier Result dieser WinAPI und GetLastError (jenachdem was in der Doku dieser WinAPI steht)


Und dieses WinExec solltest du auch gleich endlich mal vergessen, da diese API schon seit Jahrzehnten veraltet ist.
neu: ShellExecute, CreateProcess und deren Verwandte.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (27. Jan 2020 um 16:35 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.694 Beiträge
 
Delphi XE4 Professional
 
#8

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht

  Alt 27. Jan 2020, 17:05
Hallo,
als Fehler kommt "File not found".

Es hat vielleicht damit zu tun, dass du als 32-Bit-Programm (?) eine 64-Bit-Programm starten willst,
oder der Ansatz über cmd geht nicht, wegen siehe hier

https://www.herber.de/forum/archiv/1...t.html#1575549

Wow64EnableWow64FsRedirection benutzten hilft vielleicht.


Ich würde aber erst mal zur Bat-Datei greifen, das klappt auf jeden Fall.
ShellExecute(Handle, nil, 'c:\temp\Display.bat', '', '', SW_ShowNormal);
Heiko

Geändert von hoika (27. Jan 2020 um 17:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
35.847 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht

  Alt 27. Jan 2020, 17:16
Ohhh, das ist ja nett.

Aber dann wäre auch eine Lösung, dass er sein Programm als 64 Bit compiliert.




Alternativ könnte man auch direkt die WinAPI nutzen, welche diese Anwendung verwendet,
vermutlich wirgendwas in Richtung MSDN-Library durchsuchenChangeDisplaySettings.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.445 Beiträge
 
Delphi 5 Professional
 
#10

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht

  Alt 27. Jan 2020, 17:27
DisplaySwitch.exe gibt's im Windows 10 nur noch im %SystemRoot%\System32. Bei älteren Windows-Versionen (7 und 8.1) liegt zusätzlich eine 32-bit-Version in %SystemRoot%\SysWOW64. Falls du Windows 10 und ein 32-bit-Delphi-Programm verwendest, müsstest du daher %SystemRoot%\SysNative\DisplaySwitch.exe statt %SystemRoot%\system32\DisplaySwitch.exe aufrufen. Oder eben wie himitsu bereits sagte, dein Programm als x64 kompilieren.

Grüße
Dalai
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf