PDA

View Full Version : دسترسی به اشیائ برنامه ها توسط کد نویسی



mehdi0020
یک شنبه 23 اردیبهشت 1397, 07:47 صبح
سلام روز بخیر
دوستان من میخواهم توسط برنامه ام با یک برنامه دیگه کار کنم با کد نویسی برنامه مورد نظرمو باز میکنم اما نمیدونم چطور به اشیائ اون برنامه دسترسی داشته باشم مثلا یوزر و پسورد وارد کنم و باتون لاگین یا پیام های اختمالی در برنامه OK کنم لطفا اگه کسی بلده راهنماییم کنه
ممنون

farhad_shiri_ex
یک شنبه 23 اردیبهشت 1397, 11:19 صبح
سلام روز بخیر
دوستان من میخواهم توسط برنامه ام با یک برنامه دیگه کار کنم با کد نویسی برنامه مورد نظرمو باز میکنم اما نمیدونم چطور به اشیائ اون برنامه دسترسی داشته باشم مثلا یوزر و پسورد وارد کنم و باتون لاگین یا پیام های اختمالی در برنامه OK کنم لطفا اگه کسی بلده راهنماییم کنه
ممنون

با استفاده از App Domain و Remote Method می تونید البته به شرط اینکه که Type کلاسی که Cast شده است در AppDomain فعلی وجود داشته باشد یعنی اسمبلی که برای متد CreateInstanceAndUnwrap اسمبلی برنامه فعلی باشد ویا اسمبلی مورد نظر را در AppDomain جاری نیز بارگذاری کرده باشد.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Runtime.Remoting;

namespace MyTestRemote
{
public class MyTestRemote
{
public static void Main(string[] args)
{
AppDomain thisDomain = Thread.GetDomain();
AppDomain newDomain = AppDomain.CreateDomain("NEW_DOMAIN", null, null);

RemoteClass c1 = (RemoteClass)newDomain.CreateInstanceFromAndUnwrap ("YourApp.exe", "MyTestRemote.RemoteClass");
c1.RemoteMethod();

AppDomain.Unload(newDomain);

Console.ReadKey();
}
}
public class RemoteClass : MarshalByRefObject
{
public RemoteClass()
{}
public void RemoteMethod()
{
Console.WriteLine("Remote Method is Running in This Thrad {0} ->", Thread.GetDomain().FriendlyName);
}
}
}

mehdi0020
یک شنبه 23 اردیبهشت 1397, 11:48 صبح
با استفاده از App Domain و Remote Method می تونید البته به شرط اینکه که Type کلاسی که Cast شده است در AppDomain فعلی وجود داشته باشد یعنی اسمبلی که برای متد CreateInstanceAndUnwrap اسمبلی برنامه فعلی باشد ویا اسمبلی مورد نظر را در AppDomain جاری نیز بارگذاری کرده باشد.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Runtime.Remoting;

namespace MyTestRemote
{
public class MyTestRemote
{
public static void Main(string[] args)
{
AppDomain thisDomain = Thread.GetDomain();
AppDomain newDomain = AppDomain.CreateDomain("NEW_DOMAIN", null, null);

RemoteClass c1 = (RemoteClass)newDomain.CreateInstanceFromAndUnwrap ("YourApp.exe", "MyTestRemote.RemoteClass");
c1.RemoteMethod();

AppDomain.Unload(newDomain);

Console.ReadKey();
}
}
public class RemoteClass : MarshalByRefObject
{
public RemoteClass()
{}
public void RemoteMethod()
{
Console.WriteLine("Remote Method is Running in This Thrad {0} ->", Thread.GetDomain().FriendlyName);
}
}
}


راستش از توضیحاتتون زیاد چیزی متوجه نشدم ولی این کلاس درست کردم الان باید..؟

mehdi0020
یک شنبه 23 اردیبهشت 1397, 11:50 صبح
اگه براتون امکان داره یکی بیشتر توضیح بدید البته مبتدی تر

mehdi0020
یک شنبه 23 اردیبهشت 1397, 12:32 عصر
راستش از توضیحاتتون زیاد چیزی متوجه نشدم ولی این کلاس درست کردم الان باید..؟

دوست عزیز من در مورد AppDomain یکم مطالعه کردم با فرض اینکه نرم افزار دوم در AppDomain فعلی وجود داشته باشه من چصور میتونم با کد نویسی با اشیائ اون برنامه کار کنم؟؟؟ لطفا راهنماییم کنید

danialafshari
یک شنبه 23 اردیبهشت 1397, 12:37 عصر
با سلام
میتونید از کلاس Runtime و DllImport استفاده کنید
کد زیر یک پیام رو به نوت پد میفرسته میتونین به عنوان برنامه نویس الگو بگیرین و شخصی سازیش کنید
[DllImport("user32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lp1, string lp2);


[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetForegroundWindow(IntPtr hWnd);


private void button1_Click(object sender, EventArgs e)
{
IntPtr handle = FindWindow("Notepad", "Untitled - Notepad");
if (!handle.Equals(IntPtr.Zero))
{
// activate Notepad window
if (SetForegroundWindow(handle))
{
// send "Hello World!"
SendKeys.Send("Hello World!");
// send key "Tab"
SendKeys.Send("{TAB}");
// send key "Enter"
SendKeys.Send("{ENTER}");
}
}
}

یا
[DllImport("user32.dll")] public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
const int WM_SETTEXT = 0X000C;
private void button1_Click(object sender, EventArgs e)
{
Process notepadProccess = Process.GetProcessesByName("notepad")[0];
IntPtr notepadTextbox = FindWindowEx(notepadProccess.MainWindowHandle, IntPtr.Zero, "Edit", null);
SendMessage(notepadTextbox, WM_SETTEXT, 0, "This is the new Text!!!");
}
https://social.msdn.microsoft.com/Forums/vstudio/en-US/5213874a-603e-4378-835d-f6488f382d47/how-do-i-input-to-another-application?forum=csharpgeneral
موفق باشید

farhad_shiri_ex
یک شنبه 23 اردیبهشت 1397, 13:03 عصر
در NET. برنامه ها مستقیما داخل یک پردازه اجرا نمیشن درون چیزی به نام دامنه AppDomain اجرا می شوند یک پردازه هم می تونه چندتا دامنه داشته باشه و درون هرکدوم هم می تونید یک برنامه دات نتی یا اسمبلی های مختلفی بارگذاری کنید. در حالت عادی هر برنامه دات نت یک دامنه مخصوص خوش را داره که خود CLR ایجادش میکنه بعد از دامنه اصلی می تونید دامنه های دیگه ایجاد کنید و اسمبلی هایی که می خواهید را بهشون ریموت کنید.
ابتدا توسط متد CreateDomain یک دامنه جدید ایجاد کردیم و بعد متد CreateInstanseAndUnwrap را صدا زدیم نام اسمبلی و کلاسی که می خواهیم در پردازه جاری از اون نمونه سازی کنیم را به این متد پاس میدیم وقتی این متد برمیگردد ارجاعی به یک شی واسط در دامنه جاری که واسطی بین دامنه فعلی و شی ای که در دامنه جدید ایجاد کرده اید ایجاد شده.
وقتی در دامنه جاری متدهای شی راه دور را فراخوانی میکنی نخ جاری از دامنه فعلی به دامنه جدید که ایجاد شده سوئیچ میکنه متد درخواست شده را اجرا میکنه و دوباره به دامنه فعلی برمیگرده.
خوب باالطبع خروجی متد CreateInstanseAndUnwrap هم یک Object هست برای اینکه بتونه هر شی از هر نوعی را برگردونه!!
پس برای همین اگر بخواهید از مقدار بازگشتی استفاده کنید باید cast کنید به کلاس خودتون اما در صورتی این کست انجام میشه که type کلاس شما در دامنه اصلی قرار داشته باشه.ویا اگر type کلاس در دامنه دیگری هست باید اون اسمبلی را دامنه جاری فراخوانی کنید.
والبته شی هم که به صورت object بر میگردد درحقیقت یک شی واسط (پراکسی) در دامنه فعلی هست نه شی واقعی که در دامنه جدید ایجاد شده است. یعنی شما به خود شی در دامنه جدید دسترسی ندارید به الگوی واسط پراکسی دسترسی دارید دقت داشته باشید که دامنه ها واقعا از هم مجزا هستند و هیچ راهی برای ارتباط وجود ندارد به همین علت این واسطه ایجاد می شود حتی اگر با متد getType نوع شی برگشتی را کنترل کنید مبینید که واقعا نوع کلاس هست که ریموت شده است ولی در اینجا ظاهرا CLR یکمی دروغ تحویلمون میده.
به هرحال برای استفاده از این قبیل تکنیک ها باید به مباحث نخ ها و برنامه نویسی چند نخی و همچنین به کلاسهای سیستمی دات نت کمی مسلط باشید تا مطالب مذکور برای شما قابل ادراک شود.
والبته کار سختی هم نیست فقط کمی حوصله و مطالعه بیشتر در این زمینه لازم دارد.

farhad_shiri_ex
یک شنبه 23 اردیبهشت 1397, 13:15 عصر
میتونید از کلاس Runtime و DllImport استفاده کنید
کد زیر یک پیام رو به نوت پد میفرسته میتونین به عنوان برنامه نویس الگو بگیرین و شخصی سازیش کنید

ولی با این روش شما به پردازش اون برنامه دسترسی دارید وبا استفاده از MessageHandler خود ویندوز می تونید به اون پردازش پیام ارسال کنید نمی تونید با شی ها اون پردازش کار کنید یعنی حداقل من کار نکردم با کلاس Process ولی در الگوی Proxy دامنه ها شما امکان Remoteing دارید به پردازه در یک نخ دیگر و قدرت انعطاف خیلی زیادی خواهید داشت.

farhad_shiri_ex
یک شنبه 23 اردیبهشت 1397, 14:37 عصر
دوست عزیز من در مورد AppDomain یکم مطالعه کردم با فرض اینکه نرم افزار دوم در AppDomain فعلی وجود داشته باشه من چصور میتونم با کد نویسی با اشیائ اون برنامه کار کنم؟؟؟ لطفا راهنماییم کنید

اگر منظور به یک برنامه ای است که از متدهاش اطلاع ندارید با این روشی که گفتم نمیتونید بهش وصل بشید باید از کلاس Process استفاده کنید ولی باز هم مطمئن باشید کاری که شما می خواهید که مثلا روی یک دکمه کلیک کنید نمی تونید انجام بدید برای اطلاع بیشتر هم می تونید تو MSDN نحوه کار با Windows Message Handler و استفاده از نماینده های این سرویس که برای خود ویندوز هست مطالعه کنید.

mehdi0020
دوشنبه 24 اردیبهشت 1397, 09:08 صبح
در NET. برنامه ها مستقیما داخل یک پردازه اجرا نمیشن درون چیزی به نام دامنه AppDomain اجرا می شوند یک پردازه هم می تونه چندتا دامنه داشته باشه و درون هرکدوم هم می تونید یک برنامه دات نتی یا اسمبلی های مختلفی بارگذاری کنید. در حالت عادی هر برنامه دات نت یک دامنه مخصوص خوش را داره که خود CLR ایجادش میکنه بعد از دامنه اصلی می تونید دامنه های دیگه ایجاد کنید و اسمبلی هایی که می خواهید را بهشون ریموت کنید.
ابتدا توسط متد CreateDomain یک دامنه جدید ایجاد کردیم و بعد متد CreateInstanseAndUnwrap را صدا زدیم نام اسمبلی و کلاسی که می خواهیم در پردازه جاری از اون نمونه سازی کنیم را به این متد پاس میدیم وقتی این متد برمیگردد ارجاعی به یک شی واسط در دامنه جاری که واسطی بین دامنه فعلی و شی ای که در دامنه جدید ایجاد کرده اید ایجاد شده.
وقتی در دامنه جاری متدهای شی راه دور را فراخوانی میکنی نخ جاری از دامنه فعلی به دامنه جدید که ایجاد شده سوئیچ میکنه متد درخواست شده را اجرا میکنه و دوباره به دامنه فعلی برمیگرده.
خوب باالطبع خروجی متد CreateInstanseAndUnwrap هم یک Object هست برای اینکه بتونه هر شی از هر نوعی را برگردونه!!
پس برای همین اگر بخواهید از مقدار بازگشتی استفاده کنید باید cast کنید به کلاس خودتون اما در صورتی این کست انجام میشه که type کلاس شما در دامنه اصلی قرار داشته باشه.ویا اگر type کلاس در دامنه دیگری هست باید اون اسمبلی را دامنه جاری فراخوانی کنید.
والبته شی هم که به صورت object بر میگردد درحقیقت یک شی واسط (پراکسی) در دامنه فعلی هست نه شی واقعی که در دامنه جدید ایجاد شده است. یعنی شما به خود شی در دامنه جدید دسترسی ندارید به الگوی واسط پراکسی دسترسی دارید دقت داشته باشید که دامنه ها واقعا از هم مجزا هستند و هیچ راهی برای ارتباط وجود ندارد به همین علت این واسطه ایجاد می شود حتی اگر با متد getType نوع شی برگشتی را کنترل کنید مبینید که واقعا نوع کلاس هست که ریموت شده است ولی در اینجا ظاهرا CLR یکمی دروغ تحویلمون میده.
به هرحال برای استفاده از این قبیل تکنیک ها باید به مباحث نخ ها و برنامه نویسی چند نخی و همچنین به کلاسهای سیستمی دات نت کمی مسلط باشید تا مطالب مذکور برای شما قابل ادراک شود.
والبته کار سختی هم نیست فقط کمی حوصله و مطالعه بیشتر در این زمینه لازم دارد.

سلام صبح بخیر ممنون از راهنماییتون متاسفانه موفق نشدم RemoteClass c1 = (RemoteClass)newDomain از این خط خطا میگیره

mehdi0020
دوشنبه 24 اردیبهشت 1397, 09:34 صبح
سلام کسی میتونه کمکم کنه؟ میخواهم با برنامه ام یه نرم افزار رو اجرا کنم بعد از چند تایید پیام اطلاعات لاگین وارد کنه و باتون باتون بزنه کسی میتونه کمکم کنه؟ تا الان فقط تونستم نرم افزار مورد نیازمو باز کنم چطور به کادرهای محاوره ای پاسخ بدم و لاگین کنم مشکل دارم:افسرده:

mehdi0020
سه شنبه 25 اردیبهشت 1397, 11:24 صبح
:متفکر::متفکر::متفکر::متفکر:: تفکر::متفکر::متفکر::متفکر: