تنفذ هذه المقالة تشغيل برنامج وحدة التحكم في دلفي وتعرض مخرجات برنامج وحدة التحكم في عنصر تحكم المذكرة.
في العمل، كنت بحاجة إلى تجميع برامج J2ME يدويًا، وبدأت في كتابة برنامج دفعي، لكنني شعرت أنه مرهق للغاية في الاستخدام، لذلك أردت استخدام دلفي لإنشاء أداة تجميع متكاملة، ومع ذلك، فإن أدوات تجميع Java هي جميعها برامج وحدة تحكم. كيفية التقاط برنامج وحدة التحكم وعرضه في المذكرة، بعد التحقق من بعض المعلومات على الإنترنت واختبارها بشكل متكرر، وجدت طريقة لتنفيذها، وآمل أن تكون مفيدة للجميع:
PROcedure TMainForm.RunDosInMemo(const DosApp: string; AMemo: TMemo);
ثابت
{ضبط حجم ReadBuffer}
قراءة المخزن المؤقت = 2400؛
فار
الأمان: سمات الأمن؛
ReadPipe، WritePipe: Thandle؛
ابدأ: TStartUpInfo؛
معلومات العملية: TProcessInformation;
المخزن المؤقت: PChar؛
بايت القراءة: DWord؛
بوف: سلسلة؛
يبدأ
مع الأمن القيام به
يبدأ
nlength := SizeOf(TSecurityAttributes);
binherithhandle := true;
lpsecuritydescriptor := nil;
نهاية؛
{قم بإنشاء أنبوب مسمى لالتقاط مخرجات برنامج وحدة التحكم}
إذا كان Createpipe (ReadPipe، WritePipe، @Security، 0) ثم
يبدأ
المخزن المؤقت := AllocMem(ReadBuffer + 1);
فيلشار (ابدأ، سيزوف (ابدأ)، #0)
{تعيين سمات بدء التشغيل لبرنامج وحدة التحكم}
مع البدء في القيام به
يبدأ
cb := SizeOf(start);
start.lpReserved := nil;
lpDesktop := nil;
lpTitle := nil;
دوكس := 0;
دوي := 0;
dwXSize := 0;
dwYSize := 0;
dwXCountChars := 0;
dwYCountChars := 0;
dwFillAttribute := 0;
cbReserved2 := 0;
lpReserved2 := nil;
hStdOutput := WritePipe; // قم بتوجيه الإخراج إلى WritePipe الذي أنشأناه
hStdInput := ReadPipe; // الإدخال المباشر إلى ReadPipe الذي أنشأناه
hStdError := WritePipe;// قم بتوجيه إخراج الخطأ إلى WritePipe الذي أنشأناه
dwFlags := STARTF_USESTDHANDLES أو STARTF_USESHOWWINDOW;
wShowWindow := SW_HIDE;// اضبط النافذة للاختباء
نهاية؛
يحاول
{إنشاء عملية فرعية وتشغيل برنامج وحدة التحكم}
إذا كان CreateProcess (nil، PChar (DosApp)، @Security، @Security، صحيح،
NORMAL_PRIORITY_CLASS،
لا شيء، لا شيء، ابدأ، ProcessInfo) ثم
يبدأ
{انتظر حتى تنتهي العملية}
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
{أوقف الإخراج...لم أقم بإيقاف تشغيله في البداية، ونتيجة لذلك، إذا لم يكن هناك إخراج، فسوف يموت البرنامج. }
CloseHandle(WritePipe);
بوف := '';
{اقرأ مخرجات برنامج وحدة التحكم}
يكرر
قراءة البايت := 0;
ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
المخزن المؤقت [BytesRead] := #0;
OemToAnsi(Buffer, Buffer);
Buf := Buf + string(Buffer);
حتى (BytesRead <ReadBuffer)؛
SendDebug(Buf);
{تقسيم وفقًا للأسطر الجديدة وعرضها في المذكرة}
بينما pos(#10, Buf) > 0 افعل
يبدأ
AMemo.Lines.Add(Copy(Buf, 1, pos(#10, Buf) - 1));
حذف(بوف، 1، نقاط البيع(#10، بوف));
نهاية؛
نهاية؛
أخيراً
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
نهاية؛
نهاية؛
نهاية؛