ورود

View Full Version : دریافت خروجی یک فایل اجرایی در دلفی



khakestany
چهارشنبه 29 بهمن 1393, 23:20 عصر
سلام
من یک فایل اجرایی در فاکس پرو نوشتم که خروجی آن یک رشته 10 حرفی می باشد. چطور میتوانم فایل مورد نظر را در دلفی فراخوانی کنم و رشته خروجی آن را مورد استفاده قرار دهم. لطفا راهنمایی فرمایید.

golbafan
پنج شنبه 30 بهمن 1393, 07:47 صبح
رشته رو میتونید به سه روش کلی در دلفی فراخوانی کنید
خواندن از حافظه، خواندن از فایل و استفاده از پایپ

برای خواندن از حافظه لازمه بتونید از مسیج استفاده کنید و خروجی رو با فاکسپرو بصورت مسیج به ویندوز بدید و دائما مسیجهای ویندوز رو در دلفی مانیتور کنید
خواندن از فایل راحتتره اما با سرعت کمتری انجام میشه

یک راه دیگه که در نسخه های بالاتر انجام میشه استفاده از pipe هست:


function GetDosOutput(CommandLine: string; Work: string = 'C:\'): string;
var
SA: TSecurityAttributes;
SI: TStartupInfo;
PI: TProcessInformation;
StdOutPipeRead, StdOutPipeWrite: THandle;
WasOK: Boolean;
Buffer: array[0..255] of AnsiChar;
BytesRead: Cardinal;
WorkDir: string;
Handle: Boolean;
begin
Result := '';
with SA do begin
nLength := SizeOf(SA);
bInheritHandle := True;
lpSecurityDescriptor := nil;
end;
CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
try
with SI do
begin
FillChar(SI, SizeOf(SI), 0);
cb := SizeOf(SI);
dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
wShowWindow := SW_HIDE;
hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
hStdOutput := StdOutPipeWrite;
hStdError := StdOutPipeWrite;
end;
WorkDir := Work;
Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine),
nil, nil, True, 0, nil,
PChar(WorkDir), SI, PI);
CloseHandle(StdOutPipeWrite);
if Handle then
try
repeat
WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
if BytesRead > 0 then
begin
Buffer[BytesRead] := #0;
Result := Result + Buffer;
end;
until not WasOK or (BytesRead = 0);
WaitForSingleObject(PI.hProcess, INFINITE);
finally
CloseHandle(PI.hThread);
CloseHandle(PI.hProcess);
end;
finally
CloseHandle(StdOutPipeRead);
end;
end;

یوسف زالی
پنج شنبه 30 بهمن 1393, 09:56 صبح
رشته رو میتونید به سه روش در دلفی فراخوانی کنید

روشها بیشتر از سه تاست. مثلا استفاده از حافظه اشتراکی، استفاده از جدول اتم ها، استفاده از سوکت، استفاده از رجیستری، استفاده از سرویس های وب، استفاده از خروجی بصورت export یک تابع، نوشتن روی عناصر برنامه میزبان، تجاوز به منطقه حافظه برنامه میزبان، و روشهای بسیار دیگه.




برای خواندن از حافظه لازمه بتونید از مسیج استفاده کنید

این روش اسمش ارسال مسیج هست نه خواندن از حافظه.




دائما مسیجهای ویندوز رو در دلفی مانیتور کنید

دائما لازم نیست، کافیه به هندل برنامه مقصد پیام ارسال بشه، و اونجا براش رویدادی نوشته بشه.
همچنین می شه پیام رو به تمام برنامه های سیستم BroadCast کرد.

دکتر شریعتی در یکی از سخنرانی هاش می گه:
سخنور خوب میگه روشهای فلان کار اینهاست، و اونها رو تا جایی که بلده می شمره، و اگر چیزی یادش رفت یا از قلم افتاد، به کسی برنمی خوره.
سخنور بد میگه روشهای فلان کار این 5 تاست (مثلا) و با این کار متعهد می شه 5 مورد رو شرح بده. حالا اگر موردی یادش بره یا بفهمه تعداد روشها 5 تا نبوده، خودش رو زیر سوال برده.

:بامزه:

golbafan
پنج شنبه 30 بهمن 1393, 10:04 صبح
روشها بیشتر از سه تاست. مثلا استفاده از حافظه اشتراکی، استفاده از جدول اتم ها، استفاده از سوکت، استفاده از رجیستری، استفاده از سرویس های وب، استفاده از خروجی بصورت export یک تابع، نوشتن روی عناصر برنامه میزبان، تجاوز به منطقه حافظه برنامه میزبان، و روشهای بسیار دیگه.


این روش اسمش ارسال مسیج هست نه خواندن از حافظه.


دائما لازم نیست، کافیه به هندل برنامه مقصد پیام ارسال بشه، و اونجا براش رویدادی نوشته بشه.
همچنین می شه پیام رو به تمام برنامه های سیستم BroadCast کرد.

دکتر شریعتی در یکی از سخنرانی هاش می گه:
سخنور خوب میگه روشهای فلان کار اینهاست، و اونها رو تا جایی که بلده می شمره، و اگر چیزی یادش رفت یا از قلم افتاد، به کسی برنمی خوره.
سخنور بد میگه روشهای فلان کار این 5 تاست (مثلا) و با این کار متعهد می شه 5 مورد رو شرح بده. حالا اگر موردی یادش بره یا بفهمه تعداد روشها 5 تا نبوده، خودش رو زیر سوال برده.

:بامزه:

سلام دوست عزیز
روشهایی که فرمودید در همین سه روش کلی که عرض کردم گنجونده میشه
مثلا: استفاده از حافظه اشتراکی و جاوز به منطقه حافظه برنامه میزبان و استفاده از خروجی بصورت export یک تابع => خواندن از حافظه
یا مثلا استفاده از رجیستری در حوزه خواندن از فایل قرار میگیره
و مثلا استفاده از وب سرویس و سوکت در حوزه مسیج و پایپ قرار داره
در ضمن سوال ایشون رو هم مد نظر قرار بدید و بجای جواب دادن به جواب من به سوال ایشون جواب بدید و مشکلش رو حل کنید

یوسف زالی
پنج شنبه 30 بهمن 1393, 14:50 عصر
در ضمن سوال ایشون رو هم مد نظر قرار بدید و بجای جواب دادن به جواب من به سوال ایشون جواب بدید و مشکلش رو حل کنید

راهنمایی اشتباه یا نیمه کاره درست نیست و باید اصلاح بشه.
وب سرویس در حوزه مسیج هست؟ یا پایپ؟ عجب!
یکی از راههایی که می شد جواب داد، جواب شما بود. دلیل این که من بیشتر توضیح ندادم این بود که ببینم روش شما کار دوستمون رو راه می ندازه یا نه.
ایشون در صورت تست کردن روش شما و عدم گرفتن نتیجه درصورت مطرح کردن در همینجا، پاسخ های بیشتری خواهد گرفت.
سرنخ هایی که برشمردم هم در صورت یک جستجوی ساده معمولا به نتیجه می رسه.

امیدوارم این تاپیک هم به حاشیه کشیده نشه.
موفق باشید.