PDA

View Full Version : سوال: مخفي کردن تابع ساخته شده در VB6



MohammadGh2011
جمعه 04 فروردین 1391, 17:37 عصر
سلام عليکم
چه طور ميتونم يک تابع رو مانند توابع خود VB6 در بيارم براي مثال:
تابع زير ميخوام پيدانباشه ولي بتونم فراخوانيش کنم مثل توابع VB6 که کدهاش رو نشون نميده و به راحتي ميشه اونها رو فراخواني کرد مانند تابع Len ,... ولي ما بايد کدهارو بنويسيم بعد فراخوانييش کنيم.من ميخوام کدهاي تابعي رو که نوشتم معلوم نباشه.
آيا بايد اون رو به صورت فايل Dll در بيارم؟چگونه؟
اميدوارم که منظورم رو متوجه شده باشيد.
Public Function Msg(ByVal strX As String)
MsgBox strX
End Function
Private Sub Command1_Click()
Msg ("Hi")
End Sub

بهروز عباسی
جمعه 04 فروردین 1391, 17:47 عصر
آيا بايد اون رو به صورت فايل Dll در بيارم؟چگونه؟به نظر من که اره

چون شما هر بلای سرش بیاری بازهم تابعت جزئی از پروژته که میشه سورسش رو دید

یاdll یا ocx

محسن واژدی
شنبه 05 فروردین 1391, 09:29 صبح
سلام
میبخشید زیاد متوجه نشدم چگونه پیدا نباشد؟ چون تابع Len معلوم است! در صورت امکان بیشتر توضیح دهید

Veteran
شنبه 05 فروردین 1391, 10:19 صبح
منظور ایشون اینکه مثلا ما چندتا تابع داریم در برنامه مثلا
Public Function Msg(ByVal strX As String)
MsgBox strX
End Function

خب این کد توی برنامه هست . هرکسی سورس رو ببینه متوجه کد ها میشه. شاید این اقا نمیخواد اگر احیانا سورس دسته کسی افتاد از بعضی از کد ها دسترسی داشته باشه.
حالا میخوان این تابع رو به صورت یک dll در بیارن و در برنامه با استفاده از فایل dll تابع رو فراخوانی کنن.
اما چگونه dll بسازیم ؟
چگونه فراخوانی کنیم ؟

محسن واژدی
شنبه 05 فروردین 1391, 13:36 عصر
برای اینکار همانطور که دوستان هم اشاره کردند بهتر است کدهای برنامه را در یک کامپوننت ActiveX-DLLبریزیم، برای آن هم همانطور که دوستان اطلاع دارند پس از شروع vb در صفحه new-project گزینه ActiveX-DLL را انتخاب کرده و تمامی کدهایی که قصد کپسوله کردن آنها را داریم را در یک کلاس بصورت دسترسی Public قرار میدهیم و پس از آن کامپوننت کامپایل شده را به برنامه وارد کرده و از آن استفاده میکنیم

برای فراخوانی هم عمومی ترین روش استفاده از یکی از دو دستور مشابه زیر است:

Public cMeDLL As New Class1

یا

Dim obj
Set obj=CreateObject("Project1.Class1")



موفق باشید

Veteran
شنبه 05 فروردین 1391, 14:06 عصر
به برنامه وارد کرده و از آن استفاده میکنیم
میشه بگین چجوری به برنامه وارد کنیم ؟

محسن واژدی
شنبه 05 فروردین 1391, 14:37 عصر
میشه بگین چجوری به برنامه وارد کنیم ؟
برای وارد کردن کامپوننت بر روی گزینه Preferences از منوی Project کلیک میکنیم تا فرم References باز شود سپس یا در لیست موجود نام کامپوننت را یافته و انتخاب میکنیم و یا آنرا با کلیک بر روی Browse به برنامه اضافه میکنیم

البته در استفاده از CreateObject لزومی به افزودن کامپوننت به برنامه نیست

موفق باشید

MohammadGh2011
یک شنبه 06 فروردین 1391, 22:21 عصر
برای اینکار همانطور که دوستان هم اشاره کردند بهتر است کدهای برنامه را در یک کامپوننت ActiveX-DLLبریزیم، برای آن هم همانطور که دوستان اطلاع دارند پس از شروع vb در صفحه new-project گزینه ActiveX-DLL را انتخاب کرده و تمامی کدهایی که قصد کپسوله کردن آنها را داریم را در یک کلاس بصورت دسترسی Public قرار میدهیم و پس از آن کامپوننت کامپایل شده را به برنامه وارد کرده و از آن استفاده میکنیم

برای فراخوانی هم عمومی ترین روش استفاده از یکی از دو دستور مشابه زیر است:

Public cMeDLL As New Class1

یا

Dim obj
obj=CreateObject("Project1.Class1")

موفق باشید
سلام عليکم
ببخشيد آقاي واژدي متوجه نشدم!
من وقتي ActiveX-DLL رو انتخاب ميکنم و توابعم رو مينويسم براي مثال تابع پست اول اين تاپيک و dll رو ميسازم ،بعد که ميخوام از طريق Preferences اضافش کنم ارور ميده.لطفا مثال خودم رو برام بياريد تا متوجه بشم.ممنون
و کدهايي که در پست 5 قرار داديد رو کجا بايد بنويسم و توضيحي در مورد اين کدها بنويسيد.


خيلي ممنون

محسن واژدی
یک شنبه 06 فروردین 1391, 23:59 عصر
من وقتي ActiveX-DLL رو انتخاب ميکنم و توابعم رو مينويسم براي مثال تابع پست اول اين تاپيک و dll رو ميسازم ،بعد که ميخوام از طريق Preferences اضافش کنم ارور ميده.

سلام
به همان روش معمول که اشاره کردین کامپوننت نوشته شده را وارد میکنیم، در صورت امکان متن خطا را هم ضمیمه کنید



کدهايي که در پست 5 قرار داديد رو کجا بايد بنويسم و توضيحي در مورد اين کدها بنويسيد.
در روش هایی که در پست 5 عرض کردم ،
در روش اول ابتدا کامپوننت را به برنامه اضافه میکنیم، سپس با اعلان زیر کلاس مورد نظر را مانند روش های معمول ایجاد کلاس، ایجاد میکنیم:

Public cMeDLL As New Class1

در اعلان بالا Class1 نام کلاس موجود در کامپوننتمون است، برای نمونه اگر روال زیر یکی از اعضای Class1 باشد:


Public Function Msg(ByVal strX As String)

MsgBox strX

End Function

بصورت زیر استفاده میکنیم (البته ببخشید خیلی مبتدی توضیح میدهم):

Private Sub Command1_Click()
Call cMeDLL.Msg("My message")
End Sub


در روش دوم اجباری به اضافه کردن کامپوننت به برنامه نیست، فقط کافی است کامپوننت را در ویندوز ثبت کرده باشیم، که میشود:

Dim cMeDLL

Private Sub Command1_Click()
Set cMeDLL = CreateObject("MyDLL.Class1")
Call cMeDLL.Msg("My message")
End Sub

در کد بالا توسط تابع CreateObject کلاس Class1 ازکامپوننت MyDLL را در زمان اجرا ایجاد میکنیم (مشابه اعلان کلاس در روش اول منتها در این دستور لازم نیست کامپوننت را به پروژه وارد کنیم) البته اگر میخواهیم کامپوننت را تا بستن برنامه استفاده کنیم بهتر است دستور Set را در رویداد Load فرم قرار بدهیم. برای استفاده هم مانند روش معمول که در کد هم مشاهده میکنید عمل میکنیم، MyDLLکه در تابع CreateObject مشاهده میکنید نام پروژه است (که نام پیش فرض Project1 است) و Class1 هم نام کلاس موجود در کامپوننت MyDLL است،

کلیه توضیحاتی که در بالا عرض شد روش های معمول استفاده از کامپوننت است؛ که اگر بخواهیم دستورات کامپوننت را مستقیما" و بدون نیاز به ایجاد شی اجرا کنیم (مانند توابع داخلی وی بی MsgBox, Len و ... که بدون نیاز به اعلان کلاس VBA مستقیما در دسترس هستند)، در بخش Properties کلاس مورد نظر (مثلا Class1) اختیار Instancing را بر روی GlobalMultiuse تنظیم میکنیم، که اگر کلاس Class1 کامپوننت MyDLL را GlobalMultiuse کرده باشیم، تابع Msg را بصورت زیر بنویسیم صحیح است:

Private Sub Command1_Click()
Call Msg("My message")
End Sub


و اگر هم بخواهیم دستور نوشته شده مخفی باشد (مانند تابع VarPtr وی بی)، ابتدا به کلاس وارد میشویم سپس از منوی Tools گزینه Procedure-Attributes را انتخاب میکنیم تا فرم Procedure-Attributes باز شود که در این فرم ابتدا تابع مورد نظر را انتخاب و از بخش Attributes گزینه HideThisMember را روشن میکنیم


در نمونه زیر هر سه روش وجود دارد

موفق باشید

Veteran
دوشنبه 07 فروردین 1391, 10:28 صبح
بعد که ميخوام از طريق Preferences اضافش کنم ارور ميده.لطفا مثال خودم رو برام بياريد تا متوجه بشم.ممنون
و کدهايي که در پست 5 قرار داديد رو کجا بايد بنويسم و توضيحي در مورد اين کدها بنويسيد.

name conflicts whith exiting madule,project,or object library
اینو میده ؟
در پنجره project اسم project رو عوض کنین درست میشه
کد هارو هم به صورت یک تابع عمومی public function باید بنویسین
مثلا public function msg()
msgbox "barnamenevis"
end function

MohammadGh2011
دوشنبه 07 فروردین 1391, 12:38 عصر
سلام
در صورت امکان متن خطا را هم ضمیمه کنید.

سلام عليکم
متن خطا را جناب Veteran در پست 10 عرض کردند.


البته ببخشید خیلی مبتدی توضیح میدهم

خواهش ميکنم اقاي واژدي،چون موضوع تاپيک برام پيچيدست اينطوري بهتره.



بازم ازتون تشکر ميکنم به خاطر توضيح کاملتون.

MohammadGh2011
دوشنبه 07 فروردین 1391, 12:40 عصر
name conflicts whith exiting madule,project,or object library
اینو میده ؟
در پنجره project اسم project رو عوض کنین درست میشه
کد هارو هم به صورت یک تابع عمومی public function باید بنویسین
مثلا public function msg()
msgbox "barnamenevis"
end function

سلام عليکم
بله همين خطا رو ميده که با توضيحتون مشکل رو حل کردم.


ممنونم