View Full Version : ثبت فایل اجرایی برای فایلهایی با یک پسوند خاص
Mahmood_M
جمعه 20 مهر 1386, 12:39 عصر
با سلام
من نیاز دارم که فایل اجرایی رو برای فایلهایی با یک پسوند خاص ثبت کنم ...
برای مثال ، در ویندوز ثبت شده که با اجرای فایلهای " .doc " برنامه Word یا ... باز شده و فایل را نمایش دهد ... ، حالا من میخوام به ویندوز بفهمونم که وقتی روی فایلی با یک پسوند خاص کلیک شد ( آن فایل اجرا شد ) برنامه من اجرا شده و فایل را نمایش دهد ...
فکر کنم باید در رجیستری تنظیماتی انجام بدم ، اگر همینطوره ، فکر کنم اگه یکی از دوستان فقط کلیدهای مربوطه در رجیستری رو بهم بگن مشکل حل بشه ...
سئوالی دیگر در همین مورد :
آیا در اجرای عادی برنامه ، پارامتری بهش ارسال میشه ، یعنی ParamStr مقدار داره ؟ در Help دلفی خوندم که ParamStr نام فایل اجرا کننده برنامه رو برمی گردونه ، اما با وجود ParamCount و با توجه به این که بیش از یک پارامتر میشه به برنامه ارسال کرد ، چطور باید تشخیص بدم که برنامه به وسیله یک فایل اجرا شده ، یعنی ParamStr مقدارش ، مسیر یک فایل هست ...
به طور خلاصه اگر همیشه در زمان اجرا چک کنم که اگر (ParmaStr(1 دارای مقدار بود ( و مقدارش فایل اجرایی اصلی نبود ) فایل رو از مسیری که مقدار ParamStr باز کنم ، درست هست ؟ ( امیدوارم منظورم رو درست رسونده باشم )
با تشکر ...
vcldeveloper
جمعه 20 مهر 1386, 14:59 عصر
بصورت عادی این فایل ها به عنوان یک پارامتر خط فرمان برای برنامه شما ارسال میشند، شما باید با استفاده از ParamStr مقدار ارسال شده را (که آدرس و نام فایل مربوطه است) بخوانید و عملیات مورد نظر خود را انجام دهید. ParamStr(0) همیشه به مسیر برنامه شما اشاره میکنه، یعنی همون Application.ExeName.
تا جایی که یادم هست، برای ثبت برنامه خود برای یک Extension خاص باید کلید مربوط به آن Extension را در HKEY_CLASS_ROOT پیدا کنید و در زیر شاخه Shell\Command\Open مربوط به آن کلید، آدرس فایل اجرایی برنامه خود + %1 را مقدار Default بنویسید:
"c:\test.exe %1"
%1 همون پارامتر ارسالی به برنامه شما است که بعدا با نام فایلی که کاربر انتخاب کرده، جایگزین میشه.
Mahmood_M
جمعه 20 مهر 1386, 15:06 عصر
ممنون ...
بصورت عادی این فایل ها به عنوان یک پارامتر خط فرمان برای برنامه شما ارسال میشند، شما باید با استفاده از ParamStr مقدار ارسال شده را (که آدرس و نام فایل مربوطه است) بخوانید و عملیات مورد نظر خود را انجام دهید.
آیا امکان داره که این مقدار چیزی غیر از مسیر یک فایل باشه ؟ یعنی میشه برنامه رو مثلا با یک پارامتر اجرا کرد ( منظورم اینه که مثلا کاربر در Run ویندوز نام برنامه من و یک پارامتر بنویسه و برنامه رو اجرا کنه ، در این صورت اون پارامتر به برنماه من ارسال میشه ، حالا چطور باید تشخیص داد که این مقدار ارسال شده یک آدرس فایل هست ؟ )
به نظر خودم یه راهش اینه که اول با FileExsist چک کنم ببینم در آدرس ارسال شده فایلی وجود داره یا نه و اگه بود ( و پسوندش هم مناسب برنامه بود ) اون رو Load کنم ، آیا این راه عملی هست ؟
باید کلید مربوط به آن Extension را در HKEY_CLASS_ROOT پیدا کنید
من میخوام یک Extension جدید به ویندوز معرفی کنم و براش فایل اجرایی و آیکون مشخص کنم ...
برای این کار باید یک کلید جدید بسازم ؟ ( در چه مسیری؟ )
با تشکر ...
vcldeveloper
جمعه 20 مهر 1386, 15:16 عصر
آیا امکان داره که این مقدار چیزی غیر از مسیر یک فایل باشه ؟ یعنی میشه برنامه رو مثلا با یک پارامتر اجرا کرد ( منظورم اینه که مثلا کاربر در Run ویندوز نام برنامه من و یک پارامتر بنویسه و برنامه رو اجرا کنه ، در این صورت اون پارامتر به برنماه من ارسال میشه ، حالا چطور باید تشخیص داد که این مقدار ارسال شده یک آدرس فایل هست ؟ )
به نظر خودم یه راهش اینه که اول با FileExsist چک کنم ببینم در آدرس ارسال شده فایلی وجود داره یا نه و اگه بود ( و پسوندش هم مناسب برنامه بود ) اون رو Load کنم ، آیا این راه عملی هست ؟
پارامتر ارسالی چیزی جز یک رشته متن ساده نیست، پس لزومی نداره که حتما این پارامتر مسیر یک فایل باشه. برنامه شما باید بتونه با استفاده از ParamStr و ParamCount پارامترهای دریافتی را بخواند و نسبت به آنها واکنش دهد. مثلا چک کنه که آیا نام فایل دریافت شده، یا چیز دیگه. وقتی کاربر در Windows Explorer بر روی فایلی با پسوند مورد نظر شما دابل کلیک می کند، Shell ویندوز برنامه مرتبط با آن پسوند را از Registry پیدا کرده و عبارت %1 را با نام و آدرس فایل انتخاب شده جایگزین می کند.
من میخوام یک Extension جدید به ویندوز معرفی کنم و براش فایل اجرایی و آیکون مشخص کنم ...
برای این کار باید یک کلید جدید بسازم ؟ ( در چه مسیری؟ )
بله:
HKEY_CLASS_ROOT\.MyExt\Shell\Command\Open
.MyExt نام پسوندی هست که می خواید ثبت کنید.
manvaputra
سه شنبه 24 مهر 1386, 22:22 عصر
سلام دوست عزیز یه نگاه به این بنداز:
uses
Registry, ShlObj;
procedure TForml.ButtonlClick(Sender: TObject); const
cMyExt = '.abc';
cMyFileType = 'Projectl.FileType'; var
Reg: TRegistry; begin
Reg := TRegistry.Create; try
// Set the root key to HKEY_CLASSES_ROOT
Reg.RootKey := HKEY_CLASSES_ROOT;
// Now open the key, with the possibility to create
// the key if it doesn't exist.
Reg.gpenKey(cMyExt, True);
// Write my file type to it.
II This adds HKEY_CLASSES_ROOT\.abc\(Default) = '.Projectl.FileType'
Reg.WriteString('', cMyFileType);
Reg.CloseKey;
// Now create an association for that file type
Reg.OpenKey(cMyFileType, True);
// This adds HKEY_CLASSES_ROOT\Projectl.FileType\(Default)
II = 'Projectl File'
II This is what you see in the file type description for
// the a file's properties.
Reg.WriteString('', 'Projectl File');
Reg.CloseKey;
// Now write the default icon for my file type
// This adds HKEY_CLASSES_ROOT\Project1.FileTypeXDefaultIcon
II \(Default) - 'Application Dir\Projectl,exe,0'
Reg.OpenKey(cMyFileType + '\DefaultIcon', True);
Reg.WriteString('', Application.ExeName + ' ,0' ) ;
Reg.CloseKey;
// Wow write the open action in explorer
Reg.OpenKey(cMyFileType + '\Shell\Open', True);
Reg.WriteString('', '&Open');
Reg.CloseKey;
// Write what application to open it with
II This adds HKEY__ClASSES_ROOT\Projeetl.Fili}Typ&\Shell\
II Open\Command
// (Default) = '"Application Dir\Projectl.exe" "%!"'
// your application must scan the command line parameters
II to see what file was passed to it.
Reg.OpenKey(cMyFileType + '\Shell\Open\Command', True);
Reg.WriteString('', '"' + Application.ExeName + '" "%!"');
Reg.CloseKey;
// Finally, we want the Windows Explorer to realize we adder:
// our file type by using the SHChangeNotify API.
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil); finally
Reg.Fre e; end;
end;
Mahmood_M
سه شنبه 24 مهر 1386, 23:38 عصر
ممنون دوست عزیز ...
با تشکر از همگی ، مشکلم حل شد ...
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.