الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

فتح ملف تنفيذى من خلال برنامجى مع عدم امكا

بدأه meshmesh5u في 4 يونيو 2008 · 17 رد · 1,594 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لو سمحتم يا شاباب

لدى مشروعين الأول ( Main ) و الثانى (Sub )

1- اريد فتح البرنامج sub من خلال البرنامج main .

2- عدم امكانية فتح البرنامج Sub منفردا .

أى لايمكن أن يعمل البرنامج Sub إلا من خلال البرنامج main

ارجو ارفاق الكود بمثال

و جزاكم الله كل الخير

#2

السلام عليكم

اقتباس
ارجو ارفاق الكود بمثال

أنا هديك الفكرة و الكلاسة الخاصة بكده وانت جرب وورينا الحل و المشاكل الي هتقابلك

بس متطلبش كود علطول

الكلاسة اسمها

Process

الفانكشن

Process.Start("Write the sub exe path here to run");

هتتطر تضيف النيم اسبيس الى اسمه

using System.Diagnostics;

ودور في الMSDN

ولمما تقابلك مشاكل في طريقة الاستخدام قول لنا

وان شاء الله هنساعدك

IT'S EASY, IF YOU TRY

#3

يا عزيزى انا اعرف الكود اللى بيفتح اى ملف تنفيذى من خلال المشروع بتاعى

System.Diagnostics.Process s = new System.Diagnostics.Process();

s.StartInfo.FileName ="C:\\meshmesh.exe";

s.Start();

بس النقطة اللى بسأل فيها هوا ازاى ان البرنامج التانى ميفتحش لوحده يعنى لازم يفتح من خلال المشروع الرئيسى فقط

و الفكرة دى انا شفتها بالفعل فى برنامج بس مش قادر اعملها

ياريت اللى عنده حل يقولى

#4

طيب انا عندي فكرة

قم بعم بارامتر في البرنامج الفرعي داخل دالة الmain ، مثلا عندما تقوم بفتح البرنامج من البرنامج الريئسي ، ترسل parameter ، مثلا 123456

و في الدالة الmain ، للبرنامج الفرعي ، تقوم بعمل ، if ، والتاكد من ان هناك بارامتر مرسل عند تنفيذ البرنامج و بقيمة معينة

System.Diagnostics.Process s = new System.Diagnostics.Process();
			s.StartInfo.FileName = "C:\\meshmesh.exe";
			s.StartInfo.Arguments = "123456"
			s.Start();

static void Main(string[] arg)
		{
			if (arg.Length = 2 && arg[1] = "123456")
			{
				Application.EnableVisualStyles();
				Application.SetCompatibleTextRenderingDefault(false);
				Application.Run(new Form1());
			}
		}

تم تعديل هذه المشاركة بواسطة yasirhantoush في 5 يونيو 2008 في 08:52

#5

C:\Documents and Settings\Ahmed\Desktop\sub\Form1.cs(66): Operator '&&' cannot be applied to operands of type 'int' and 'string'

الخطأ ده ظهرلى فى البرنامج الفرعى

#6

عفوا ، حط == بدل = في جملة ال if

if (arg.Length == 2 && arg[1] == "123456")
#7

و الله ما قصرت ألف شكر ليك

بس انا جرب الطريقة دى و البرنامج الفرعى مفتحش فعلا

ياريت لو تجربها بنفسك و تساعدنى فى المشكلة دى

أكون شاكر جدا

على فكرة انا شغال بفيجوال ستوديو 2000

تم تعديل هذه المشاركة بواسطة meshmesh5u في 6 يونيو 2008 في 00:24

#8

لم افهم ، البرنامج الفرعي يجب ان لا يفتح لوحده ، لكن يفتح عن طريق البرنامج الرئيسي فقط،

هل الكود اعلاه يعمل بهذه الطريقة ام به خلل ؟؟

#9

static void Main(string[] arg)

{

if (arg.Length = 2 && arg[1] = "123456")

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new Form1());

}

}

لو شغلت الكود ده مبيفتحش اى شئ لما تنفذ F5

فبكدا من البرنامج الرئيسى لما ننفذه مبيفتحش البرنامج الفرعى

ارجو اضافتى على الايميل meshmesh5u @ yahoo . hotmail . skype

#10

ان شاء الله انا جربت فكرة بسيطة ونجحت وممكن انت تضيف عليها

مشروع الـ Main

namespace Main_Sub
{
	public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();
		}

		private void Form1_Load(object sender, EventArgs e)
		{
			System.IO.File.Create(@"C:\koko.txt");
		}

		private void Form1_FormClosed(object sender, FormClosedEventArgs e)
		{
			System.IO.File.Delete(@"C:\koko.txt");
		}

	}
}

المشروع التانى الـ Sub

namespace Sub
{
	public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();
		}

		private void Form1_Load(object sender, EventArgs e)
		{
		 bool b=   System.IO.File.Exists (@"C:\koko.txt");
		 if (b == false)
			 this.Close();
		}
	}
}

كما ترى كل مرة البرنامج الفرعى لن يعمل الا اذا كان موجود ملف معين "koko"

والذى يتم انشائه من قبل البرنامج الاصلى

#11

هل وضعت الكود هذا في البرنامج الرئيسي ، لابد من اضافة سطر الs.StartInfo.Arguments = "123456" ، قبل تنفيذ البرنامج الفرعي

System.Diagnostics.Process s = new System.Diagnostics.Process();
			s.StartInfo.FileName = "C:\\meshmesh.exe";
			s.StartInfo.Arguments = "123456"
			s.Start();

حاول اعمل debugging ، مثلا ، شوف محتويات الstring[] arg ، او حاول اطبعها في console app

العب في الـ arg[1] ، غيرها الي arg[2] او arg[0] ، انا حاجرب البرنامج و ارجع ليك

#12

أرى أن فكرة البارامترات أفضل من فكرة الملف النصي

فمن الممكن أن يتم إغلاق البرنامج الرئيسي بواسطة إدارة المهام , فلا يتم تنفيذ كود حذف الملف وبذلك يبقى الملف النصي موجود رغم إغلاق البرنامج الرئيسي

أما طريقة البارامترات فأنا أستخدمها دائما في مثل هذه الحالات خصوصاً في برامج التحديثات

وكود البارامترات هكذا أفضل لتجنب أي خطأ محتمل :


{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

if (arg!=null && arg.Length>0 && arg[0] == "123456")
{
Application.Run(new Form1());
}
else
{
MessageBox.Show("لا يمكن تشغيل البرنامج منفرداً");
Application.Exit();
}
}
static void Main(string[] arg)

بالتوفيق

..

تم تعديل هذه المشاركة بواسطة Desert_Eagle في 7 يونيو 2008 في 16:42

#13

ممكن اخى الكريم تشرح لنا موضوع استخدام البارمترات

لانه جديد بالنسبة لى

وجزاك الله خيرا

#14

تلك الشيفرة تقوم بأرسال Process ID للـ Launch.exe إلي Main.exe الذي نقوم بتشغيلة عن طريق arguments

// Launch.cs
// Compile : CSC /t:winexe /debug Launch.cs

namespace Customize_Launch_Application
{
	using System.Diagnostics;

	static class LaunchProcess
	{
		static void Main()
		{
			// Run child application from path
			Process.Start(
				new ProcessStartInfo(".\\Main.exe",
					// Get current process ID and add to arguments 
					Process.GetCurrentProcess().Id.ToString())).WaitForExit();
		}
	}
}

في هذة الشيفر تستقبل القيم المرسلة من Launch.exe

// Main.cs
// Compile : CSC /t:winexe /debug Main.cs

using System;
using System.Windows.Forms;
using System.Diagnostics;

namespace Customize_Launch_Application
{
	static class MainProcess
	{
		static void Main(string[] args)
		{
			Application.EnableVisualStyles();

			if (args.Length == 1)
			{
				int pID = int.TryParse(args[0], out pID)? pID : 0;
				if(pID > 0){
					Process p = Process.GetProcessById(pID);
					if(p != null){
			   			MessageBox.Show(
				   			string.Format("Run by \"{0}.exe\"", p.ProcessName), "Main Process", 
				   			MessageBoxButtons.OK, 
				   			MessageBoxIcon.Information);
				   		return;
			   		} 
		   		}
			}

			MessageBox.Show("Run without \"Launch.exe\"", "Main Process", 
				   			MessageBoxButtons.OK, 
				   			MessageBoxIcon.Error);
		}
	}
}

الان يمكن تحليل بيانات Launch.exe من خلال System.Reflection.Assembly

مواضيع متنوعة

#15

اشكرك جدا يا Moudey و جزاك الله كل الخير

بس عندى ظهر خطأ فى السطر ده

int pID = int.TryParse(args[0], out pID)? pID : 0;

فى

TryParse

علما بأنى استخدم فيجوال ستوديو 2000

#16
int pID = int.Parse(args[0]); // or System.Convert.ToInt32(args[0]);

مواضيع متنوعة

#17

فعلا اخى استخدمت الكود الأخير و شتغل معايا

و فعلا الكود ده ممتاز وأفضل من البارمترز

شكرا جزيلا لك و جزاك الله كل الخير

وبعد اذنك لو وقف فى ايدى حاجة فى البرمجة اراسلك

و على ايديكم نتلقى العلم

شكرا مرة أخرى لك

#18

السلام عليكم,

بالفعل تم استخدم البارامترات "parameters" والموضح في في رأس الدالة Main من في الملف Main.cs والذي يأخذ شكل مصفوفة نصية اسمة args.

أرجو منك محاولة البحث عن كيفية التعامل معها.

اقتباس
وبعد اذنك لو وقف فى ايدى حاجة فى البرمجة اراسلك

أعتقد ان المنتدي افضل لآنك ستجد اجابات متعددة كما تري في موضوعك هذا.

مواضيع متنوعة

مواضيع مشابهة