Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   ShellExecute 42, GetLastError 126 (https://www.delphipraxis.net/192980-shellexecute-42-getlasterror-126-a.html)

hoika 8. Jun 2017 08:13

ShellExecute 42, GetLastError 126
 
Hallo,

folgender Code funktioniert plötzlich nicht mehr,
d.h. der für Txt hinterlegte Editor (notepad.exe) wird nicht gestartet.

Delphi-Quellcode:
var
  sDateiName: String;
  hInst: Integer;
  iError: Integer;
begin
  sDateiName:= 'C:\Temp\Log.txt'; // nur zum Testen
 
  if FileExists(sDateiName) then
  begin
    hInst := ShellExecute(0, nil, PChar(sDateiName), '', nil, 0);
    iError := GetLastError;
  end;
hInst=42
iError=126


Was ist das denn?

Der schöne Günther 8. Jun 2017 08:27

AW: ShellExecute 42, GetLastError 126
 
Zitat:

If the function succeeds, it returns a value greater than 32.
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx


Wo ist dein Problem?

TiGü 8. Jun 2017 08:36

AW: ShellExecute 42, GetLastError 126
 
Geht es um die Antwort auf die Frage nach dem Leben, dem Universum und dem ganzen Rest? :wink:

hoika 8. Jun 2017 09:12

AW: ShellExecute 42, GetLastError 126
 
Hallo,
der Editor wird nicht gestartet.

Der schöne Günther 8. Jun 2017 09:21

AW: ShellExecute 42, GetLastError 126
 
Schau doch noch mal genau in die Doku zu ShellExecute :warn:

Auflösung:
Du gibst ja auch einen Parameter (leerer String statt nil) an. Das bedeutet implizit dass deine .txt-Datei eine Anwendung wäre.

Zitat:

If lpFile specifies a document file, lpParameters should be NULL.

DeddyH 8. Jun 2017 09:26

AW: ShellExecute 42, GetLastError 126
 
Wird er nicht gestartet, oder siehst Du ihn nur nicht? Du gibst als nShowCmd 0 an, was SW_HIDE entspricht.

hoika 8. Jun 2017 09:47

AW: ShellExecute 42, GetLastError 126
 
Hallo,

Zitat:

Du gibst ja auch einen Parameter (leerer String statt nil) an. Das bedeutet implizit dass deine .txt-Datei eine Anwendung wäre.
Nö, mit PDF klappt das ja auch.

Zitat:

Wird er nicht gestartet, oder siehst Du ihn nur nicht? Du gibst als nShowCmd 0 an, was SW_HIDE entspricht.
Argz, genau das war das Problem;)
Ich Dussel.
Interessanterweise ignoriert der Acrobat-Reader bei PDFs meinen Parameter.

Der schöne Günther 8. Jun 2017 09:52

AW: ShellExecute 42, GetLastError 126
 
Zitat:

Zitat von hoika (Beitrag 1373808)
Nö, mit PDF klappt das ja auch.

Richtig ist es trotzdem nicht

himitsu 8. Jun 2017 09:54

AW: ShellExecute 42, GetLastError 126
 
Acrobat ignoriert bösartig noch viel mehr.

.Enabled bei der ActiveX-Komponente
und die Sidebars werden auch mit vorliebe angezeigt, auch wenn man das immer wieder deaktiviert,
also niemals dessen Verhalten als Referenz nutzen.

In Delphi entsprechen die leeren Strings ( '' ) einem NIL.
Mit Ausnahme von PChar-Casts, welche das auf einen Dummystring mit zwei NULL ( #0#0 ) umleiten.

Zacherl 8. Jun 2017 12:48

AW: ShellExecute 42, GetLastError 126
 
Zitat:

Zitat von hoika (Beitrag 1373793)
Delphi-Quellcode:
hInst := ShellExecute(0, nil, PChar(sDateiName), '', nil, 0);
iError := GetLastError;

Kann man in deinem Codebeispiel nicht mehr erkennen, aber prüfst du auch erst den Wert von
Delphi-Quellcode:
hInst
, bevor du
Delphi-Quellcode:
iError
auswertest? Im Erfolgsfalle ist der Wert von MSDN-Library durchsuchenGetLastError nämlich immer undefiniert.

himitsu 8. Jun 2017 17:39

AW: ShellExecute 42, GetLastError 126
 
Zitat:

Zitat von Zacherl (Beitrag 1373860)
Im Erfolgsfalle ist der Wert von MSDN-Library durchsuchenGetLastError nämlich immer undefiniert.

Undefiniert nicht.
Der Wert passt ja definitiv zum letzten Fehler, irgendeiner vorher aufgerufenen WinAPI-Funktion, bzw. vom letzten SetLastError.

Zacherl 8. Jun 2017 18:15

AW: ShellExecute 42, GetLastError 126
 
Zitat:

Zitat von himitsu (Beitrag 1373914)
irgendeiner

Das würde ich ja schon als ziemlich undefiniert bezeichnen :P Vor allem, wenn der letzte API Aufruf erfolgreich war, man aber nur auf
Delphi-Quellcode:
GetLastError
!= 0 prüft, gibt es massive Probleme.

jaenicke 8. Jun 2017 19:23

AW: ShellExecute 42, GetLastError 126
 
Man kann vorher auch SetLastError benutzen um das zu vermeiden.

himitsu 8. Jun 2017 20:56

AW: ShellExecute 42, GetLastError 126
 
Zitat:

Zitat von jaenicke (Beitrag 1373919)
Man kann vorher auch SetLastError benutzen um das zu vermeiden.

Jain.

Laut Definition gibt diese API nur einen LastError zurück, wenn das Result sagt, dass was kaputt ist.

Jetzt kann diese API aber intern weitere APIs aufrufen und Diese auch usw.
Aber nur weil eine der internen APIs einen Fehler meldete, heißt das noch lange nicht, dass "unsere" API auch 'nen Fehler liefert. (die kann ja intern noch einen alternativen Weg gehen, oder so)

Tja, wenn du vorher z.B. SetLastError(NO_ERROR) nutzt und hinterher der GetLastError was Anderes sagt, dann hat das rein garnichts zu sagen, so lange das Result sagt "ich bin OK".

jaenicke 8. Jun 2017 21:05

AW: ShellExecute 42, GetLastError 126
 
Ich wollte damit auch nicht sagen, dass man das so machen sollte.

hoika 8. Jun 2017 21:13

AW: ShellExecute 42, GetLastError 126
 
Hallo,
Thema ist beendet, ich hatte ja SW_HIDE (0) übergeben.

Danke !


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz