PDA

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



shahabbasic
شنبه 01 بهمن 1390, 14:56 عصر
فرض کنید من 2 تا کامپوننت دارم کنار برنامم و نمیخوام براش ستاپ بسازم حالا چجوری این کامپوننت هارو رجیستر کنم با چه دستوری؟
روش زیر رو بلدم و در ویندوز 7 کاملا جواب میده اما در ویندوز xp حتما باید برنامه رو Run as administrator بکنید تا این کد اجرا بشه

Private Sub Form_Initialize()
If Len(App.Path) = 3 Then
ph = App.Path
Else
ph = App.Path & "\"
End If
Shell "RegSvr32 /s " & ph & "COMDLG32.OCX", vbNormalFocus
End Sub

حالا من برای حل مشکلش در ویندوز اکس پی چکار کنم؟

محسن واژدی
شنبه 01 بهمن 1390, 16:58 عصر
سلام
از آنجایی که کامپوننت ها برای دسترسی نیازمند ریجستری شدن پیش از استفاده هستند و در فرایند ریجستر کردن هم داده های فایل در HKCR نوشته میشوند، همانطور که اطلاع دارید چون ویرایش این بخش ها در سطح admin است پس بدون دسترسی administrator نمیتوانیم بخش هایی نظیر این قسمت ریجستری را ویرایش کنیم که در نتیجه آن ثبت کامپوننت هم با شکست مواجه میشود

یک نکته عمومی هم که شاید مفید باشد:
اگر کامپوننت مورد استفاده برنامه را در کنار فایل exe برنامه قرار داده باشیم دیگر نیازی به اجرای regsvr32 برای ریجستر کردن آن نیست، چرا که در سیستم مقصد برنامه بصورت خودکار کامپوننت را یافته و ثبت میکند (البته این هم نیازمند دسترسی admin است)

موفق باشید

shahabbasic
شنبه 01 بهمن 1390, 19:51 عصر
سلام
از آنجایی که کامپوننت ها برای دسترسی نیازمند ریجستری شدن پیش از استفاده هستند و در فرایند ریجستر کردن هم داده های فایل در HKCR نوشته میشوند، همانطور که اطلاع دارید چون ویرایش این بخش ها در سطح admin است پس بدون دسترسی administrator نمیتوانیم بخش هایی نظیر این قسمت ریجستری را ویرایش کنیم که در نتیجه آن ثبت کامپوننت هم با شکست مواجه میشود

یک نکته عمومی هم که شاید مفید باشد:
اگر کامپوننت مورد استفاده برنامه را در کنار فایل exe برنامه قرار داده باشیم دیگر نیازی به اجرای regsvr32 برای ریجستر کردن آن نیست، چرا که در سیستم مقصد برنامه بصورت خودکار کامپوننت را یافته و ثبت میکند (البته این هم نیازمند دسترسی admin است)

موفق باشید
کاملا اشتباه است من بارها کامپوننت هارو در کنار فایل اصلی قرار دادم و با حساب ادمین هم وارد سیستم شدم
ولی بازم ارور میده پس تنها راه رجیستره

محسن واژدی
شنبه 01 بهمن 1390, 22:31 عصر
کاملا اشتباه است من بارها کامپوننت هارو در کنار فایل اصلی قرار دادم و با حساب ادمین هم وارد سیستم شدم
ولی بازم ارور میده پس تنها راه رجیستره
سلام
شاید حق با شما باشد، ولی برای بنده اتفاق نیفتاده است
البته شاید برای فایل اجرایی نیازمند ریجستر کردن باشد حتی اگر کامپوننت در کنار فایل قرار داشته باشد، اما برای زمان طراحی همانطور که در پست قبل عرض کردم کامپوننت در کنار برنامه باشد کافیست

موفق باشید

shahabbasic
یک شنبه 02 بهمن 1390, 01:43 صبح
حالا بالاخره راه حل چیه؟ چطور میتونم بدون استفاده از فایل نصبی کامپوننت هارو رجیستر بکنم؟؟

محسن واژدی
یک شنبه 02 بهمن 1390, 08:57 صبح
به همان صورتی که در پست هم اول اشاره کردین انجام میشود، همانطور که اطلاع دارید در کل فرایند ریحستر کردن یعنی معرفی فایل به ویندوز با درج مشخصاتش در ریجستری، حالا چه توسط regsbr32 باشد و چه با توابع api، و در هردو صورت نیازمند دسترسی admin هستیم که در هرصورت نداشتن دسترسی admin در هیچ یک از دو ویندوزهای xp و 7 نمیتوانیم یک کامپوننت را ثبت کنیم به عبارتی ویندوز این مزیّت را به یوزر محدود که ما باشیم نمیدهد، به همین جهت است که حتی نصّاب های بزرگی مانند install-shield نیز برای ویرایش ریجستری نیازمند دسترسی admin هستند

موفق باشید

سید حمید حق پرست
یک شنبه 02 بهمن 1390, 11:17 صبح
با سلام

شما به یک روش دیگر میتوانید
که کامپوننت را در خود برنامه قرار بدی . منظورم همون برنامه ای هست که نوشتی
اگه خواستی بگو تا یه نمونه بزارم واست

محسن واژدی
یک شنبه 02 بهمن 1390, 19:28 عصر
با سلام

شما به یک روش دیگر میتوانید
که کامپوننت را در خود برنامه قرار بدی . منظورم همون برنامه ای هست که نوشتی
اگه خواستی بگو تا یه نمونه بزارم واست
سلام
بله در مورد user-controlها میتوانیم اما متاسفانه درباره فایل های ocxیی که سورس آن ها را در دسترس نداریم تنها راه پیش رو ثبت کامپوننت پیش از استفاده است

موفق باشید

mahmood744
یک شنبه 02 بهمن 1390, 23:33 عصر
دوست عزیز من از یک برنامه کمکی استفاده میکنم
یک برنامه ساده که از هیچ کامپونتی استفاده نشده و فقط برنامه اصلی را اجرا می کند ( (R= Sell (Path Exe /Code ) .

که این کار 3 مزیت بسیار مهم دارد :
1. اگر برنامه اصلی اجرا نشد می توانیم خطا زدایی کنیم (نصب نبودن کامپونت ها , ویروسی بودن برنامه , نصب نبودن فونت مورد نظر و غیره ...)
2. شما می توانید برنامه را به راحتی از طیق اینترنت آپدیت کنید.
3. شما می توانید برنامه اصلی را با یک کد انحصاری که بر حسب زمان می سازید اجرا کنید ( که این کار باعث می شود کسی نتواند برنامه اصلی را مستقیما اجرا کند که باعث می شود برنامه شما هک نشود)

shahabbasic
دوشنبه 03 بهمن 1390, 20:23 عصر
ببین سئوالمو ساده بگم
من فایل ocx رو گذاشتم کنار برنامم و ستاپ هم نداره حالا میخوام این دوتا فایل رو بدم دست کاربر
چه کار کنم که وقتی اون برای اولین مرتبه برنامه رو اجرا میکنه با پیغام خطای کامپوننت مواجه نشه؟

M.T.P
دوشنبه 03 بهمن 1390, 20:57 عصر
ببین سئوالمو ساده بگم
من فایل ocx رو گذاشتم کنار برنامم و ستاپ هم نداره حالا میخوام این دوتا فایل رو بدم دست کاربر
چه کار کنم که وقتی اون برای اولین مرتبه برنامه رو اجرا میکنه با پیغام خطای کامپوننت مواجه نشه؟

برنامه رو Sub Main شروع کنید.

با یک تابع ابتدا کامپوننت ها رو بررسی کنید بعد فرم ها رو به نمایش بگذارید.

shahabbasic
دوشنبه 03 بهمن 1390, 21:43 عصر
میشه بفرمایید چجوری با یک تایع کامپوننت هارو بررسی کنم؟

M.T.P
دوشنبه 03 بهمن 1390, 22:15 عصر
فرض کنید در FrmMain که فرم اصلی برنامه است از یک Listview استفاده کردید و باید قبل از اجرای فرم بررسی کنید که کامپوننت مربوطه نصب شده یا نه!


Sub Main()
Call CheckComponents
FrmMain.Show
End Sub

Sub CheckComponents()
Dim StrSysDir As String
Dim StrComFile As String

StrSysDir = Environ$("windir") & "\system32\"
StrComFile = StrSysDir & "comctl32.ocx"

If Dir(StrComFile) = vbNullString Then
Call MsgBox("comctl32.ocx not installed.", vbExclamation)
End
End If
End Sub


با این حال همه چیز تحت اختیار شماست ، خطای Run Time ناشی از نبود این ocx رو کنترل کردید ، می تونید کامپوننت در کنار برنامه هم جستجو کنید ، ریجستر کنید و یا پیغام بدید که کاربر برنامه رو مجدد نصب کنه.

shahabbasic
دوشنبه 03 بهمن 1390, 22:41 عصر
خب این روال که وقتی کامپوننت نصب نشده باشه فقط پیغام میده که نصب نشده من میخوام رجیستر کنم سورسی وجود نداره؟

If Dir(StrComFile) = vbNullString Then
؟
؟
؟
...
end if


یا پیغام بدید که کاربر برنامه رو مجدد نصب کنه. اگر قرار بود نصبی باشه که راحت رجیستر میشد من برنامم نصبی نیست

با این حال همه چیز تحت اختیار شماست ، خطای Run Time ناشی از نبود این ocx رو کنترل کردید
حرف شما متین ولی چه سود؟

M.T.P
سه شنبه 04 بهمن 1390, 01:19 صبح
تو xp و Seven تست شد مشکل ندره ، کاربر ویندوز هم که باید Administrator باشه ، کاربر Limit که معنی نداره.


Sub Main()
Call CheckComponents
FrmMain.Show
End Sub

Sub CheckComponents()
Dim StrAppPath As String
Dim StrComFile As String

StrAppPath = IIf(Right(App.Path, 1) = "\", App.Path, App.Path & "\")
StrComFile = "COMDLG32.OCX"

If Dir(StrAppPath & StrComFile) = vbNullString Then
Call MsgBox("COMDLG32.OCX not found.", vbExclamation)
End
Else
Call Shell("regsvr32 /s " & StrAppPath & StrComFile, vbHide)
End If

End Sub

mahmood744
سه شنبه 04 بهمن 1390, 05:37 صبح
این هم سورس برنامه خودم

81346

اگر با حال بود تشکر یادت نره

shahabbasic
سه شنبه 04 بهمن 1390, 12:50 عصر
این هم سورس برنامه خودم

81346

اگر با حال بود تشکر یادت نره
اجرا نمیشه میگه فایل پیدا نشد

shahabbasic
سه شنبه 04 بهمن 1390, 12:51 عصر
تو xp و Seven تست شد مشکل ندره ، کاربر ویندوز هم که باید Administrator باشه ، کاربر Limit که معنی نداره.


Sub Main()
Call CheckComponents
FrmMain.Show
End Sub

Sub CheckComponents()
Dim StrAppPath As String
Dim StrComFile As String

StrAppPath = IIf(Right(App.Path, 1) = "\", App.Path, App.Path & "\")
StrComFile = "COMDLG32.OCX"

If Dir(StrAppPath & StrComFile) = vbNullString Then
Call MsgBox("COMDLG32.OCX not found.", vbExclamation)
End
Else
Call Shell("regsvr32 /s " & StrAppPath & StrComFile, vbHide)
End If

End Sub
خب یعنی اگر با ادمین اومده باشه بالا لازم نیست run as administrator بکنه؟

mahmood744
سه شنبه 04 بهمن 1390, 18:10 عصر
دوست عزیز یه جای اسم فایل Prog2.EXE نام فایل اجرایی خودت را بزار
و در جای Register.exe شما کامپونت هایی که می خواهی رجیستر کنی را بزار

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

IamOverlord
چهارشنبه 05 بهمن 1390, 16:28 عصر
من با regsvr32.exe کامپوننت ها رو Register نمی کنم، چون برای اجرای برنامه باید Run as administrator زده بشه و اگه زده نشه، کامپوننت ها Register نمی شن.

mahmood744
چهارشنبه 05 بهمن 1390, 17:13 عصر
شما می توانید با تابع زیر کامپونت ها را رجیستر کنید و احتیاجی به regsvr32.exe نیست

Public Declare Function DLLSelfRegister Lib "vb6stkit.dll" (ByVal lpDllName As String) As Integer

shahabbasic
چهارشنبه 05 بهمن 1390, 19:24 عصر
اگر نمونه کدشو بذاری ممنون میشم

IamOverlord
چهارشنبه 05 بهمن 1390, 20:04 عصر
این خودش به vb6stkit.dll نیاز داره. :متفکر: