View Full Version : سوال: چطور می شه یک رشته را بین دو برنامه جابجا کرد؟
یوسف زالی
شنبه 18 تیر 1390, 05:03 صبح
سلام.
اگر بخواهیم که یک رشته رو از یک برنامه به برنامه ی دیگه بفرستیم چطور می تونیم این کارو کنیم؟
البته بدون استفاده از فایل - رجیستری و تایمر.
ممنون میشم اگر در این رابطه هم کمکم کنید.
Felony
شنبه 18 تیر 1390, 06:18 صبح
اگر هدفتون فقط ارسال یک رشته هست میتونید یک پیغام خاص در ویندوز رجیستر کنید و رشته مورد نظر رو با تابع SendMessage یا PostMessage به برنامه مقصد بفرستید و در برنامه مقصد Default Message Handler رو Override کنید و وقتی پیغام رو دریافت کردید ازش رشته رو اسخراج کنید که در این صورت برنامه مقصد باید حتما فرم داشته باشه ، مثلا :
در قسمت Public فرم برنامه :
WM_MyString: Cardinal;
تو رویداد OnCreate فرم برنامه :
WM_MyString:= RegisterWindowMessage('WM_MyString');
ارسال متن به پنجره مورد نظر :
var
Str: string;
begin
str:= 'Mojtaba';
SendMessage(Handle, WM_MyString, Integer(str), 0);
end;
Override کردن Message Handler در برنامه مقصد :
در قسمت Private کلاس فرم برنامه :
Procedure WNDProc(var Message: TMessage); Override;
procedure TForm1.WNDProc(var Message: TMessage);
begin
if Message.Msg = WM_MyString then
Caption:= String(Message.WParam);
inherited;
end;
اما اگر هدف تبادل اطلاعات با حجم بیشتری از یک رشته هست بهترین راه استفاده از Maped Memory Files هست که تو MSDN در موردش مفصلا بحث شده .
یوسف زالی
شنبه 18 تیر 1390, 12:58 عصر
ممنون از راهنماییتون.
منظور من انتقال یک رشته هست که تو کد شما بهش اشاره شده.
یوسف زالی
شنبه 18 تیر 1390, 16:09 عصر
به مشکل برخوردم .
در استفاده از اون با SendMessage پیغام دریافت نمی شد اما با PostMessage میشد!!
در هنگام بیرون کشیدن پیغام AV می گیرم.
اگر یک برنامه ساده برام بگذارید ممنون می شم.
Mahmood_M
شنبه 18 تیر 1390, 18:14 عصر
در استفاده از اون با SendMessage پیغام دریافت نمی شد اما با PostMessage میشد!!
SendMessage (http://msdn.microsoft.com/en-us/library/ms644950.aspx)
Sends the specified message to a window or windows. The SendMessage function calls the window procedure for the specified window and does not return until the window procedure has processed the message.
To send a message and return immediately, use the SendMessageCallback or SendNotifyMessage function. To post a message to a thread's message queue and return immediately, use the PostMessage or PostThreadMessage function.
PostMessage (http://msdn.microsoft.com/en-us/library/ms644944%28VS.85%29.aspx)
Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.
To post a message in the message queue associated with a thread, use the PostThreadMessage function.
Message Routing (http://msdn.microsoft.com/en-us/library/ms644927.aspx#routing)
مشاهده ی این مقاله (http://delphi.about.com/od/windowsshellapi/a/wm_copydata.htm) می تونه مفید باشه
موفق باشید ...
Mahmood_M
شنبه 18 تیر 1390, 20:04 عصر
در هنگام بیرون کشیدن پیغام AV می گیرم.
دلیل نمایش AV اینه که شما آدرس حافظه ی رشته رو ارسال میکنید ، نه خود رشته رو !
این دستور
Integer(str)
شماره ی خانه ی حافظه ی مربوط به متغیر Str رو در خودش ذخیره میکنه ، مثل این می مونه که String رو به Pchar تبدیل کرده باشید و اون رو بفرستید
در برنامه ی گیرنده هم وقتی می خواید این آدرس حافظه رو به رشته تبدیل کنید ، برنامه رشته ای در آدرس مورد نظر پیدا نمی کنه چون در فضای حافظه ی دیگه ای قرار داره ! ( توجه کنید که دو Process جدا ، فضای حافظه ی جدایی دارند )
روش بالا فقط برای ارسال رشته بین Window های " یک " Process مناسب هست ، برای ارسال رشته بین دو Process بهتره از همون روشی که لینکش رو قرار دادم استفاده کنید
همچنین می تونید از Atom Table استفاده کنید ، در این مقاله (http://barnamenevis.org/showthread.php?209445-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%81%D9%82%D8%B7-%DB%8C%DA%A9-%D8%A8%D8%A7%D8%B1-%D8%AF%D8%B1-%D9%87%D8%B1-%D8%A8%D8%A7%D8%B1-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2-!) نحوه ی نوشتن و خواندن در این جدول آموزش داده شده
موفق باشید ...
loo30fer
شنبه 18 تیر 1390, 21:37 عصر
حالا که بحث SendMessage شد جا داره منم یک سوال بپرسم اینم اینکه چطور میتونم یک اسکریپت رو تو بیلدر با تابع SendMessage اجرا کنم یک نمونه کدش رو پیدا کردم فقط مشکل اینه که برای ++C هست و من با ++C کار نکردم ممنون میشم این کد رو برام تبدیل کنید . با تشکر
SendMessage(m_pParent, WM_RUNSCRIPTCODE, RUNSCRIPTCODE_QUIET, LPARAM("RunScript(\"event_handler\")"));
اینهاش رو یادم رفت :
#define WM_RUNSCRIPTCODE 0x08C7
#define RUNSCRIPTCODE_QUIET 0
#define RUNSCRIPTCODE_LOUD 1
Mahmood_M
یک شنبه 19 تیر 1390, 01:50 صبح
سعی کنید هر سئوال رو در تاپیک جدایی مطرح کنید !
نمونه کدش رو پیدا کردم فقط مشکل اینه که برای ++C هست و من با ++C کار نکردم ممنون میشم این کد رو برام تبدیل کنید
توابع API مستقل از زبان برنامه نویسی هستند و معمولا نحوه ی استفاده از اونها در زبانهای مختلف یکسان هست
" define# " معادل " Const " در دلفی هست ، یعنی یک مقدار ثابت تعریف می کنه
مقدار 0x08C7 هم یک عدد در مبنای 16 هست ، در زبان ++C/C اعداد مبنای 16 با عبارت " 0x " شروع می شن و در دلفی با " $ "
مقادیر ثابت رو به صورت زیر تعریف کنید :
const
WM_RUNSCRIPTCODE = $08C7;
RUNSCRIPTCODE_QUIET = 0;
RUNSCRIPTCODE_LOUD = 1;
ورودی تابع هم به صورت زیر میشه :
var
S : String;
begin
S := 'RunScript(\"event_handler\")';
SendMessage(m_pParent, WM_RUNSCRIPTCODE, RUNSCRIPTCODE_QUIET, Integer(S));
موفق باشید ...
loo30fer
یک شنبه 19 تیر 1390, 12:26 عصر
سعی کنید هر سئوال رو در تاپیک جدایی مطرح کنید !عذرخواهی میکنم جناب Mahmood_N راستش نمیخواستم از چهارچوب قوانین انجمن خارج بشم , خیال میکردم مطرح کردن در ادامه مبحث اشکالی نداشته باشه چون در مورد SendMessage بحث شده بود.
یک سوالم داشتم اگه اشکال داره توی تاپیک جدید سوالم رو میپرسم . چرا باید اون مقدار رشته ای رو به عددی تبدیل کرد؟
Mahmood_M
یک شنبه 19 تیر 1390, 13:31 عصر
چرا باید اون مقدار رشته ای رو به عددی تبدیل کرد؟
چون ورودی اون تابع API از نوع عددی هست ، این عدد می تونه یک متغیر عددی باشه یا یک اشاره گر ( درواقع شماره ی خانه ی حافظه ) ، شما برای اینکه یک رشته رو بتونید ارسال کنید باید اشاره گری به اون رشته رو ارسال کنید ، کد بالا هم همون کار رو می کنه ، ابتدا رشته رو درون متغیر S قرار میده و بعد با دستور (Integer(S اشاره گری به S در ورودی تابع قرار می گیره ( درواقع آدرس خانه ی حافظه ی کارکتر اول رشته - معادل PChar - )
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.