ايران ويج

نسخه‌ی کامل: آموزش ایجاد یک 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 های استاندارد تولید کنید و اونا رو فراخوانی کنین
Linker برای من ارور آرنجمنت میده همه اون کارهارو هم انجام دادم لینکر اصلی رینیم کردم لینکر جدید جاش انداختم DEFرو ساختم اما برنامه موقع کامپایل ارور میده.
چون فایل DEF باید هم نام با نام پروژه باشه نا ارور نده
هم نام بود Project1.def دقیقاً همون کارایی رو که گفتین انجام دادم
میشه راجب Keyword های اولیه یکم توضیح بدین
اونم قصصه ش درازه حتما کامل توضیحش میدم ولی قبل از اون دقت کن که من نام پروژه ای رو که میگم نام فایل نیست بلکه نام پروژه در خود ویژوال بیسیک هست و همچنین اون نامی که فایل Exe باهاش ذخیره میشه
بله منم منظورم همون بود البته خودم مشکل رو حل کردم (از جای دیگه بود)
بعد از حل این مشکل به یه مشکل دیگه بر خوردم که اون رو هم حل کردم بنظرم اگه انجا مشکل و راه حلشو بگم می تونه برای دوستان مفید باشه
وقتی ورودی فانشن DLL استرینگ باشه اونا رو به صورت ؟؟؟؟؟؟ نشون میده که شما باید در ابتدای فانشن DLL استرینگ با کد زیر تبدیل کنید تا بتونید از اون استفاده کنید
کد:
str = StrConv(str, vbUnicode)

تشکر
سلام، با تشكر از مقاله خيلي خوبتون. اگه ممكنه بگيد براي VB.Net چطوري مي شه.
آخه تو مسير نصبش فايل Link.exe پيدا نكردم؟
لطفا در مورد VB.net هم توضيح بدین خیلی واجبه! مرسی
شرمنده. برای VB.NET نمیشه همچین کاری کرد چون اون فقط dll های managed و به عبارتی تحت NET. تولید میکنه.
سلام میدونم تایپک زیر خاکیه.اما احتیاج دارم یاد بگیرم.استاد این کدهارو کجا وارد میکنیم که لینکر جدید بسازیم تا جایگزین کنیم

کد php:
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