سلام
من یک فایل اجرایی در فاکس پرو نوشتم که خروجی آن یک رشته 10 حرفی می باشد. چطور میتوانم فایل مورد نظر را در دلفی فراخوانی کنم و رشته خروجی آن را مورد استفاده قرار دهم. لطفا راهنمایی فرمایید.
Printable View
سلام
من یک فایل اجرایی در فاکس پرو نوشتم که خروجی آن یک رشته 10 حرفی می باشد. چطور میتوانم فایل مورد نظر را در دلفی فراخوانی کنم و رشته خروجی آن را مورد استفاده قرار دهم. لطفا راهنمایی فرمایید.
رشته رو میتونید به سه روش کلی در دلفی فراخوانی کنید
خواندن از حافظه، خواندن از فایل و استفاده از پایپ
برای خواندن از حافظه لازمه بتونید از مسیج استفاده کنید و خروجی رو با فاکسپرو بصورت مسیج به ویندوز بدید و دائما مسیجهای ویندوز رو در دلفی مانیتور کنید
خواندن از فایل راحتتره اما با سرعت کمتری انجام میشه
یک راه دیگه که در نسخه های بالاتر انجام میشه استفاده از 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;
روشها بیشتر از سه تاست. مثلا استفاده از حافظه اشتراکی، استفاده از جدول اتم ها، استفاده از سوکت، استفاده از رجیستری، استفاده از سرویس های وب، استفاده از خروجی بصورت export یک تابع، نوشتن روی عناصر برنامه میزبان، تجاوز به منطقه حافظه برنامه میزبان، و روشهای بسیار دیگه.نقل قول:
رشته رو میتونید به سه روش در دلفی فراخوانی کنید
این روش اسمش ارسال مسیج هست نه خواندن از حافظه.نقل قول:
برای خواندن از حافظه لازمه بتونید از مسیج استفاده کنید
دائما لازم نیست، کافیه به هندل برنامه مقصد پیام ارسال بشه، و اونجا براش رویدادی نوشته بشه.نقل قول:
دائما مسیجهای ویندوز رو در دلفی مانیتور کنید
همچنین می شه پیام رو به تمام برنامه های سیستم BroadCast کرد.
دکتر شریعتی در یکی از سخنرانی هاش می گه:
سخنور خوب میگه روشهای فلان کار اینهاست، و اونها رو تا جایی که بلده می شمره، و اگر چیزی یادش رفت یا از قلم افتاد، به کسی برنمی خوره.
سخنور بد میگه روشهای فلان کار این 5 تاست (مثلا) و با این کار متعهد می شه 5 مورد رو شرح بده. حالا اگر موردی یادش بره یا بفهمه تعداد روشها 5 تا نبوده، خودش رو زیر سوال برده.
:بامزه:
سلام دوست عزیز
روشهایی که فرمودید در همین سه روش کلی که عرض کردم گنجونده میشه
مثلا: استفاده از حافظه اشتراکی و جاوز به منطقه حافظه برنامه میزبان و استفاده از خروجی بصورت export یک تابع => خواندن از حافظه
یا مثلا استفاده از رجیستری در حوزه خواندن از فایل قرار میگیره
و مثلا استفاده از وب سرویس و سوکت در حوزه مسیج و پایپ قرار داره
در ضمن سوال ایشون رو هم مد نظر قرار بدید و بجای جواب دادن به جواب من به سوال ایشون جواب بدید و مشکلش رو حل کنید
راهنمایی اشتباه یا نیمه کاره درست نیست و باید اصلاح بشه.نقل قول:
در ضمن سوال ایشون رو هم مد نظر قرار بدید و بجای جواب دادن به جواب من به سوال ایشون جواب بدید و مشکلش رو حل کنید
وب سرویس در حوزه مسیج هست؟ یا پایپ؟ عجب!
یکی از راههایی که می شد جواب داد، جواب شما بود. دلیل این که من بیشتر توضیح ندادم این بود که ببینم روش شما کار دوستمون رو راه می ندازه یا نه.
ایشون در صورت تست کردن روش شما و عدم گرفتن نتیجه درصورت مطرح کردن در همینجا، پاسخ های بیشتری خواهد گرفت.
سرنخ هایی که برشمردم هم در صورت یک جستجوی ساده معمولا به نتیجه می رسه.
امیدوارم این تاپیک هم به حاشیه کشیده نشه.
موفق باشید.