لا أستطيع الوصول إلى سلسلة عاد من أمر دلفي CreateProcess؟
-
19-08-2019 - |
سؤال
وأنا باستخدام وظيفة 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);