Hallo
DP'ler,
ich habe vor diesen Code zu benutzen, möchte aber den Schreib- und Lesevorgang im
Ram haben.
Meine Frage- wie kriege ich das ganze ins
Ram anstatt auf die Festplatte??
Nach einigen Tagen mit Auseinanderstezungen von CreateProzess und GetConsoleOutput ist dieser Coder übrig und ich bin erstmal am Ende.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
Memo1.Clear;
RunCaptured('C:\', 'E:\MediaInfo\MediaInfo.exe'+ ' --Inform=Audio;%Format%\r\n%Format_Profile%\r\n%BitRate_Mode/String%\r\n%BitRate/String%\r\n%SamplingRate/String%'+
'e:\FILME\oktober.avi', '/K '+ Edit1.Text);
if Memo1.Lines.Strings[0]= 'MPEG Audio' then
if Memo1.Lines.Strings[1]= 'Layer 3' then
if Memo1.Lines.Strings[2]= 'Constant' then
if Memo1.Lines.Strings[3]= '128 Kbps' then
if Memo1.Lines.Strings[4]= '48.0 KHz'then
ShowMessage('OK');
end;
function TForm1.RunCaptured(const _dirName, _exeName, _cmdLine: string): Boolean;
var
start: TStartupInfo;
procInfo: TProcessInformation;
tmpName: string;
tmp: Windows.THandle;
tmpSec: TSecurityAttributes;
res: TStringList;
return: Cardinal;
begin
Result:= False;
try
tmpName:= 'Test.txt';
FillChar(tmpSec, SizeOf(tmpSec), #0);
tmpSec.nLength:= SizeOf(tmpSec);
tmpSec.bInheritHandle:= True;
tmp:= Windows.CreateFile(PChar(tmpName),
Generic_Write, File_Share_Write,
@tmpSec, Create_Always, File_Attribute_Normal, 0);
try
FillChar(start, SizeOf(start), #0);
start.cb := SizeOf(start);
start.hStdOutput := tmp;
start.dwFlags := StartF_UseStdHandles or StartF_UseShowWindow;
start.wShowWindow := SW_HIDE;
if CreateProcess(nil, PChar(_exeName + ' '+ ''), nil, nil, True,
0, nil, PChar(_dirName), start, procInfo) then
begin
SetPriorityClass(procInfo.hProcess, Idle_Priority_Class);
WaitForSingleObject(procInfo.hProcess, Infinite);
GetExitCodeProcess(procInfo.hProcess, return);
Result:= (return= 0);
CloseHandle(procInfo.hThread);
CloseHandle(procInfo.hProcess);
Windows.CloseHandle(tmp);
res:= TStringList.Create;
try
res.LoadFromFile(tmpName);
Memo1.Lines.AddStrings(res);
finally
res.Free;
end;
Windows.DeleteFile(PChar(tmpName));
end
else
begin
Application.MessageBox(PChar(SysErrorMessage(GetLastError())),
'RunCaptured Error', MB_OK);
end;
except
Windows.CloseHandle(tmp);
Windows.DeleteFile(PChar(tmpName));
raise;
end;
finally
end;
end;
end.
Wenn mir da geholfen werden könnte wäre das SUPER, aber bitte nicht mit Links, habe so viel ausprobiert und bekomme nur Fehler.
Angefangen von Schreibfehlern mit
Dll's und im Arbeitsspeicher, bis daß das Programm nicht gefunden werden konnte.
Mit der Funktion "function GetConsoleOutput" gibt es an dieser Stelle immer Probleme.
Delphi-Quellcode:
if CreateProcess(nil, PChar(command), nil, nil, true,
CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil,
StartupInfo, ProcessInfo) then
begin
Nach ein par Änderungen wird zwar fehlerfrei compiliert, aber ich habe Probleme mit dem Speicherzugriff oder es scheint das Programm nicht zu geben, was natürlich Quatsch ist.
In meinem Übriggeblieben Code habe ich versucht mit einem MemoryStream an dieser Stelle einsteigen, aber ich mache etwas falsch, es klappt nicht, und (vermutlich) genau da brauche ich eure Unterstützung.
Vielleicht mache ich nen Denkfehler, dann schreibt mit welchen, bin nicht der Erfahrenste
Delphi-Quellcode:
tmp:= Windows.CreateFile(PChar(tmpName),
Generic_Write, File_Share_Write,
@tmpSec, Create_Always, File_Attribute_Normal, 0);
Habe vor das ganze für die Mediainfo_Cli, Avidemux_CLI und FFMepg_CLI auszubauen.