PDA

View Full Version : سوال: مقدار دهی به متغیرهای تعریف شده در یک برنامه از برنامه ی دیگر



جواد ملاولی
شنبه 16 بهمن 1389, 22:51 عصر
سلام. با دستور sendmessage میشه به فرمها و اشیاء برنامه های مختلف پیام فرستاد و کارهای مختلفی انجام داد. می خوام ببینم میشه به متغیرهای تعریف شده در یک برنامه هم دسترسی داشت و اونها رو مقدار دهی کرد؟ مخصوصا اگه یک متغیر در فایل سورس پروژه (فایل dpr) تعریف شده باشه؟

nsco_nsco
شنبه 16 بهمن 1389, 23:42 عصر
سلام
به نظر من مقدار متغییر رو بفرست به رجیستری و بعد اون رو فرا خوانی کن در برنامه دیگر

Felony
یک شنبه 17 بهمن 1389, 00:36 صبح
سلام. با دستور sendmessage میشه به فرمها و اشیاء برنامه های مختلف پیام فرستاد و کارهای مختلفی انجام داد. می خوام ببینم میشه به متغیرهای تعریف شده در یک برنامه هم دسترسی داشت و اونها رو مقدار دهی کرد؟ مخصوصا اگه یک متغیر در فایل سورس پروژه (فایل dpr) تعریف شده باشه؟
اون دسترسی که شما تو فکرشید خیر ، ولی میتونید برای برنامتون یک Message Handler بنویسید و مقدار مورد نظر رو همراه با نام متغییر به برنامه بفرستید ( توسط SendMessage یا PostMessage ) و تو Message Handler ی که نوشتید متغییر مورد نظر رو مقدار بدید .

lord_viper
یک شنبه 17 بهمن 1389, 12:30 عصر
اگه مکان اون متغغیر رو تو حافظه بدونین میتونین با ReadProcessMemory اونو بخونین و با WriteProcessMemory اونو تغییر بدین
(دونستن مکان دقیق اون متغییر در حافظه مهمترین چیزه)

Mask
یک شنبه 17 بهمن 1389, 13:17 عصر
(دونستن مکان دقیق اون متغییر در حافظه مهمترین چیزه
چطوری باید مکانه اونو تو حافظه بدست آورد؟

lord_viper
دوشنبه 18 بهمن 1389, 09:42 صبح
با استفاده از ollydbg و تریس کردن برنامه

Felony
دوشنبه 18 بهمن 1389, 11:08 صبح
چطوری باید مکانه اونو تو حافظه بدست آورد؟

البته برای استفاده از WriteProcessMemory و ReadProcessMemory باید دسترسی های لازم رو داشته باشید .

Mahmood_M
دوشنبه 18 بهمن 1389, 19:23 عصر
شما نمی تونید در حالت معمول به متغیرهای یک Process دیگه دسترسی داشته باشید ، ولی می تونید بین دو تا برنامه ارتباط بر قرار کنید ، اگر هر دو تا برنامه رو خودتون می سازید ، از همون روشی که جناب تاجیک گفتن استفاده کنید ، به این صورت که از برنامه ی اول یک پیغام خاص رو به برنامه ی دوم می فرستید ، برنامه ی دوم پیغام رو دریافت میکنه و متناسب با پیغام ، متغیر مورد نظر رو مقدار دهی میکنه ، راههای دیگه ای هم هست مثل ایجاد یک DLL واسط که متغیر رو در خودش نگهداری کنه ولی درصد خطا رو بالا می بره ، خطاهایی مثل لود DLL به صورت همزمان توسط دو برنامه و ...
در مورد Message Handler در سایت جستجو کنید ، بحثهای زیادی انجام شده ...

موفق باشید ...

nsco_nsco
دوشنبه 18 بهمن 1389, 22:47 عصر
سلام راستی می تونی از فایل txt ویا ini استفاده کنی و از برنامه اول داده هارو بریزی توش و در برنامه دیگه بخونی اسان تر از این دیگه نمیشه مثل یک پایگاه داده موفق باشی:قلب:

BORHAN TEC
چهارشنبه 20 بهمن 1389, 19:55 عصر
سلام راستی می تونی از فایل txt ویا ini استفاده کنی و از برنامه اول داده هارو بریزی توش و در برنامه دیگه بخونی اسان تر از این دیگه نمیشه مثل یک پایگاه داده موفق باشی
این روش در موارد بسیاری جالب نیست. منظورم موقعی است که پای مسائلی از قبیل امنیت و سرعت در میان باشد. در این روشی که گفتید تمام برنامه ها باید دائم فایل را چک کنند تا از تغییرات آن مطلع شوند. البته این مشکل را هم میتوان به شکل دیگری برطرف کرد ولی برای اضافه کردن این قابلیت کوچک، برنامه زیاد پیچیده می شود که اصلاً جالب نیست.

nsco_nsco
پنج شنبه 21 بهمن 1389, 01:22 صبح
سلام من یک سبک بلد بودم که به شکل زیر هست گفتم شاید به درد بخوره این بهترین مدل در این چند ساله که تا حالا استفاده کردم
من میام در اول برنامه در رجیستری قسمتی رو تعریف می کنم مثلا با نام علی و بعد یک مقدار الکی می دم به اون زیر شاخه های رجیستری که در برنامه ها کارش دارم مثلا 50 و بعدش میام زمانی که می خوام فراخوانیش می کنم و یک مقداری بهش می دم بعدا سریع اون رو در برنامه بعدی یا جایی می خوام می خونمش و سریع دوباره عدد 50 رو پس از استفاده میریزم توش تا کسی نفهمه که کد چی بوده شاید بدردتون بخوره :قلب:

Felony
پنج شنبه 21 بهمن 1389, 09:21 صبح
سلام من یک سبک بلد بودم که به شکل زیر هست گفتم شاید به درد بخوره این بهترین مدل در این چند ساله که تا حالا استفاده کردم
من میام در اول برنامه در رجیستری قسمتی رو تعریف می کنم مثلا با نام علی و بعد یک مقدار الکی می دم به اون زیر شاخه های رجیستری که در برنامه ها کارش دارم مثلا 50 و بعدش میام زمانی که می خوام فراخوانیش می کنم و یک مقداری بهش می دم بعدا سریع اون رو در برنامه بعدی یا جایی می خوام می خونمش و سریع دوباره عدد 50 رو پس از استفاده میریزم توش تا کسی نفهمه که کد چی بوده شاید بدردتون بخوره :قلب:
کارتون اشتباه بوده ، رجیستری برای ویندوز حکم یک پایگاه داده رو داره که اطلاعات پیکربندی ویندوز و برنامه ها درش ذخیره شدن ، رجیستری به عنوان یک فایل پاگاه داده بر روی دیسک سخت قرار داره ، پس سرعتش به مراتب پائین تر از حافظه اصلی هست ، شما وقتی مقدار یک متغییر رو درش ذخیره میکنید و توسط ک برنامه دیگه میخونید در همون نگاه اول میشه گفت اگر تعداد این نوشتن و خواندن های در واحد زمان زیاد بشه سرعت عملیات پائین میاد و در ضمن رجیستری درگیر برنامه شما میشه و سرعت سرویس دهی رجیستری به دیگر برنامه ها و ویندوز کمتر میشه .

مشکلاتی از قبیل عدم دسترسی به نوشتن در رجیستری یا قفل بودن اون و ... بماند .

راه فنی و معقول همون هست که تو پست قبلیم ذکر کردم .

جواد ملاولی
پنج شنبه 21 بهمن 1389, 15:50 عصر
اون دسترسی که شما تو فکرشید خیر ، ولی میتونید برای برنامتون یک Message Handler بنویسید و مقدار مورد نظر رو همراه با نام متغییر به برنامه بفرستید ( توسط SendMessage یا PostMessage ) و تو Message Handler ی که نوشتید متغییر مورد نظر رو مقدار بدید .


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


راه فنی و معقول همون هست که تو پست قبلیم ذکر کردم .
خیلی ممنون از لطف دوستان؛
همونطور که در پست اول گفتم، من اون متغیر رو در فایل سورس پروژه (فایل dpr) تعریف کردم و برنامه به محض اجرا و قبل از اینکه هیچ کدوم از فرمها رو بسازه، باید طبق اون متغیر یه تصمیمی بگیره؛ بنابراین هنوز فرمی وجود نداره که من بتونم هندلش رو بدست بیارم و بعد بهش پیام بدم. چکار باید بکنم؟

lord_viper
پنج شنبه 21 بهمن 1389, 18:07 عصر
خیلی ممنون از لطف دوستان؛
همونطور که در پست اول گفتم، من اون متغیر رو در فایل سورس پروژه (فایل dpr) تعریف کردم و برنامه به محض اجرا و قبل از اینکه هیچ کدوم از فرمها رو بسازه، باید طبق اون متغیر یه تصمیمی بگیره؛ بنابراین هنوز فرمی وجود نداره که من بتونم هندلش رو بدست بیارم و بعد بهش پیام بدم. چکار باید بکنم؟
میتونین ازپارامتر استفاده کنین و از POaramstr و ParaCount استفاده کنین
یا share Memory استفاده کنین و یک بخش از حافظه رو به اشتراک بزارین
نیازی به فورم هم ندارین

جواد ملاولی
پنج شنبه 21 بهمن 1389, 22:43 عصر
میتونین ازپارامتر استفاده کنین و از POaramstr و ParaCount استفاده کنین
یا share Memory استفاده کنین و یک بخش از حافظه رو به اشتراک بزارین
نیازی به فورم هم ندارین
من تا حالا از اینها استفاده نکردم، اگه ممکنه بیشتر توضیح بدید؛ یا کد نمونه ای...

Felony
جمعه 22 بهمن 1389, 07:31 صبح
خیلی ممنون از لطف دوستان؛
همونطور که در پست اول گفتم، من اون متغیر رو در فایل سورس پروژه (فایل dpr) تعریف کردم و برنامه به محض اجرا و قبل از اینکه هیچ کدوم از فرمها رو بسازه، باید طبق اون متغیر یه تصمیمی بگیره؛ بنابراین هنوز فرمی وجود نداره که من بتونم هندلش رو بدست بیارم و بعد بهش پیام بدم. چکار باید بکنم؟
دلفی برای این قبیل کارها 2 تا تابع در اختیارتون میزاره یکی AllocateWindow که یک پنجره نامرعی میسازه و هندلش رو بهتون میده و میتونید بهش پیغام ارسال کنید و ... ؛ خود شئ تایمر در دلفی هم همین کار رو میکنه ، یک پنجره مخفی میسازه و پیغام WM_Timer رو باهاش بررسی میکنه ، یک تابع دیگه هم با نام DeallocateWindow که حافظه گرفته شده توسط شئ پنجره ساخته شده رو آزاد میکنه .

در مورد ParamCount و ParamStr هم برنامتون به وسیله پارامترها اجرا میشه و موقعی کاربرد داره که برنامتون هنوز اجرا نشده و شما پارامتر n رو بهش پاس میدید و با توجه به پارامتر اجراش میکنید ، موقعی که برنامه در حال اجر باشه کاربردی نداره .