PDA

View Full Version : مبتدی: استفاده از توابع DLL



qhoqnose
چهارشنبه 28 مهر 1389, 08:13 صبح
سلام
اقا من تو ویژال بیسیک تازه کارم ، اگه ممکنه یه نفر در مورد توابع DLL و Activex یکم توضیح بده و نحوه استفاده از اون را هم بگه
اقا شرمنده این سوالات پیش پا افتاده رو مطرح میکنم ولی هرکاری کردم نتونستم بفهمم
ممنون از راهنمائیتون
:خجالت:

parsiyan_mohsen
چهارشنبه 28 مهر 1389, 11:06 صبح
با سلام و احترام
آموزش ایجاد یک Dll استاندارد :
--------------------------------------------------------
اگر بخواهیم در ویژوال بیسیک یک Dll درست کنیم که مثلا Dll ما (با نام MyDll.Dll) یک تابع با نام Jam_Kon داشته باشه و بعد بتونیم اونو به صورت زیر فراخونی کنیم خوب راه حلش رو در پایین کاملا توضیح دادم :

Private Declare Function Jam_Kon Lib "MyDll.dll" (ByVal N1 As Long, ByVal N2 As Long) As Long
اما ویژوال بیسیک همچین امکانی رو در اختیار ما قرار نمیداد و دلیلش اینه که:

همون Dllی که در بالا مثال زدم رو فرض کنید که یک تابع با نام Jam_Kon داشت
بزارید اول این Dll رو که در ویژوال بیسیک Compile کردیم رو یک نگاه بکنیم
خوب وقتی که PE این Dll رو بررسی میکنیم به این نتایج میرسیم
البته این کارو با نرم افزارهای مختلفی میتونین انجام بدین از جمله PE Explorer یا Binary File Dumper یا همون برنامه Debugger معروف OllyDebug (البته این برنامه در زمینه بررسی و Edit فایلهای اجرایی همه کاری انجام میده و بیشتر مورد استفاده ه . ک . ر . ه . ا قرار میگیره) بگذریم.


Dump of file MyDll.dll

File Type: DLL

Section contains the following exports for MyDll.dll

0 characteristics
41B9E52C time date stamp Fri Dec 10 10:04:28 2004
0.00 version
1 ordinal base
4 number of functions
4 number of names

ordinal hint RVA name

1 0 0000192E DllCanUnloadNow
2 1 00001902 DllGetClassObject
3 2 00001918 DllRegisterServer
4 3 000018EC DllUnregisterServer

Summary

1000 .data
1000 .reloc
1000 .rsrc
1000 .text

میبینید علاوه بر اینکه ما یک تابع با نام Jam_Kon داشتیم ولی نمیتونیم اونو در لیست توابع مون اینجا ببینیم
خوب دلیل اینکه چرا نمیتونیم این تابع رو ببینیم بر میگرده به ساختار فایل Link.Exe در پوشه ویژوال بیسیک
وقتی که لینکر Dll در VB رو با لینکر ++VC مقایسه میکنیم میبینیم که ویژوال بیسیک برای Compile کردن Dll ها اقدام به ایجاد فایل (module definition (.def نمیکنه در صورتی که بقیه این کارو میکنن
پس ما اولین کاری که باید بکنیم اینه که اول Linker اولیه ویژوال بیسیک رو شبیه سازی کنیم برای شبیه سازی به اطلاعات زیر نیاز داریم (این اطلاعات همون Keyword های اولیه هستن که به اونا نیاز 100% هست)


Beginning execution at 12/11/2004 12:44:33 PM

Command line parameters to LINK call:
"C:\Program Files\Microsoft Visual Studio\VB98\Class1.OBJ"
"C:\Program Files\Microsoft Visual Studio\VB98\Project1.OBJ"
"C:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB"
/ENTRY:__vbaS
/OUT:"C:\Program Files\Microsoft Visual Studio\VB98\Project1.dll"
/BASE:0x11000000
/SUBSYSTEM:WINDOWS,4.0 /VERSION:1.0
/DLL
/INCREMENTAL:NO /OPT:REF /MERGE:.rdata=.text /IGNORE:4078

Calling LINK linker

Returned from linker call

خوب در مرحله آخر به جایگزینی Link.Exe خودمون با Link.Exe ویژوال بیسیک میکنیم اما قبل از اون باید نام Link.Exe قدیمی رو به linklnk.exe تغییر بدیم
با این کار ما مییاییم برنامه linklnk.exe رو توسط Link.Exe خودمون فراخونی میکنیم
من این فایل رو که ساختارش همون ساختار فایل قبلی هست با فرق اینکه یک Command با نام /DEF بهش اضافه شده رو ضمیمه میکنم.
در این مرحله ویژوال بیسیک شما قادره که Dll های Standard رو براحتی تعریف کنه
حالا برای تست کردن, یک پروژه ActiveX Dll رو باز کنین خوب وقتی که این کارو میکنین سعی بشه کلاسی که به صورت اتوماتیک ویژوال بیسیک به پروژه اضافه کرده کاری نداشته باشین و یک Module به پروژه اضافه کنین و کد زیر رو داخلش بزارین


Public Const DLL_PROCESS_DETACH = 0
Public Const DLL_PROCESS_ATTACH = 1
Public Const DLL_THREAD_ATTACH = 2
Public Const DLL_THREAD_DETACH = 3

Public Function DllMain(hInst As Long, fdwReason As Long, _
lpvReserved As Long) As Boolean
Select Case fdwReason
Case DLL_PROCESS_DETACH
' هست عمليات لازم بايد انجام شود Dll يک پروسس در حال جدا شدن هست

Case DLL_PROCESS_ATTACH
' هست عمليات لازم بايد انجام شود Dll يک پروسس در حال لود کردن
DllMain = True

Case DLL_THREAD_ATTACH
' در حال وصل شدن است thread يک

Case DLL_THREAD_DETACH
' در حال خارج شدن است thread يک

End Select
End Function

'دو عدد رو با هم جمع ميکنه
Public Function Jam_Kon(ByVal N1 As Long, ByVal N2 As Long) As Long
Jam_Kon = N1 + N2
End Function

و حالا هر بار که خواستید یک Dll رو برنامه نویسی کنید باید یک فایل با پسوند (Def.) و با همان نام پروژه خودتون درست کنین (یعنی در اینجا که نام پروژه من MyDll هست باید یک فایل با نام MyDll.Def داشته باشم) و درونش این مقادیر رو کپی میکنید و اونو در مسیر پروژه کپی کنید(این کارو با NotePad هم میتونین انجام بدین)


NAME MathLib
LIBRARY MathMod
DESCRIPTION "Add-on Library of Mathematical Routines"
EXPORTS DllMain @1
Jam_Kon @2

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

Private Declare Function Jam_Kon Lib "MyDll.dll" (ByVal N1 As Long, ByVal N2 As Long) As Long
برای فراخوانی Dll تون استفاده کنین از این به بعد شما قادر هستید Dll های استاندارد تولید کنید و اونا رو فراخوانی کنین.

امیدوارم به دردت خورده باشه.

با تشکر

qhoqnose
چهارشنبه 28 مهر 1389, 14:40 عصر
اقا parsiyan_mohsen
دستت درد نکنه واقعا توضیحتون کامله، همونطوری که گفتم من تو ویژال بیسیک مبتدی هستم و مطالبی که گفتید هر چند در سطح حرفه ای است ولی خب حداقل فکر میکنم یه نقطه شروع برام شده
بازم بخاطر راهنمائی کاملتون ممنون
:لبخندساده: