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/)
-   -   Delphi CreateProcess mit String BDS2009 (https://www.delphipraxis.net/163793-createprocess-mit-string-bds2009.html)

Pro_RJ 16. Okt 2011 22:14


CreateProcess mit String BDS2009
 
Guten Abend,
Ich versuche mich gerade an den ersten Schritte im BDS 2009.
Ich versuche seit 2 Tagen die "einfache" Procedure CreateProcess aufzurufen
um, Testweise,ein Bild aufzurufen.
Ich habe es bereits mit Diversen Tutorials Probiert, aber ich komme immer zum gleichen Ergebiss:
1. " die Datei '%1' ist keine gültige Win32 Anwendung"
oder
2. "Die Datei wurde nicht gefunden."

Ich habe es bereits mit dieversen Datentypen versucht (String,Ansistring,Widestring) aber die Datei wird einfach nicht aufgerufen.

Konnte mir bitte jemand sage, wo ich hier den Fehler habe?

Ich gebe auch offen zu, das ich die Umstellung von BDs2006 - BDS2009 von den Stringtypen noch nicht verstanden habe.Ich kämpfe micht zwar schon seit gut ner woche durch diverse Umstellungs-Tips und Anleitungen aber erfolgreich umsetzen konnte ich es noch nicht.


Ich verwende Folgenden Code
BDS 2006 --> Funktioniert Problem los

Delphi-Quellcode:
var StartupInfo: TStartupInfo;
begin
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb         := SizeOf(StartupInfo);
  StartupInfo.dwFlags    := STARTF_USESIZE;
  StartupInfo.wShowWindow := SHOW_OPENWINDOW;
  // Erzeugen
  //===============================================
  if CreateProcess(NIL ,
//                   PChar(Parameter),
                   PChar('C:\Test1\Tulips.jpg'),
                   nil,
                   nil,
                   False,
                   SW_HIDE,
//                   SW_NORMAL,
//                   CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                   nil,
                   nil,
                   StartupInfo,
                   Result) then
  begin
//    Result := Result.dwProcessId;
    if Wait then ProcessWarten(Result);
  end;
//  if Result.hProcess <> 0 then CloseHandle(Result.hProcess);
//  if Result.hThread <> 0 then CloseHandle(Result.hThread);
end;
Angepasst an BDS 2009 --> klappt nicht
Delphi-Quellcode:
var StartupInfo: TStartupInfo;
    ProcessInfo: TProcessInformation;
    PFad : String;
    aa : PCHar;
begin
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  FillChar(ProcessInfo,SizeOf(TProcessInformation),0);
  StartupInfo.cb         := SizeOf(StartupInfo);
  StartupInfo.dwFlags    := STARTF_USESIZE;
  StartupInfo.wShowWindow := SHOW_OPENWINDOW;

  PFad := 'C:\Test1\Tulips.jpg';
  aa := PCHar(Pfad);
  // Erzeugen
  //===============================================
  if CreateProcess(NIL ,
//                   PChar(Parameter),
                   @pfad,
                   nil,
                   nil,
                   False,
                   SW_HIDE,
//                   SW_NORMAL,
//                   CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                   nil,
                   nil,
                   StartupInfo,
                   ProcessInfo) then
  begin
  end
  else
  Begin
    Showmessage(SysErrorMessage(GetLastError))

  End;
end;

schonmal vielen Dank für die Hilfe

jaenicke 16. Okt 2011 22:22

AW: CreateProcess mit String BDS2009
 
Wichtig ist, dass CreateProcess in der Unicodevariante einen veränderbaren String als Parameter erwartet. Das einfachste ist vor dem Cast auf PChar einen konstanten Leerstring zu konkatenieren.
Siehe ähnliche Frage mit meiner Antwort:
http://www.delphi-forum.de/topic_Cre..._104214,0.html
Sowie die entsprechenden Hinweise in der Doku:
http://docwiki.embarcadero.com/RADSt...icode_anpassen

Pro_RJ 16. Okt 2011 22:29

AW: CreateProcess mit String BDS2009
 
Danke für die Antwort,
ich habe es mal entsprechend geändert:

Delphi-Quellcode:
//const PFad = 'C:\Test1\Tulips.jpg';
var StartupInfo: TStartupInfo;
    ProcessInfo: TProcessInformation;
    Pfad : String;

    aa : PCHar;
begin
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  FillChar(ProcessInfo,SizeOf(TProcessInformation),0);
  StartupInfo.cb         := SizeOf(StartupInfo);
  StartupInfo.dwFlags    := STARTF_USESIZE;
  StartupInfo.wShowWindow := SHOW_OPENWINDOW;

  PFad := 'C:\Test1\Tulips.jpg';
  //aa := PCHar(Pfad);
  // Erzeugen
  //===============================================
  if CreateProcess(NIL ,
                   PChar(Pfad + ''),
//                   @pfad,
                   nil,
                   nil,
                   False,
                   SW_HIDE,
//                   SW_NORMAL,
//                   CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                   nil,
                   nil,
                   StartupInfo,
                   ProcessInfo) then
  begin
  end
  else
  Begin
    Showmessage(SysErrorMessage(GetLastError))

  End;
end;
Allerdings bekomme ich immernoch die Fehlermeldung "%1 ist keine gültige Win32 Anwendung"

himitsu 16. Okt 2011 22:32

AW: CreateProcess mit String BDS2009
 
Du willst einen Prozess aus diesem Bild erzeugen?
Tja, die Datei '%1' ist keine gültige Win32 Anwendung sagt dir doch, daß dieses nicht geht.
Ein Bild ist nunmal keine "Anwendung".

Mit CreateProcess kannst du höchstens einen Prozess aus einer Anwendung erzeugen, welche dein Bild versteht/anzeigt und diesem das Bild als Parameter mitgeben. :zwinker:

Lösung: Hier im Forum suchenShellExecute / MSDN-Library durchsuchenShellExecute


Und hier Die Datei wurde nicht gefunden wird wohl das Unicode-/AnsiProblem zugeschlagen haben.

Pro_RJ 16. Okt 2011 22:35

AW: CreateProcess mit String BDS2009
 
Ich möchte ja das Bild in der entsprechenden Anwendung starten.
ShellExecute kann ich nicht verwenden, da ich später den Process "überwachen" möchte. Also das Hauptprogramm soll später prüfen, ob der Process noch aktiv ist, und wenn er es nicht mehr ist, soll ein entsprechendes Ereigniss ausgeführt werden. Dafür ist es aber eben wichtig, das ich den Process kenne, der gestartet wird.
Edit.
Das Problem ist, das ich nicht weiss, welches Process gestartet wird.

Luckie 16. Okt 2011 22:40

AW: CreateProcess mit String BDS2009
 
Und wie ist es mit ShellexecuteEx?

himitsu 16. Okt 2011 22:45

AW: CreateProcess mit String BDS2009
 
Zitat:

Zitat von Luckie (Beitrag 1130759)
Und wie ist es mit ShellexecuteEx?

Wobei das sogar im MSDN erwähnt wurde. :angle2:

Zitat:

Zitat von MSDN > ShellExecute
To obtain information about the application that is launched as a result of calling ShellExecute, use ShellExecuteEx.


Pro_RJ 16. Okt 2011 22:48

AW: CreateProcess mit String BDS2009
 
hrrrrr.
Es ist halt doch schon spät :oops: :wall::wall::wall::wall:
Das war ein Denkfehler von mir, ich hab Shellexecute und CreateProcess durcheinander geworfen.
CreateProcess -> nur bei anwendungen
Shellexecute --> Datei ausführen.

Dann hat sich dir Frage bereits erledigt.:duck:
vielen vielen Danke für die Hilfe
und schönen abend noch

himitsu 16. Okt 2011 23:31

AW: CreateProcess mit String BDS2009
 
Naja, wie war das nochmal mit dem Wald und den Bäumen? :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:03 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