برنامه نویسان ویژوال بیسیک تا قبل از ورود دات نت بسیار به توابع API وابسته بودند. به علت این که ویژوال بیسیک توابع و کلاسهای آماده بسیار کمی رو عرضه میکرد و حتی کنترلهای عمومی ویندوز رو هم به صورت بسیار ناقصی پشتیبانی میکرد، از این رو به وفور در برنامهها از توابع API استفاده میشد.
اما در دات نت وضع بدین گونه نیست و شما میتونید از دریای کلاسها و توابع موجود در دات نت فریم ورک بهره بگیرید. بسیاری از اعمالی رو که در گذشته با مشقت فراوان و با استفاده از توابع API و به شکل نامطمئنی انجام میدادیم امروز به سادگی انجام پذیر است.
با این حال باز هم اگرچه بندرت ولی در مواردی ناچار به استفاده از این توابع خواهیم بود.
همون طور که میدونیم نخستین قدم برای استفاده از یک تابع API اعلام و وارد کردن اون تابع به برنامه است. در VB.NET دو راه برای اعلام یک تابع API وجود دارد. یکی استفاده از عبارت کلیدی Declare و دیگری استفاده از خصوصیت DllImport.
استفاده از Declare تا حد زیادی مشابه قبل میباشد لیکن برخی تفاوتهای جزئی نیز وجود دارد.
یکی از این تفاوتها این است که در گذشته اعلام این توابع با دسترسی سراسری تنها در ماژولهای استاندارد (*.bas) ممکن بود ولی در دات نت میتوان یک تابع API رو درون هر کلاسی و با دسترسی Public اعلام کرد.
تفاوت دیگری که میتوان اشاره کرد این است که اگر احیانا خواستید یک تابع قدیمی رو به دات نت تبدیل کنید تمام متغیرهای از نوع Long رو باید به Integer تبدیل کنید. به عبارت دیگر در دات نتInteger برابر Long در VB6.0 است.
در مورد استفاده از رشتهها و ساختارها تفاوتهای عمدهای وجود داره که اگر کسی مایل بود بعدا مختصری در مورد اون با هم صحبت خواهیم کرد. توی MSDN توضیحات کاملی در این زمینه وجود داره.
این یک مثال برای چگونگی اعلام یک تابع API در VB.NET است:
:
کد:
Declare Function MoveFile Lib "kernel32.dll" Alias "MoveFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String) As Integer
روش دوم استفاده از DllImport است. این Attribute یک تابع در برنامه ما را به یک تابع داخل Dll منسوب میکند. برای بهره گیری از این خصوصیت باید فضای اسمی System.Runtime.InteropServices به صدر ماژول اضافه شود. این Attribute در کلاس DllImportAttribute قرار دارد.
شکل اعلام یک تابع با استفاده از این روش را در این مثال ملاحظه میکنیم.
کد:
کد:
<DllImport("KERNEL32.DLL", EntryPoint := "MoveFileW", _
SetLastError := True, CharSet := CharSet.Unicode, _
ExactSpelling := True, _
CallingConvention := CallingConvention.StdCall)> _
Public Shared Function MoveFile(src As String, dst As String) As Boolean
' Leave function empty - DLLImport attribute forwards calls to MoveFile to
' MoveFileW in KERNEL32.DLL.
End Function
در C#:
کد:
[DllImport("KERNEL32.DLL", EntryPoint = "MoveFileW",
SetLastError = true, CharSet = CharSet.Unicode,
ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
public static extern bool MoveFile(string src,string dst);
بدنه تابع خالی میماند و محتوای اون بوسیله DllImport فراخوانده میشود آرگومان اول که نام Dll رو معین میکنه و ارگومان دوم که نقطه ورودی تابع موردنظر رو تعیین میکنه آرگومانهای ضروری هستند و بقیه را میتوان درج نکرد. ولی بهتر است که از همین ترکیب پیروی شود.
به نظر من استفاده از روش دوم بهتره. چرا که روش دوم با اندک تغییراتی در سایر زبانهای دات نت هم کاربرد داره.
از این آدرس میتونید نرمافزاری رو دریافت کنید که اعلام اکثر توابع API رو به زبانهای مختلف در خودش داره.
http://www.activevb.de/rubriken/apiv...viewereng.html