Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   CreateProcess wirft Kernelbase Error (https://www.delphipraxis.net/207522-createprocess-wirft-kernelbase-error.html)

venice2 2. Apr 2021 12:46

CreateProcess wirft Kernelbase Error
 
Wenn ich CreateProcess ohne UniqueString aufrufe wirft es einen Kernelbase Error.
Rufe ich es mit auf sind die Strings nicht lesbar.

Delphi-Quellcode:
function PipeExec(CommandLine, Path: String; EnvironementStrings: PChar; var StdIO: TStdIO; UserToken: THandle; ShowWindow: DWORD = SW_HIDE): TProcessInformation;

  UniqueString(CommandLine);

  if UserToken = 0 then
  begin
    if not CreateProcess( nil,                 // must be NIL for win16 apps under NT, including DOS progs
                   pchar(CommandLine),
                   nil,                        // Process security attibutes. Sue same as current
                   nil,                        // Thread security attibutes. Sue same as current
                   true,                       // Inherite handles. Must be true for IO redirection
                   ProcessCreationFlags,       // creation flags
                   EnvironementStrings,        // If using with a CGI aplication, you MUST pass the HTTP headers as env. strings in this variable
                   PathPChar,                  // Directory of the new process
                   SI,                         // SISTEMINFO Structure used to initialize the new process
                   result)                    // PROCESINFORMATION structure used to control the newly created process
    then
      RaiseLastOSError;
Warum?

KodeZwerg 2. Apr 2021 13:14

AW: CreateProcess wirft Kernelbase Error
 
Ich weiß nicht direkt worin das problem besteht aber ich nutze es auch eher wie es hier beschrieben wird.
Also schon das erste Argument zu füllen.
Falls es hilft, so nutze ich es beispielsweise:
Delphi-Quellcode:
function ExecuteExe(const Executable: String; Commands: String; const ShowConsole, DoWait: Boolean): Cardinal;
  procedure WaitFor(processHandle: THandle);
  var
    Msg: TMsg;
    ret: DWORD;
  begin
    repeat
      ret := MsgWaitForMultipleObjects(1, { 1 handle to wait on }
              processHandle, { the handle }
              False, { wake on any event }
              INFINITE, { wait without timeout }
              QS_PAINT or { wake on paint messages }
              QS_SENDMESSAGE { or messages from other threads }
             );
      if ret = WAIT_FAILED then Exit; { can do little here }
      if ret = (WAIT_OBJECT_0 + 1) then
      begin
      while PeekMessage(Msg, 0, WM_PAINT, WM_PAINT, PM_REMOVE) do
          DispatchMessage(Msg);
      end;
    until ret = WAIT_OBJECT_0;
  end; { Waitfor }
var
  Security  : TSecurityAttributes;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
 Result := Cardinal($FFFFFFFF);
 if ((Length(Commands) > 1) and (Commands[1]<>' ')) then
   Commands := ' ' + Commands;
 with Security do begin
   nLength             := SizeOf(TSecurityAttributes);
   lpSecurityDescriptor := nil;
   bInheritHandle      := False;
 end;
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb         := SizeOf(StartupInfo);
  StartupInfo.dwFlags    := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  if ShowConsole then StartupInfo.wShowWindow := SW_SHOWNORMAL else StartupInfo.wShowWindow := SW_HIDE;
  if CreateProcess(PChar(Executable), PChar(Commands), @Security, @Security, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, PChar(ExtractFilePath(Executable)), StartupInfo, ProcessInfo) then
  begin
   if DoWait then WaitFor(ProcessInfo.hProcess);
   if not GetExitCodeProcess(ProcessInfo.hProcess, Result) then Result := Cardinal($FFFFFFFF);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
  end
  else
    Result := GetLastError;
end;

venice2 2. Apr 2021 13:20

AW: CreateProcess wirft Kernelbase Error
 
Zitat:

Before calling CreateProcess you have to guarantee that "FileName" is a
writable string. That can be done with the System function
UniqueString().
Ich verwende Pipe und sende mit UniqueString einen AnsiString obwohl CommandLine als PWideChar übergeben wird.
Ich glaube das die Rückgabe mit Utf8ToString übergeben werden muß.

PWideChar scheint kein "writable string" zu sein.


werde das mal testen.

himitsu 2. Apr 2021 15:21

AW: CreateProcess wirft Kernelbase Error
 
Jo.

Zitat:

lpCommangLine

...
The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.
ReadOnly ist er zwar nicht, da Variable, aber vielleicht zu klein?
Doch kann es, falls Konstante rein kommt. (nur bei Commands[1]=' ' wird es immer eine Variable)
Tipp:
Delphi-Quellcode:
UniqueString(Commands);
als erste Zeile einfügen.

PChar/PWideChar/PAnsiChar aus einem String/WideString/UnicodeString/AnsiString
is bei '' immer nicht "writeable" und auch nicht wenn es er aus einer Constante gibt. (OK, Stringkonstanten sind zwar nur "schreibgeschützte" Variablen, aber dennoch)


Warum leere "Security" anstatt NIL an die Funktion?

venice2 2. Apr 2021 15:31

AW: CreateProcess wirft Kernelbase Error
 
Zitat:

Zitat von himitsu (Beitrag 1486472)
Jo.

Zitat:

lpCommangLine

...
The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.
ReadOnly ist er zwar nicht, da Variable, aber vielleicht zu klein?

PChar/PWideChar/PAnsiChar aus einem String/WideString/UnicodeString/AnsiString
is bei '' immer nicht "writeable" und auch nicht wenn es er aus einer Constante gibt. (OK, Stringkonstanten sind zwar nur "schreibgeschützte" Variablen, aber dennoch)

Zu klein nein BufferSize ist 38


Ich habe es jetzt mal so gemacht aber leider schmiert die Anwendung wieder ab mit EAccessViolation
Obwohl der Text jetzt korrekt zu lesen ist.
Delphi-Quellcode:
Callback( ReadPipe(StdIO), Input, Terminate, PI, UserData);
Delphi-Quellcode:
 
  TIOPipe = record
    hRead,
    hWrite: DWORD;
  end;
 
  TStdIO = record
    stdIn,
    stdOut,
    stdError: TIOPipe;
  end;
Delphi-Quellcode:
Function ReadPipe(StdIo: TStdIO): string;
var
  BufferSize: DWORD;
  Buffer: array [0..255] of AnsiChar;

begin
  if StdIO.stdOut.hRead <> INVALID_HANDLE_VALUE then
  begin
    BufferSize := 0;
    // First, check the size of the current pipe buffer
    PeekNamedPipe( StdIO.stdOut.hRead,
                   nil,
                   0,
                   nil,
                   @BufferSize,
                   nil);
    // if there is data waiting, fetch it
    if BufferSize > 0 then
    begin
      try
        ZeroMemory(@Buffer, BufferSize + 1);
        // Read all data from the pipe
        ReadFile(StdIO.stdOut.hRead, Buffer, BufferSize, BufferSize, nil);
        SetLength(Result, BufferSize);
        CopyMemory(@Result, @Buffer, BufferSize);
      finally
        StrDispose(Buffer);
      end;
    end
    else
      Result := '';
  end
  else
    Result := '';
end;
so läuft es durch aber der Text ist dann nicht zu lesen.
Delphi-Quellcode:
Function ReadPipe(StdIo: TStdIO): string;
var
  BufferSize: DWORD;
  Buffer: PChar;
begin
  if StdIO.stdOut.hRead <> INVALID_HANDLE_VALUE then
  begin
    BufferSize := 0;
    // First, check the size of the current pipe buffer
    PeekNamedPipe( StdIO.stdOut.hRead,
                   nil,
                   0,
                   nil,
                   @BufferSize,
                   nil);
    // if there is data waiting, fetch it
    if BufferSize > 0 then
    begin
      // set the new length of the result and initialize it
      Buffer := StrAlloc(BufferSize + 1);
      try
        ZeroMemory(Buffer, BufferSize + 1);
        // Read all data from the pipe
        ReadFile(StdIO.stdOut.hRead, Buffer^, BufferSize, BufferSize, nil);
        SetLength(Result, BufferSize);
        CopyMemory(PChar(Result), Buffer, BufferSize);
      finally
        StrDispose(Buffer);
      end;
    end
    else
      Result := '';
  end
  else
    Result := '';
end;
Finde den Fehler nicht warum es mit einem Array of AnsiString abschmiert.

Zitat:

Warum leere "Security" anstatt NIL an die Funktion?
Ist nicht von mir. ;)

himitsu 2. Apr 2021 15:33

AW: CreateProcess wirft Kernelbase Error
 
Ich hatte oben noch bissl was geändert. :opps:

Vorallem siehe "Tipp"

venice2 2. Apr 2021 15:40

AW: CreateProcess wirft Kernelbase Error
 
Zitat:

Zitat von himitsu (Beitrag 1486474)
Ich hatte oben noch bissl was geändert. :opps:

Vorallem siehe "Tipp"

Habe ich :)

Delphi-Quellcode:
function PipeExec(CommandLine, Path: String; EnvironementStrings: PChar; var StdIO: TStdIO; UserToken: THandle; ShowWindow: DWORD = SW_HIDE): TProcessInformation;
const
  ProcessCreationFlags: DWord = NORMAL_PRIORITY_CLASS;
var
  SI       : TStartupInfo;
  PathPChar : PChar;
begin
  // initialize the structure we are going to use
  Zeromemory(@SI, SizeOf(SI));
  Zeromemory(@result, SizeOf(result));
  // Fill the necessary fields
  SI.cb := sizeof(SI);                       // Size of the structure. The OS uses that to validat it
  SI.dwFlags := STARTF_USESHOWWINDOW   or   // Use the wShowWindow field
                 STARTF_USESTDHANDLES;       // use the handles we created for the std IO pipes
  SI.wShowWindow := ShowWindow;              // Show the console or not...
  SI.hStdError := StdIO.stdError.hWrite;     // Write errors to the error pipe
  SI.hStdInput := StdIO.stdIn.hRead;         // read input from input pipe
  SI.hStdOutput := StdIO.stdOut.hWrite;      // Write Ouput to output pipe

  if length(path) > 0 then
     PathPChar := PChar(Path)
  else
      PathPChar := nil;

  UniqueString(CommandLine); //<<<<<<< Hier!

  if UserToken = 0 then
  begin
    if not CreateProcess( nil,                 // must be NIL for win16 apps under NT, including DOS progs
                   pchar(CommandLine),
                   nil,                        // Process security attibutes. Sue same as current
                   nil,                        // Thread security attibutes. Sue same as current
                   true,                       // Inherite handles. Must be true for IO redirection
                   ProcessCreationFlags,       // creation flags
                   EnvironementStrings,        // If using with a CGI aplication, you MUST pass the HTTP headers as env. strings in this variable
                   PathPChar,                  // Directory of the new process
                   SI,                         // SISTEMINFO Structure used to initialize the new process
                   result)                     // PROCESINFORMATION structure used to control the newly created process
    then
      RaiseLastOSError;
  end
  else
  begin
    if not CreateProcessAsUser( UserToken,        // UserToken of desired user. That token must be retreived with LogonUser or DuplicatteToken from a Impersonation token
                         nil,                     // must be NIL for win16 apps under NT, including DOS progs
                         pchar(CommandLine),
                         nil,                     // Process security attibutes. Sue same as current
                         nil,                     // Thread security attibutes. Sue same as current
                         true,                    // Inherite handles. Must be true for IO redirection
                         ProcessCreationFlags,    // creation flags
                         EnvironementStrings,     // If using with a CGI aplication, you MUST pass the HTTP headers as env. strings in this variable
                         PathPChar,               // Directory of the new process
                         SI,                      // SISTEMINFO Structure used to initialize the new process
                         result)                  // PROCESINFORMATION structure used to control the newly created process
    then
      RaiseLastOSError;
  end;
end;

venice2 2. Apr 2021 16:43

AW: CreateProcess wirft Kernelbase Error
 
Hänge das Projekt mal an falls jemand reinschauen möchte.
Es soll nichts anderes machen als die youtube-dl.exe über "Pipe" zu aktualisieren.

Achtung diese Datei ist nicht im Archiv.

Die Auskommentierte "Function ReadPipe" funktioniert ist aber nicht lesbar (Bild Auskommentierte Funktion)
Die Aktivierte Funktion läßt die Anwendung abstürzen.

Das Update zu erhalten dauert einige zeit warum das so langsam ist keine Ahnung! (gleiche mit der *.bat)
Ist nichts besonderes nur ein Test Projekt.

Wenn alle Stricke reißen mache ich es einfach über eine Batch Datei.

KodeZwerg 2. Apr 2021 17:12

AW: CreateProcess wirft Kernelbase Error
 
Ich schau mal rein (code), mein erster Gedanke ist, der Puffer ist viel zu klein. Als ich eine Cmd.exe über Pipes umlenkte, brauchte ich schlapp 35kb an puffer.
Mal sehen ob ich richtig nachvollziehen kann was Du da vorhast und eventuell sogar hilfreich sein kann.

venice2 2. Apr 2021 17:14

AW: CreateProcess wirft Kernelbase Error
 
Zitat:

Zitat von KodeZwerg (Beitrag 1486480)
Ich schau mal rein (code), mein erster Gedanke ist, der Puffer ist viel zu klein. Als ich eine Cmd.exe über Pipes umlenkte, brauchte ich schlapp 35kb an puffer.
Mal sehen ob ich richtig nachvollziehen kann was Du da vorhast und eventuell sogar hilfreich sein kann.

Der Buffer wird gesetzt an Hand vom BufferSize und der ist 38!
Danke für das reinschauen.

Ich habe das Array auf 255 gesetzt.

venice2 3. Apr 2021 03:11

AW: CreateProcess wirft Kernelbase Error
 
So geht's.. (Aber lahm, selbe Problem mit der Batch Datei)
@KodeZwerg Kannst ja mit der alten vergleichen wenn du bock drauf hast :)

Nebenbei man kann auch auf UniqueString(CommandLine); verzichten wenn man pchar(CommandLine) so definiert.
pchar(WideString(CommandLine))

Interessant wäre hier eine Art Progressbar (Man sieht nicht wirklich das sich etwas tut) aber ich sehe nicht wo man hier ansetzen kann.
Kenne die max. Durchläufe nicht.

Thema erledigt

venice2 3. Apr 2021 14:11

AW: CreateProcess wirft Kernelbase Error
 
Hier noch eine kleine Animation damit man überhaupt etwas sieht das sich was tut.
Function einfach ersetzen.

Delphi-Quellcode:
Function ReadPipe(StdIo: TStdIO): AnsiString;
var
  bAvailable: DWORD;
  Buffer: PAnsiChar;
begin
  if StdIo.stdOut.hRead <> INVALID_HANDLE_VALUE then
  begin
    bAvailable := 0;
    // First, check the size of the current pipe buffer
    PeekNamedPipe(StdIo.stdOut.hRead, nil, 0, nil, @bAvailable, nil);
    // if there is data waiting, fetch it
    if bAvailable > 0 then
    begin
      // set the new length of the result and initialize it
      Buffer := PAnsiChar(StrAlloc(bAvailable + 1));
      try
        ZeroMemory(Buffer, bAvailable + 1);
        // Read all data from the pipe
        ReadFile(StdIo.stdOut.hRead, Buffer^, bAvailable, bAvailable, nil);
        SetLength(result, bAvailable);
        CopyMemory(PAnsiChar(result), Buffer, bAvailable);
      finally
        StrDispose(Buffer);
      end;
    end
    else
    begin
      result := result + '.'; // <<<<<<<< Animation
      sleep(200);
      if length(Result) > 63 then
        Result := '';
    end;
  end
  else
    result := '';
end;
Ok gut mit den Spielereien war nur ein Test Projekt für meinen Video Player.
Eine perfekte Fortschrittanzeige läßt sich leider nicht realisieren.

KodeZwerg 3. Apr 2021 16:12

AW: CreateProcess wirft Kernelbase Error
 
Zitat:

Zitat von venice2 (Beitrag 1486486)
So geht's.. (Aber lahm, selbe Problem mit der Batch Datei)
@KodeZwerg Kannst ja mit der alten vergleichen wenn du bock drauf hast :)

Da Du mich mit diesem vorhaben begeisterst, bastel ich übers WE was eigenes, wenn fertig dann lass ich auch deinen Code kompilieren und durchlaufen (weil Du was von langsam geschrieben hast)
Ich habe mir gerade mal diese youtube-dl.exe geladen, die hat ja reichlich parameter. Mann-o-mann.
Kannst Du mir bitte anhand eines Kommandozeilen Befehls zeigen was du dann übergibst um alles in Gang zu bringen?
Damit es keine Mißverständisse gibt, sowas meine ich
Delphi-Quellcode:
c:\youtube\youtube-dl.exe argument1 argument2
usw.

Danke und vorab Frohe Ostern!

venice2 3. Apr 2021 18:48

AW: CreateProcess wirft Kernelbase Error
 
Pfad wo sich die exe befindet.
Delphi-Quellcode:
folderyoutube := ExtractFilePath(ParamStr(0)) + 'youtube-dl.exe';


Argument.
Delphi-Quellcode:
folderyoutube + ' -U'

aktualisiert das Exe File
Zitat:

(weil Du was von langsam geschrieben hast)
Das liegt an deren Server denke ich mal. Da kann man auch mit einer Batch nichts dran drehen.
Zitat:

Danke und vorab Frohe Ostern!
Gleichfalls to all

Habe da noch ein Problem
Delphi-Quellcode:
        if not GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, Stophandle{PI.dwProcessId}) then
        begin
Das Handle PI.dwProcessId sollte eigentlich in Ordnung sein wirft aber einen Fehler 'Das Handle ist ungültig'
Aber ist ein anderes Thema.

KodeZwerg 3. Apr 2021 23:13

AW: CreateProcess wirft Kernelbase Error
 
Zitat:

Zitat von venice2 (Beitrag 1486508)
Delphi-Quellcode:
folderyoutube + ' -U'

Ich dachte da eher an ein "Lade irgendwas irgendwo hin" ding aber gut, "-U" soll es werden. (-U erzeugt keinen progress-indikator, ich dachte darum geht es Dir)
Zitat:

Zitat von venice2 (Beitrag 1486508)
Delphi-Quellcode:
        if not GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, Stophandle{PI.dwProcessId}) then
        begin

So weit bin ich noch nicht, aber schon mal
Delphi-Quellcode:
GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0)
probiert?

Wenn die Sterne gut stehen habe ich morgen auch ein paar Demos startklar.

venice2 4. Apr 2021 09:51

AW: CreateProcess wirft Kernelbase Error
 
Zitat:

So weit bin ich noch nicht, aber schon mal GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0) probiert?
StopHandle ist 0 und PI.dwProcessId > 0 beides erzeugt 'Das Handle ist ungültig'

venice2 4. Apr 2021 11:51

AW: CreateProcess wirft Kernelbase Error
 
Zitat:

Ich dachte da eher an ein "Lade irgendwas irgendwo hin" ding
Interessiert mich persönlich eigentlich nicht weil ich nur die EXE Aktualisieren will, aber gut.

Öffne cmd.exe mit Adminrechten und Paste das da rein.
Zitat:

Video!
youtube-dl.exe -f mp4 --ignore-errors --continue -o "C:\DownLoad\%(title)s-%(id)s.%(ext)s" https://www.youtube.com/watch?v=EChjIHaBjf8
Danach sollte sich die Datei "Top 10 Unforgettable Golden Buzzers on America's Got Talent _ Got Talent Global-EChjIHaBjf8.mp4" unter C:\DownLoad befinden.
Das geht flott aber die Aktualisierung der EXE selber leider nicht.

Zitat:

Nur Audio!
youtube-dl.exe --extract-audio --audio-format mp3 -o "C:\DownLoad\%(title)s-%(id)s.%(ext)s" https://www.youtube.com/watch?v=EChjIHaBjf8
Ohne ID!
youtube-dl.exe --extract-audio --audio-format mp3 -o "C:\DownLoad\%(title)s.%(ext)s" https://www.youtube.com/watch?v=EChjIHaBjf8
Du kannst auch anstelle von mp3 -> m4a verwenden.

Fortschrittanzeige kannst du so verwirklichen.
Aber wie ich schon sagte ich benötige es nicht.
Delphi-Quellcode:
function ExtractTextBetween(const Input, Delim1, Delim2: string): string;
var
  aPos, bPos: Integer;
begin
  result := '';

  aPos := Pos(Delim1, Input);
  if aPos > 0 then
  begin
    bPos := PosEx(Delim2, Input, aPos + Length(Delim1));
    if bPos > 0 then
      result := Copy(Input, aPos + Length(Delim1), bPos - (aPos + Length(Delim1)));
  end;
end;
Delphi-Quellcode:
function GetPercentofVideo(str: String; lastpercent: integer): Integer;
var
  temp:String;
  itemp:integer;
  test:integer;
begin

  temp := ExtractTextBetween(str,'[download]','% of');
  try
    temp := trim(temp);
    Val(temp,itemp,test);
    Result := round(itemp);
  except
    Result := lastpercent;
  end;
end;
Delphi-Quellcode:
aForm.RichEdit1.Text := Output + aForm.RichEdit1.Text;
tmpPercent := GetPercentofVideo(aForm.RichEdit1.Text, percent);
percent := tmpPercent;
aForm.ProgressBar1.Position := percent;
Du kannst mein Projekt damit aktualisieren zum testen.

KodeZwerg 4. Apr 2021 13:37

AW: CreateProcess wirft Kernelbase Error
 
Zitat:

Zitat von venice2 (Beitrag 1486522)
Interessiert mich persönlich eigentlich nicht weil ich nur die EXE Aktualisieren will, aber gut.

Boah, so kann man sich Irren, das tut mir voll leid.
Danke für Deine Erklärung wie man es aufruft um was zu erhalten, hatte ich eigentlich nur für Dich benötigt, hat sich ja von selbst erledigt.
(auf cmd ebene nutz ich was für mich besseres, yaydl (hier findet man eine .exe davon), das hat zwar hier und da ein paar macken, aber läuft ordentlich)
auf browser ebene macht es ein plugin, auf Programm ebene nutze ich einen download manager.)

Mein Gedanke war halt, weil Du was von einer progress anzeige meintest, das Du tatsächlich was laden wolltest.
So krass vertan hab ich mich ja schon lange nicht mehr.

Coole Methode ExtractTextBetween(), ich hätte wahrscheinlich den Ansipuffer von der Konsole verwendet um da per Laufzeit was zu regeln, wieder dazu gelernt!

Die Zeit den Update zu beschleunigen, da fällt mir nichts ein, ich habe es zwar schon minimal beschleunigt da ich die Python Skripte direkt nutze, nicht die .exe, aber Python reinladen und das ausführen zu lassen dauert seine Zeit.
(Die Update Prozedur schlingelt sich leider durch fast alle Skripte durch)

Für mich war halt die Herausforderung sehr Interessant mal wieder was Sinnvolles mit Pipes anzustellen.
Wenn es nur ums Update geht würde ich gar nichts darstellen lassen, ein freundliches label "background update in progress" und den im Hintergrund-Thread machen lassen, ob es eine Sekunde oder Stunde dauert kann Dir doch dann egal sein, es liegt ja nicht an Dir.
(Man kann ja eine Kopie starten falls während des updates noch ein Aufruf erfolgt.)
Aber da Du nicht ich bist, hast Du ja eh vollkommen andere Pläne, die ich respektiere.

Nächste Woche lese ich mir alles nochmal durch, update alles so wie Du beschrieben hast.
Danke für die mehr-Arbeit mit der progress anzeige.

2 1/2 verschiedene Wege mit Pipes zu arbeiten habe ich bereits erarbeitet, leider nichts was mehr speed beim ausführen bringt, nur verschiedene Wege um ans Ziel zu kommen.

venice2 4. Apr 2021 13:44

AW: CreateProcess wirft Kernelbase Error
 
Zitat:

2 1/2 verschiedene Wege mit Pipes zu arbeiten habe ich bereits erarbeitet, leider nichts was mehr speed beim ausführen bringt, nur verschiedene Wege um ans Ziel zu kommen.
Nun ja wenn der Server dabei einschläft kann man selbst nicht viel machen.
Wie Ich schon sagte da hilft auch keine Batch ohne Code. Warum man da keine Fortschrittanzeige implementiert hat beim OutPut ist mir auch ein Rätzel.
Aber solange die Animation läuft sehe ich wenigstens das sich überhaupt was tut.
Zitat:

Coole Methode ExtractTextBetween()
Nicht aus meinem Mist gewachsen ;)

venice2 4. Apr 2021 15:25

AW: CreateProcess wirft Kernelbase Error
 
Hier ist ein Update mit oben genannten Änderungen.
Url kopieren mit linker Maustaste ins Edit klicken der Rest erklärt sich von selbst.
Sorry mehr mache ich nicht. In meinen Player übernimmt das der Wrapper für Youtube 3DYDYoutube von daher benötige ich es nicht.

KodeZwerg 4. Apr 2021 15:56

AW: CreateProcess wirft Kernelbase Error
 
Geiles Ding das Du das komplette Projekt nochmal bereit stellst *sag brav danke dafür* :cheer::thumb:
Aber ich frage mich ob da was falsch lief, der Inhalt vom letzten Archiv entspricht dem vom vorletzten (gleicher archivname)?
(mein fehler, downloader hat datei mehrmals geladen...)

Beim nochmal drüber nachdenken, Geschwindigkeit der Ausführung von youzube-dl.exe, vielleicht gibt es da doch was.
Ich wage mich jetzt auf extrem dünnes Eis da ich das Produkt nicht kenne, nur nebenbei mal was von gehört habe.

Es gibt ein Projekt was sich "PythonForPascal" oder "Phyton4Pascal" oder ähnlich nennt.
Wenn das Projekt Python-Skripte ausführen kann, könntest du vielleicht doch noch bisschen zeit einkaufen indem du beim start schonmal python im Hintergrund hochfährst.
Das ist es was bei der youtube-dl.exe Datei am längsten dauert, interpreter bereitstellen.
Wenn das Projekt wiederum eher ein Konverter ist (python <-> pascal) dann denk ich mal vergiss diese Zeilen ganz schnell wieder. (Idee ab in Keller, Schloss zu, Schlüssel putt machen)

Ich habe gerade leider keinen Link dazu parat, sonst hätte ich schonmal selbst was gelesen.

venice2 4. Apr 2021 16:02

AW: CreateProcess wirft Kernelbase Error
 
Zitat:

Aber ich frage mich ob da was falsch lief, der Inhalt vom letzten Archiv entspricht dem vom vorletzten (gleicher archivname)?
Da läuft nichts falsch, habe es gerade geladen und geprüft die Datei sieht so aus wie im Shot gezeigt.
Inklusive Progressbar und Download Möglichkeit.

Zitat:

Wenn das Projekt Python-Skripte ausführen kann, könntest du vielleicht doch noch bisschen zeit einkaufen indem du beim start schonmal python im Hintergrund hochfährst.
Das macht keinen Sinn weil Python schon in der youtube-dl.exe enthalten ist.
Würde ich es so machen wie du denkst müßte ich Python auf meinem System installieren.

KodeZwerg 4. Apr 2021 16:24

AW: CreateProcess wirft Kernelbase Error
 
Zitat:

Zitat von venice2 (Beitrag 1486536)
Da läuft nichts falsch, habe es gerade geladen und geprüft die Datei sieht so aus wie im Shot gezeigt.

Dankeschön nochmal, das war mein Fehler! (doppelte downloads, hatte selbst nicht so ganz durchgeblickt und den Fehler erst beim abschicken festgestellt und auch korrigiert.)

Zitat:

Zitat von venice2 (Beitrag 1486536)
Das macht keinen Sinn weil Python schon in der youtube-dl.exe enthalten ist.
Würde ich es so machen wie du denkst müßte ich Python auf meinem System installieren.

Ich meinte ja ich wage mich aufs dünne Eis hinaus. (python4delphi heißt das, habs doch gefunden und es ist ein wrapper der Skripte ausführen kann)

So, nun habe ich Dich genug belästigt und werde mich dem Sonntag zuwenden ;-)

venice2 4. Apr 2021 16:25

AW: CreateProcess wirft Kernelbase Error
 
Zitat:

So, nun habe ich Dich genug belästigt und werde mich dem Sonntag zuwenden
Kein Problem.


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