ورود

View Full Version : مشکل در باز کردن همزمان چند فایل توسط برنامه



persia_hrn
پنج شنبه 21 شهریور 1392, 03:15 صبح
سلام بر همه اساتید محترم

من یک برنامه کوچیک نوشتم که فایلهایی با پسوند b رو رجیستر میکنه که توسط خود فایل اجرایی باز بشن ،

مثال : فرض کنیم دوتا فایل به اسم های One.b , Two.b داریم و برنامه میاد فایل ها رو رجیستر میکنه که وقتی توی ویندوز روی اونها دوتا کلیک میکنیم توسط برنامه باز بشن و آدرسشون توی لیست نمایش داده بشه .

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


uses windows , SysUtils, ShlObj, Registry;

var j: Integer;

{$R Project1.REC}

procedure RegisterFileType(ExtName:String; AppName:String) ;
var
reg:TRegistry;
begin
reg := TRegistry.Create;
try
reg.RootKey:=HKEY_CLASSES_ROOT;
reg.OpenKey('.' + ExtName, True) ;
reg.WriteString('', ExtName + 'file') ;
reg.CloseKey;
reg.CreateKey(ExtName + 'file') ;
reg.OpenKey(ExtName + 'file\DefaultIcon', True) ;
reg.WriteString('', AppName + ',0') ;
reg.CloseKey;
reg.OpenKey(ExtName + 'file\shell\open\command', True) ;
reg.WriteString('',AppName+' "%1"') ;
reg.CloseKey;
finally
reg.Free;
end;
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil) ;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
for j := 1 to ParamCount do
ListBox1.Items.Append(ParamStr(j)) ;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
RegisterFileType('b',Application.ExeName) ;
end;
توی کد بالا با کلیک روی Button1 فایل b رجیستر میشه و توی FormCreate پارامترهای ارسالی ویندوز توی لیست نمایش داده میشه .

حالا بریم سر مشکل ، مشکل اینجاست که وقتی توی ویندوز هر دوتا فایل رو همزمان انتخاب و اجرا کنیم به جای اینکه برنامه بازشه و آدرس هر دوتا فایل توی لیست نمایش داده بشه بجاش برنامه 2 بار اجرا میشه و توی هرکدوم آدرس یکی از فایلها نمایش داده میشه .

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

کسی از اساتید میدونه چطور میشه کاری کرد که هر دوتا آدرس همزمان توی لیست برنامه لود بشه ؟

persia_hrn
پنج شنبه 21 شهریور 1392, 03:24 صبح
اینم پروژه

110507

Mask
پنج شنبه 21 شهریور 1392, 17:02 عصر
کاری نداره دوست عزیز. من جون قبلا این برنامه رو نوشتم ، توضیح میدم.
اول اینکه با Mutex از باز شدن دوباره برنامه جلوگیری میکنی
دوم : وقتی که برنامه تشخیص داد که یه نسخه ازش بازه با یه SendMesage مقدار پارامتر رو میفرسته به فرمی که بازه .
اونجا با یه مسیج هندلر میگیریش و تو لیستت ADD میکنی.
همین :لبخندساده:
کد زیر رو با دقت بخون :

function I: boolean;
var
H: Thandle;
begin
H := CreateMutex(nil, False, 'Test');
result := False;
If not(WaitForSingleObject(H, 0) <> Wait_TimeOut) then
result := true;
end;

begin
if not I then
begin
Application.Initialize;
Application.MainFormOnTaskbar := False;
Application.Title := 'Test';
Application.CreateForm(TF_Main, F_Main);
Application.Run;
end
else
begin
SendMessage(FindWindow('TF_Main', nil), WM_User + 1, 1, 0);
end;

persia_hrn
شنبه 23 شهریور 1392, 01:22 صبح
جناب آقای Gold

از طریق دستور فوق پارامتر رو ارسال کردم ولی فقط میتونم مقادیر WParam و LParam رو ارسال کنم و بخونم که اونم Integer هست .

چطور میتونم پارامتر ارسالی فایل در زمان اجرا شدن که آدرس اون فایل هست و String هست رو به فرم ارسال کنم ؟ :افسرده:

Mahmood_M
شنبه 23 شهریور 1392, 03:32 صبح
How to Send Information ( String , Image , Record ) between two Applications (http://delphi.about.com/od/windowsshellapi/a/wm_copydata.htm)

persia_hrn
شنبه 23 شهریور 1392, 07:08 صبح
آقا محمود دست شما درد نکنه .

من روشی که توی اون پیج گفته بود رو قبلاً امتحان کرده بودم ، چندتا روش دیگه هم امتحان کردم که متاسفانه همشون Error میدن .

یه نمونه ساده ترش اینه :
http://www.delphitricks.com/source-code/windows/send_a_windows_message_with_sendmessage.html

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

اینم طرز استفادش توی برنامم :
110633

اگه لطف کنید و فایل ضمیمه رو امتحان کنید ممنون میشم .

Mask
شنبه 23 شهریور 1392, 11:59 صبح
بخونم که اونم Integer هست .
ارسال مقادیر به این شکل هست :

]Integer(string)
و خوندنش :

String(integer)