PDA

View Full Version : حرفه ای: اجرای یک فایل EXE فقط توسط یک برنامه خاص



ace_sina
پنج شنبه 29 دی 1390, 14:24 عصر
سلام دوستان
فرض کنید یک برنامه Main داریم که یک سری از برنامه ها که به صورت جدا هستن در مواقع نیاز باید اونا رو اجرا کن. من میخواستم که این برنامه ها فقط توسط برنامه Main باز بشه و در حالت عادی به هیج وجه قابلیت اجرا شدن نداشته باشه . چطوری باید این برنامه ها رو برای اجرا فقط منوط به برنامه Main کنیم فقط ؟

m2_farzan
پنج شنبه 29 دی 1390, 14:49 عصر
سلام.

پیشنهاد من اینه که برنامه ی باز شونده رو طوری تنظیم کنید که یک پارامتر بگیره و اون رو با رمزی که شما تعیین می کنید مقایسه کنه. اگه برابر رمز بود، برنامه اجرا بشه وگرنه اجرا نشه.

حالا هروقت میخواید با برنامه ی Main اون رو باز کنید باید اون پارامتر رمز رو برای برنامه بفرستید تا باز بشه.

امیدوارم منظور رو رسونده باشم

debugger
پنج شنبه 29 دی 1390, 14:51 عصر
این اتفاق به شرطی می افتد که هم برنامه اول هم برنامه ی دوم را خود شما نوشته باشید .

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

این کار مستلزم اینه که ماشین حساب را هم شما نوشته باشید

اونقت با پاسکاری بین دو برنامه و چک کردن یک مقدار bool براحتی میشه این کار را انجام داد

m2_farzan
پنج شنبه 29 دی 1390, 15:08 عصر
این اتفاق به شرطی می افتد که هم برنامه اول هم برنامه ی دوم را خود شما نوشته باشید .

آره، منظور من هم همین بود، اگه برنامه قبلا کامپایل شده باشه که نمیشه بهش گفت که با پارامتر خاصی اجرا بشه. مگر این که سیستم عامل رو بخوای بپیچونی که اونجوری پدرت در میاد.

یه راه بد هم هست و اون اینه که یواشکی برنامه اصلی رو به یک مکان دیگه (که ترجیحا شلوغ هم باشه مثل system32) منتقل کنید و یک برنامه جاش بگذارید که پارامتر رو چک کنه و اگه درست بود برنامه اصلی اجرا بشه. البته این راه خوبی نیست مگر این که شما تمام پارامترها رو از برنامه ی اجرا کننده به برنامه اصلی منتقل کنید. وگرنه ممکنه امکاناتی که به پارامتر وابسته اند مثل Open with از کار بیفتن.

nasser115
پنج شنبه 29 دی 1390, 15:24 عصر
میتونی برنامه های جانبی رو به صورت dll در بیاری و تو پروژه main صداشون بزنی

ace_sina
پنج شنبه 29 دی 1390, 15:38 عصر
خیلی ممنون دوستان . نکته اول اینه که همه ی برنامه ها رو خودم نوشتم و نکته دوم اینه که همه ی فایل ها exe هستن . نمیخوام به صورت dll باشن . میشه راهنماییم کنین که چطوری میشه بین دو فایل exe پارامتر اسال کرد ؟ مشکل من الآن همین جاست که نمیدونم چطوری باید برنامه ی باز شونده پارامتر رو دریافت کنه و در صورت تطابق الگویی که مد نظرمه خودش رو run کنه و در غیراین صورت اجراش متوقف بشه .

m2_farzan
پنج شنبه 29 دی 1390, 16:31 عصر
خوب پس منظور رو گرفتی.

حالا داخل برنامه اجرا شونده در سمت راست ویژوال استودیو داخل solution explorer ، فایل Program.cs رو پیدا کن و روش دابل کلیک کن. حالا اگه داخل این کد توجه کنی، یک متد به نام main قرار داره. پارامتر های اون که یک آرایه از رشته هستند، درواقع همون پارامتر ها هستند.

برای فراخواندن یک فایل exe با پارامتر هم باید داخل Command prompt بعد از اسم برنامه یک فاصله بگذاری و بعد پارامتر رو بنویسی. همین کار رو با کد بکن.

m2_farzan
پنج شنبه 29 دی 1390, 16:46 عصر
برای باز کردن یک فایل exe با پارامتر، از این متد استفاده کن:

private static void run_prog(string program, string argument)
{

ProcessStartInfo info = new ProcessStartInfo(program, argument);

info.RedirectStandardOutput = true;

info.UseShellExecute = false;

info.CreateNoWindow = true;

Process p = new Process();

p.StartInfo = info;

p.Start();
}

توجه: یادت باشه اول فضای نام System.Diagnostics رو با دستور using اضافه کنی

ace_sina
پنج شنبه 29 دی 1390, 18:00 عصر
مطلب رو گرفتم ، فقط در برنامه ی باز شونده کجای متد ()Main باید پارامتر رو ست کنم ؟ ممنون

arefba
پنج شنبه 29 دی 1390, 18:06 عصر
اگه اشتباه نکنم باید از اینجا به بعدش رو از api های ویندوز استفاده کنی

ace_sina
پنج شنبه 29 دی 1390, 18:17 عصر
فک نکنم نیازی به API باشه ، خوده سی شارپ این امکان رو باید داشته باشه .

debugger
پنج شنبه 29 دی 1390, 22:00 عصر
صبر کن من یه سورس دارم دارم هارد 1 ترابایتی را جستجو می کنم تا برات اپلود کنم

ace_sina
پنج شنبه 29 دی 1390, 22:51 عصر
خیلی ممنون :X

m2_farzan
پنج شنبه 29 دی 1390, 23:02 عصر
اگه اشتباه نکنم باید از اینجا به بعدش رو از api های ویندوز استفاده کنی

نیازی به این کار نیست؛ کافیه داخل بخش پارامتر های Main عبارت string[] args رو بنویسید. یعنی تابع Main از این شکل:

static void Main() . . .

به این شکل در بیاد:

static void Main(string[] args) . . .

حالا شما به تابع Main یک پارامتر به نام args اضافه کردید که در واقع یک آرایه از string حاوی آرگومان های ارسال شده به برنامه هست

موفق باشید

ace_sina
پنج شنبه 29 دی 1390, 23:27 عصر
درسته ، ولی در برنامه Main که میخوایم توسط تابع زیر برنامه رو باز کنیم ، در نمونه سازی کلاس ProcessStartInfo نمیشه آرایه رو بهش پاس داد ، فقط باید از نوعه استرینگ باشه . از طرفی هم در برنامه ای هم که باید باز بشه نمیشه در تعریف تابع ()main آرگومان استرینگ فرستاد و باید از نوعه آرایه باشه ! حالا با توجه به اینکه یه آرایه به عنوان پارامتر در تابع main تعریف کردیم چه شکلی باد در برنامه اصلی دستور اجرا برنامه فرعی رو بدیم ؟

private static void run_prog(string program, string argument)
{

ProcessStartInfo info = new ProcessStartInfo(program, argument);

info.RedirectStandardOutput = true;

info.UseShellExecute = false;

info.CreateNoWindow = true;

Process p = new Process();

p.StartInfo = info;

p.Start();
}

debugger
جمعه 30 دی 1390, 00:24 صبح
فایل اجرایی برنامه را از داخل پوشه ی debug دو بار اجرا کنید و بعد روی دکمه ی send message کلیک کنید

reza_mostafavi63
جمعه 30 دی 1390, 00:43 صبح
با استفاده از سوكت پروگرمينگ ميتوني هر چند تا كه ميخواي پارامتر بفرستي حتي بعد از اجرا و هنگام كار برنامه . مثلا پارامترها رو به پورت 127.0.0.1:5520 بفرست .

راه حل حرفه اي (Windows Communication Foundation) یا به اختصار WCF هستش . تحقيق در موردش به عهده خودت .

m2_farzan
جمعه 30 دی 1390, 09:49 صبح
بخشید که دیشب نتونستم پاسخ بدم


درسته ، ولی در برنامه Main که میخوایم توسط تابع زیر برنامه رو باز کنیم ، در نمونه سازی کلاس ProcessStartInfo نمیشه آرایه رو بهش پاس داد ، فقط باید از نوعه استرینگ باشه . از طرفی هم در برنامه ای هم که باید باز بشه نمیشه در تعریف تابع ()main آرگومان استرینگ فرستاد و باید از نوعه آرایه باشه ! حالا با توجه به اینکه یه آرایه به عنوان پارامتر در تابع main تعریف کردیم چه شکلی باد در برنامه اصلی دستور اجرا برنامه فرعی رو بدیم ؟

یادم رفت اشاره کنم. شما اگه برنامه رو اجرا کنید و دو آرگومان x و y رو به این شکل به اون بفرستید:

run_prog("notepad.exe","x y");

البته: در واقعیت نوتپد معنای این آرگومان ها رو نمیفهمه؛ این فقط یک مثاله.

و در برنامه اجرا شونده دو پارامتر x و y در قالب یک آرایه ی 2 عضوی ارسال می شوند که عضو 0م آن "x" و عضو 1م آن "y" است.

برای فهم بیشتر یک پروژه رو برات آپ خواهم کرد . . .

m2_farzan
جمعه 30 دی 1390, 10:22 صبح
بفرما یک فایل Zip ضمیمه کردم. اول extractش کن؛ بعد برو داخلش و main_program رو اجرا کن. فقط با main_program میشه child_program رو اجرا کرد.

سورس فرم main_program:

public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
}

private void yes_arg_Click(object sender, EventArgs e)
{
string child_program_location = Environment.CurrentDirectory + @"\child_program.exe";
run_prog(child_program_location, "abc");
}

private void no_arg_Click(object sender, EventArgs e)
{
string child_program_location = Environment.CurrentDirectory + @"\child_program.exe";
run_prog(child_program_location, "");
}

private static void run_prog(string program, string argument)
{

ProcessStartInfo info = new ProcessStartInfo(program, argument);

info.RedirectStandardOutput = true;

info.UseShellExecute = false;

info.CreateNoWindow = true;

Process p = new Process();

p.StartInfo = info;

p.Start();
}

}

و این هم سورس child_program :

static void Main(string[] args)
{
if (args.Length == 0 || (args[0] != "abc"))
{
MessageBox.Show("آرگومان ها درست نیستند. با کلیک روی کلید زیر برنامه بسته خواهد شد");
Environment.Exit(0);
}
else
{
MessageBox.Show("میتوانید از برنامه استفاده کنید");
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.Run(new Form1());
}
}

برای دانلود فایل زیپ شده ، به لینک ضمیمه شده بروید.

ace_sina
جمعه 30 دی 1390, 13:10 عصر
دیشب راه حل رو پیدا کرده بودم ، دیگه وقت نکردم تو سایت بذارم که بقیه هم استفاده کنن ، دیگه شما زحمتش رو کشیدید . ممنون