Delphi-PRAXiS
Seite 2 von 3     12 3      

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 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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:50 Uhr.
Seite 2 von 3     12 3      

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