ورود

View Full Version : بررسی ریجستر شدن کامپوننت و DLL



saber67
یک شنبه 11 فروردین 1392, 12:04 عصر
کسی تابع Api یا یه چیزی تو این مایه ها سراغ نداره که اسم کامپوننت یا DLL رو بهش بدیم و بررسی کنه ببینه که توی سیستم ثبت شده یا نه؟
و یه چیز دیگه، وقتی کامپوننتی رو توی سیستم ریجستر می کنیم با یه کد خاص توی ریجستری ثبت میشه، (اسم کلید ریجستری که مشخصات کامپوننت و مسیرش توش درج میشه) فکر می کنم هر کامپوننت تو همه سیستمها با یه کد ثابت ریجستر بشه، درسته یا اشتباه می کنم؟!
مثلا به گمانم برای dx7vb.dll این کلید تو ریجستری محل ثبت اصلیش باشه
HKEY_CLASSES_ROOT\CLSID\{E1211353-8E94-11D1-8808-00C04FC2C602}
البته تو چند مسیر دیگه هم اطلاعاتی ازش دیدم اما با حذف اونا اتفاق خاصی نمی افته و اگه تو برنامه مون از این DLL استفاده کرده باشیم برنامه بازم اجرا میشه اما با حذف این کلید که گفتم برنامه خطا میده

نکته! لطفا جوابتون در زمینه سوال باشه!
جواب هایی مثل برو از نصب کننده ها برای برنامت استفاده کن و نمی دونم برو از برنامه های پرتابل سازی استفاده کن که کارت راحت بشه و غیره به درد من نمی خوره! (اینا تنبل بازیه!)
من می خوام برنامم خودش مدیریت فایل های مورد نیازش رو داشته باشه و بعد هر بار اجرا چک کنه ببینه کامپوننت های مورد استفادش توی سیستم ثبت شدن یا نه، اگه نه ثبت شون کنه (که قسمت دوم کار ساده ایه)

محسن واژدی
یک شنبه 11 فروردین 1392, 18:45 عصر
سلام علیکم
میتوانیم از CreateObject در رویداد Initialize فرم یا Main در ماژول استفاده کنیم، به عنوان مثال کد زیر:

Private Sub Command1_Click()
On Error Resume Next
Dim oDX
Set oDX = CreateObject("DirectXFile")
If Err.Number <> 0 Then
MsgBox "The target component doesn't registered!", vbExclamation
'
'-- Register commands
'
End If
End Sub

موفق باشید

saber67
یک شنبه 11 فروردین 1392, 20:02 عصر
سلام علیکم
میتوانیم از CreateObject در رویداد Initialize فرم یا Main در ماژول استفاده کنیم، به عنوان مثال کد زیر:

Private Sub Command1_Click()
On Error Resume Next
Dim oDX
Set oDX = CreateObject("DirectXFile")
If Err.Number <> 0 Then
MsgBox "The target component doesn't registered!", vbExclamation
'
'-- Register commands
'
End If
End Sub

موفق باشید

اینم میشه (خوبه منتها به هر علت دیگه ای هم خطا بده میاد کامپوننت رو ریجستر می کنه)
اما منظورم همین DLL خاص نبود، dx7vb.dll رو مثال زدم که موضوع روشنتر بشه، سوال من کلی هستش
راهی نیست که بفهمیم فلان DLL یا کامپوننت ریجستر شده یا نه؟
یا حداقل مسیر ثبت شدن شون توی ریجستری رو بدونیم که خودمون چک کنیم

محسن واژدی
دوشنبه 12 فروردین 1392, 08:51 صبح
اینم میشه (خوبه منتها به هر علت دیگه ای هم خطا بده میاد کامپوننت رو ریجستر می کنه)بله، منتها تنها در صورتی CreateObject خطا میدهد که مشکلی در روند بارگذاری کامپوننت وجود داشته باشد (کامپوننت وجود نداشته باشد، یا فایل مشکلی نداشته باشد)


راهی نیست که بفهمیم فلان DLL یا کامپوننت ریجستر شده یا نه؟
یا حداقل مسیر ثبت شدن شون توی ریجستری رو بدونیم که خودمون چک کنیم
تا آنجایی که بنده اطلاع دارم GUID هر کامپوننت منحصر بفرد است، که از این طریق هم میتوان ریجستر بود کامپوننت را بررسی کرد
راه دوم نوشتن یک جستجوگر هست که بررسی به اینصورت هم بیشتر از زمان معمول زمانبر است علل الخصوص در CLSID

موفق باشید

saber67
دوشنبه 12 فروردین 1392, 14:01 عصر
راه دوم نوشتن یک جستجوگر هست که بررسی به اینصورت هم بیشتر از زمان معمول زمانبر است علل الخصوص در CLSID

نه دیگه جستجوگر می خواد چیکار! قرار نیست کل ریجستری رو بگردیم که!، اگه مسیر ثبت هر کامپونت رو بدونیم فقط همون کلید رو چک می کنیم
(خودم از این روش استفاده می کنم گفتم شاید راه اصولی تری هم باشه! چون این جوری باید وقت بزاری ببینی فلان کامپوننت محل ثبتش تو ریجستری کجاس و اگه چند جا ثبت شده کدوم اصلیه که اگه نباشه یا حذف شده باشه برنامه خطا میده)

محسن واژدی
دوشنبه 12 فروردین 1392, 17:09 عصر
(خودم از این روش استفاده می کنم گفتم شاید راه اصولی تری هم باشه! چون این جوری باید وقت بزاری ببینی فلان کامپوننت محل ثبتش تو ریجستری کجاس و اگه چند جا ثبت شده کدوم اصلیه که اگه نباشه یا حذف شده باشه برنامه خطا میده)
سلام

شیوه ی اصولی استفاده از CreateObject است

موفق باشید