لا أستطيع الوصول إلى سلسلة عاد من أمر دلفي CreateProcess؟

StackOverflow https://stackoverflow.com/questions/343476

سؤال

وأنا باستخدام وظيفة CreateProcess Win32 لإجراء مكالمة إلى تنفيذ الخارجي. للتنفيذ بإرجاع سلسلة.

هل هناك طريقة يمكنني التقاط واستجواب سلسلة عاد بعد استدعاء القابل للتنفيذ؟ إذا تعذر ذلك، وأنا قد تضطر إلى كتابة السلسلة إلى ملف في تنفيذ وقراءة ذلك في برنامج الاستدعاء بعد انتهاء المكالمة. يبدو أن أعرج على الرغم من.

هل كانت مفيدة؟

المحلول

مكتبة كود جدي title="Jedi يحتوي على وظيفة CreateDOSProcessRedirected التي تدير العملية و يوفر لها المدخلات والمخرجات الملف. يمكنك وضع المدخلات المطلوبة (إن وجدت) في ملف الإدخال وقراءة الناتج العملية (إن وجدت) من ملف الإخراج (بعد اكتمال عملية).

وهذه هي الطريقة التي يتم تنفيذ ذلك في JCL :

function CreateDOSProcessRedirected(const CommandLine, InputFile, OutputFile: string): Boolean;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  SecAtrrs: TSecurityAttributes;
  hInputFile, hOutputFile: THandle;
begin
  Result := False;
  hInputFile := CreateFile(PChar(InputFile), GENERIC_READ, FILE_SHARE_READ,
    CreateInheritable(SecAtrrs), OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, 0);
  if hInputFile <> INVALID_HANDLE_VALUE then
  begin
    hOutputFile := CreateFile(PChar(OutPutFile), GENERIC_READ or GENERIC_WRITE,
      FILE_SHARE_READ, CreateInheritable(SecAtrrs), CREATE_ALWAYS,
      FILE_ATTRIBUTE_TEMPORARY, 0);
    if hOutputFile <> INVALID_HANDLE_VALUE then
    begin
      FillChar(StartupInfo, SizeOf(StartupInfo), #0);
      StartupInfo.cb := SizeOf(StartupInfo);
      StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      StartupInfo.wShowWindow := SW_HIDE;
      StartupInfo.hStdOutput := hOutputFile;
      StartupInfo.hStdInput := hInputFile;
      Result := CreateProcess(nil, PChar(CommandLine), nil, nil, True,
        CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo,
        ProcessInfo);
      if Result then
      begin
        WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
        CloseHandle(ProcessInfo.hProcess);
        CloseHandle(ProcessInfo.hThread);
      end;
      CloseHandle(hOutputFile);
    end;
    CloseHandle(hInputFile);
  end;
end;

نصائح أخرى

وعلى افتراض أن كنت تريد التقاط ما إكس والكتابة إلى الإخراج القياسي، يمكنك البدء مع

yourprog.exe > results.txt

وهذا سوف يكتب الإخراج إلى results.txt، والتي يمكن بعد ذلك قراءة وتقييم.

وأو، يمكنك محاولة شرح الأسلوب في هذا الموضوع : إنشاء أنبوب لالإخراج من عملية لدت والقراءة منه. آخر رقم 7 لديه المثال المصدر على كيفية استخدام وظائف WINAPI ذات الصلة في C ++، التي يجب أن تترجم بسهولة إلى دلفي.

وكيف القابل للتنفيذ <م> بإرجاع سلسلة ؟ الأكثر أعرف قابل للتنفيذ يمكن العودة هو مجرد رقم، رمز الخروج.

هل يمكن استخدام الذاكرة المشتركة للاتصال بين التطبيقين.

ويمكنك استخدام الدالة Win32 CreateFileMapping، وربما استخدام مزامنة لمزامنة المكالمات إلى ملف تعيين الذاكرة.

والتعليمة البرمجية التالية بإنشاء ملف.

var
  fMapping : THandle;
  pMapData : Pointer;

fMapping := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE,
             0, MAPFILESIZE, pchar('MAP NAME GOES HERE'));

PMapData := MapViewOfFile(fMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);

وإغلاق البرمجية التالية ملف التخطيط

if PMapData <> nil then
  UnMapViewOfFile(PMapData);
if fMapping <> 0 then
  CloseHandle(fMapping);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top