PDA

View Full Version : رجیستر کردن Componentها (آموزش)



Payam Moradi
یک شنبه 08 خرداد 1384, 12:44 عصر
سلام
تو فریوم دیدم که برخی دوستان در مورد رجیستر کردن فایل ها مشکل دارن یا میخواه که برنامه ست آپ خودشون درست کنند و برای رجیستر کردن Component ها مشکل دارن.
این کد حتما بدردشون میخوره:

فایل هایی که باید رجیستر شوند کلا شامل dll ,ocx و exe(منظور ActiveX EXE ها) هستند. برای رجیسترکردن dll ها و ocx ها از کد زیر استفاده کنید:

ابتدا یک ماژول ایجاد و توابع زیر در قسنت اعلان توابع قرار دهید:


Private Declare Function LoadLibraryRegister _
Lib "Kernel32" Alias "LoadLibraryA" ( _
ByVal lpLibfName As String) As Long

Private Declare Function FreeLibraryRegister _
Lib "Kernel32" Alias "FreeLibrary" ( _
ByVal hLibModule As Long) As Long

Private Declare Function GetProcAddressRegister _
Lib "Kernel32" Alias "GetProcAddress" ( _
ByVal hModule As Long, _
ByVal lpProcName As String) As Long

Private Declare Function CreateThreadForRegister _
Lib "Kernel32" Alias "CreateThread" ( _
lpThreadAttributes As Any, _
ByVal dwStackSize As Long, _
ByVal lpStartAddress As Long, _
ByVal lpparameter As Long, _
ByVal dwCreationFlags As Long, _
lpThreadID As Long) As Long

Private Declare Function GetExitCodeThread _
Lib "Kernel32" ( _
ByVal hThread As Long, _
lpExitCode As Long) As Long

Private Declare Sub ExitThread _
Lib "Kernel32" ( _
ByVal xc As Long)

Private Declare Function CloseHandle _
Lib "Kernel32" ( _
ByVal hObject As Long) As Long

سپس در همان ماژول تابع زیر را قرار دهید:


Public Function Pr_Register(str_FullPathName, int_Value As Integer) As Integer
Dim regLib&, process&, succeed&
Dim h1&, xc&, id&
Dim p$

Select Case int_Value
Case 0: p = "DllUnregisterServer"
Case 1: p = "DllRegisterServer"
Case Else: Pr_Register = 0
Exit Function
End Select

regLib = LoadLibraryRegister(str_FullPathName)
If regLib = 0 Then
Pr_Register = 1
Exit Function
End If

process = GetProcAddressRegister(regLib, p)

If process = 0 Then
Pr_Register = 2
Else
h1 = CreateThreadForRegister(ByVal 0&, 0&, _
ByVal process, ByVal 0&, 0&, id)
If h1 = 0 Then
Pr_Register = 3
Else
succeed = (WaitForSingleObject(h1, 10000) = 0)
If succeed Then
CloseHandle h1
Pr_Register = 4
Else
GetExitCodeThread h1, xc
ExitThread xc
Pr_Register = 5
End If
End If
End If

FreeLibraryRegister regLib
End Function

آرگومان های تابع: str_FullPathName مسیر دقیق فایلی (dll , ocx) که قرار است رجیستر شود.
int_Value اگر یک باشد فایل را رجیستر میکند و اگر صفر باشد فایلی که قبلا رجیستر شده را از رجیستری حذف میکند. در واقع مقدار صفر برای UnRegister کردن فایلهای dllو ocx

حال در هر جای پروژه تابع Pr_Registerرا فراخوانی کنید و مسیر فایلی که قرار است رجیستر یا آنرجیستر شود را بدهیم عمل انجام میشود. اگر تابع Pr_Register مقدار 4 را برگرداند فایل با موفقیت ثبت شده (وبالعکس) در غیر اینصورت با خطا روبرو شده که در صورت تمایل انواع خطاهای احتمالی هم برایتان مینویسم.

برای رجیستر کردن فایل های EXE (ActiveX EXE ها) فقط کافیست فایل EXE را با آرگومان /REGSERVER اجرا نمایید:


Shell (MyActiveX_EXE.EXE /REGSERVER)

همچنین برای آنرجیستر کردن :
Shell (MyActiveX_EXE.EXE /UNREGSERVER)

(ماخذ: MSDN 2001)

از این توابع به شخصه در برنامه ها نصبی که خودم طراحی میکنم استفاده کردم و بدون هیچ مشکل در انواع ویندوزها کار میکنه.
امیدوارم مفید باشد.

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

hadi2345
یک شنبه 08 خرداد 1384, 18:14 عصر
ممنون آقای مرادی . کد مفید و به درد بخوری بود . :flower: :flower:

R_BABAZADEH
دوشنبه 09 خرداد 1384, 09:12 صبح
ممنون کمک خوبی بود