‏نمایش پست‌ها با برچسب Programming. نمایش همه پست‌ها
‏نمایش پست‌ها با برچسب Programming. نمایش همه پست‌ها

When would you use the Builder Pattern?

اکثر اوقات برای برنامه نویسایی که شروع به خوندن الگوهای طراحی میکنن این موضوع پیش اومده که میبینن الگوی طراحی که الان درحال خوندنش هستن چقدر آشناست و یا فکر میکنن این الگو رو قبلا خودشون پیاده سازی کردن وحتی  اسمش رو نمیدونستن، اما حالا با خوندن اون هم اسمش رو میدونن و هم طریقه پیاده سازیش در هنگامی که نیاز هست.
مهمترین نکته در فهمیدن الگو ها هم همینه که بدونیم الگو در کجا کاربرد داره و بتونیم الگو را در مکان مناسبش به کار ببریم. در این پست میخوام لینکی رو به اشتراک بزارم که با یک مثال خوب الگوی Builder رو معرفی میکنه. 
برای معرفی الگوی Builder باید بگم که این الگو یکی از الگوهایی است که کم و بیش توی برنامه ها استفاده میشه. به زبان ساده این الگو رو زمانی به کار میبریم که بخواهیم اشیاعی رو درست کنیم که هرکدوم از اشیا دارای خصوصیات زیاد و متفاوت باشن. و همین شرط آخر باعث متفاوت بودن این الگو از الگوی Factory میشه. شکل زیر کلاس دیاگرام این الگو رو نشون میده:



 برای آشنایی بیشتر توجهتون رو به لینکی در سایت Stackoverflow با عنوان When would you use the Builder Pattern جلب میکنم. 
توجه داشته باشید که جواب دوم به این سوال مد نظر هستش وامیدوارم از خوندنش لذت کافی رو ببرید. 

 لینک های دیگر :
آپدیت
کدی که توی لینک نوشته شده بود رو با کمی تغییر به زبان #C برگردوندم و  توی گیت هاب گذاشتم.

\.Chehre

معرفی کتاب Clean Code

آیا این جملات برای شما آشنا هستن:
- این چه کدیه؟ این چه اسم گذاریه افتضاحیه؟ چرا این تابع اینجوریه؟ این چجور کلاس نوشتنیه؟
آیا شده بعد از چند ماه به کد خودتون نگاه کنید و بگید: یعنی من این کدها رو نوشتم؟!

به تصویر زیر نگاه کنید و بگید که کدوم "در" کد شما و یا کدی که دارید روش کار میکنید رو نشون میده و کد شما نسبت به فرمولی که در بالای تصویر نشون داده شده در چه وضعیتی قرار داره؟
 

تصویر بالا در مقدمه کتاب Clean Code نشون داده شده و از خواننده میخواد بگه که کدوم "در" کد خواننده کتاب رو نشون میده. کتاب Clean Code با چند جمله از بزرگان برنامه نویسی درباره کد تمیز شروع میشه، و با نحوه نام گذاری، کامنت گذاری، نحوه صحیح نوشتن توابع و کلاس ها، نحوه نوشتن تست ها و کدهای همروند ادامه پیدا میکنه. و در فصل آخر کتاب، نویسنده جمع بندی داره بر قوانین و روش هایی که در کتاب گفته. کتاب با قوانین و روش هایی که در خودش داره، سعی بر این داره که نتیجه فرمولی که در تصویر بالا(و در مقدمه کتاب) نشون داده شده رو به حداقل برسونه.

همونطور که گفتم، در فصل آخر کتاب، یعنی فصل 17 با عنوان Smells and Heuristics ، نویسنده جمع بندی داره بر قوانین و روش هایی که در کتاب گفته و اگر میخواهید که یک مرور کلی بر کتاب داشته باشید، یا وقت کافی برای خوندن کتاب ندارید، پیشنهاد میکنم این فصل رو حتما مطالعه کنید.

در سایت infoq یک مرور (Review) خیلی خوب درباره کتاب Clean Code نوشته شده که از لینک زیر میتونید بخونیدش:

مشخصات کتاب

نام:
Clean Code: A Handbook of Agile Software Craftsmanship
نویسنده :
Robert C. “Uncle Bob” Martin
درباره نویسنده :
آدرس کتاب در آمازون:

و در آخر امیدوارم از خوندن این کتاب لذت ببرید.
\.Chehre


Some 64 bit Windows notes

چند نکته درمورد ویندوز 64 بیتی

  • نرم افزارهای 32 بیتی در مسیر c:\Program Files (x86)\company name نصب خواهند شد و نرم افزار های 64 بیتی در مسیر c:\Program Files\company name.
  • مسیر windir\System32 برای کتابخانه های 64 بیتی در نظر گرفته شده و کتابخانه های 32 بیتی در پوشه SysWOW64 قرار خواهند گرفت. عبارت WoW64 یعنی Windows 32-bit on Windows 64-bit (ویندوز 32 بیتی در ویندوز 64 بیتی).
  • مسیر HKEY_LOCAL_MACHINE\SOFTWARE در رجیستر برای نرم افزار های 64 بیتی در نظر گرفته شده و وقتی برنامه 32 بیتی در آدرس بالا بنویسد، به صورت خودکار در مسیر  HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node نوشته خواهد شد. برای خواندن هم اگر برنامه 32 بیتی از آدرس اول بخواند، از آدرس دوم برای او خوانده خواهد شد. 

\.Chehre

Migrate a project from Delphi 7 or Delphi XE2 to Delphi XE4

امروز می خواستم یک پروژه که از Delphi 7 به Delphi XE2 ارتقاء داده بودم رو به Delphi XE4 ارتقاء بدم. اما با خطای زیر مواجه شدم :
E2003 Undeclared identifier: ' ShortDateFormat'

خوب اینجور که از سایت شرکت Embarcadero معلوم هست، متغیر هایی مثل ShortDateFormat، DateSeparator، CurrencyString و ... در FormatSettings مجتمع شدن و برای استفاده از اون ها باید به شکل زیر در برنامه نوشته بشن:

FormatSettings.ShortDateFormat := 'dd/MM/yyyy';

اگر هنوز نرم افزارهایی دارید که از Delphi 7 برای برنامه نویسی اون ها استفاده می کنید و اگر در فکر ارتقاء اون ها هستید باید چند نکته رو بدونید:

  • در Delphi 2009 پشیبانی از Unicode به این زبان اضافه شده، و اگر با اون آشنایی ندارید، احتمالا به مشکل بر خواهید خورد. برای اطلاعات بیشتر یا از اینجا White Paper: Delphi and Unicode را دانلود کنید و بخونید و یا بخش اول کتاب Delphi 2009 Handbook رو مطالعه کنید. البته چند لینک مفید هم در آخر معرفی میکنم.
  • اگر از متغیر هایی مثل ShortDateFormat' استفاده می کردید، باید مثل مثال بالا ازشون استفاده کنید.
  • Namespace ها هم به دلفی اضافه شدن. مثلا به جای SysUtils باید و بهتره که بنویسید System.SysUtils و بهتر هست که از این قابلیت در کلاس ها و یونیت های خود استفاده کنید.
  • اگر در شرط هاتون از مجموعه ای از کاراکتر ها (Sets of Characters) استفاده میکردید، به خاطر اینکه قبلا کاراکتر ها Ansi بودن و هر کاراکتر نمایانگر یک بایت بوده میتونستید از شرط زیر استفاده کنید:
if C in ['a'..'z', 'A'..'Z'] then


اما الان چون کاراکتر ها WideChar تعریف شده اند، باید از دستور CharInSet به صورت زیر استفاده کنید:


if CharInSet(C, ['a'..'z', 'A'..'Z']) then

  • و در آخر اگر از کامپوننت های قدیمی استفاده می کنید، به احتمال قوی اون ها از Unicode و توابع جدیدی که به دلفی اضافه شدن، پشتیبانی  نمیکنن و اون ها رو باید ارتقاء بدید.

چند لینک درباره Unicode در دلفی:


\.Chehre

Unobtrusive Ajax stopped working after update jQuery to 1.9.1

چند وقت پیش سعی کردم که یکی از پروژه ها رو از  MVC3 به MVC4 ارتقاء بدم. jQuery را هم به نسخه 1.9.1 ارتقاء دادم اما با خطای زیر مواجه شدم:

Error when entering login page:
Unhandled exception at line 115, column 5 in http://localhost:63180/Scripts/jquery.unobtrusive-ajax.js
0x800a01b6 - Microsoft JScript runtime error: Object doesn't support property or method 'live'

البته من متوجه این خطا نشده بودم، چون ازFirefox به عنوان مرورگر پیشفرض استفاده میکردم. ولی وقتی که  Firebug رو فعال کردم، کنسول پیغام زیر رو نشونم داد:

Type Error: a(...).live is not a function
این بود که با IE برنامه رو تست کردم و خطای اول رو گرفتم.

تابع live در نسخه 1.9.1 حذف شده و نمیشه دیگه از اون استفاده کرد. سایت jQuery  درباره این تابع و تابع جایگزین اون یعنی تابع on اینطور گفته:

As of jQuery 1.7, the .live() method is deprecated. Use .on() to attach event handlers. Users of older versions of jQuery should use .delegate() in preference to .live().
This method provides a means to attach delegated event handlers to the document element of a page, which simplifies the use of event handlers when content is dynamically added to a page. See the discussion of direct versus delegated events in the .on() method for more information. 

البته باید بگم که من فقط jQuery  رو به نسخه 1.9.1 ارتقاء داده بودم و jquery.unobtrusive-ajax رو هنوز ارتقاء نداده بودم. :)

برای حل این مشکل هم یا باید تمامی liveها رو به on تغییر میدادم و یا jquery.unobtrusive-ajax را هم ارتقاء میدادم. خوب بهترین راه حل همون آپدیت jquery.unobtrusive-ajax با nuget بود که منو از شر این خطا راحت کرد.

\.Chehre

Definition of Relation and Table in database design

در زیر تعریف دو واژه که خیلی در طراحی و پیاده سازی پایگاه داده به کار میره و بعضی از برنامه نویسان تعریفی دقیقی از اون ها نمیدونن آورده شده:

Viewpoint: Relational theory 
Name: Relation
Definition:
This term is seldom used by nonacademics, but some theory literature uses this term exclusively to mean what most programmers think of as a table. It consists of rows and columns, with no duplicate rows. There is absolutely no ordering implied in the structure of the relation, neither for rows nor for columns.
Note:Relational databases take their name from this term;the name does not come from the fact that tables can be related.

Viewpoint: Implementation
Name: Table
Definition:
The term table is almost the same as a relation. It is a particularly horrible name, because the structure that this list of terms is in is also referred to as a table. These tables,much like the Excel tables, have order. It cannot be reiterated enough that tables have no order.
Another concern is that a table may technically have duplicate rows. It is up to you as the developer to apply constraints to make certain that duplicate rows are not allowed.
Tables also have another usage, in that the results of a query (including the intermediate results that occur as a query is processing multiple joins and the other clauses of a query) are also called tables, and the columns in these intermediate tables may not even have column names.
Note:This one naming issue causes more problems for new SQL programmers than any other.

منبع: کتاب Pro SQL Server 2008 Relational Database Design and Implementation انتشارات APress فصل 1 صفحه 10.

Inheritance and Polymorphism

تو یکی از وبلاگ ها یک سوال و جواب قشنگ نوشته شده بود که گفتم با منبع براتون بزارم شاید برای شما هم جالب باشه :

"Question: What is the object oriented way of getting rich ?
Answer:  Inheritance."   ( دنیای واقعی :) )

 "Inheritance is new code that reuses old code. Polymorphism is old code that reuses new code."

 PDF (اسلایدها) رو میتونید از لینک زیر دانلود کنید.

 


استفاده از نوع داده Boolean

چند روز پیش یک سوال تو فروم برنامه نویس مطرح شد که برای جنسیت از یک ComboBox استفاده شده  و حالا متغیر مربوط به اون را در کلاس از چه نوعی باید تعریف کرد؟
اکثر جواب ها این بود که از نوع داده Boolean باید استفاده بشه.
من دوحالت را برای سوال بالا در نظر می گیرم:
حالت اول به این صورت در نظر می گیرم که در برنامه ما این سوال وجود داشته باشه که فرد مورد نظر ما مذکر (یا مونث) هست یا خیر؟
همونطور که از سوال پیداست جواب به صورت بله و خیر هست و در این صورت میشه از نوع داده Boolean استفاده کرد و حرفی توش نیست.
اما حالت دوم را با این سوال مطرح می کنم که جنسیت فرد مورد نظر چیست؟
باز هم در اینجا میشه از نوع داده Boolean استفاده کرد، اما شما در همه جای برنامه باید چک کنید و هم به خاطر داشته باشید که مثلا مقدار True برای مذکر ذکر شده (یا مونث). در ضمن از خوانایی کدتون هم  کم میشه.
البته نگاه ما هنوز به حالتی هست که جنسیت فقط دو حالت داشته باشه! برای مثال چند ماه پیش قرار بود بنده یک قطعه کدی برای برنامه یکی از درمانگاه ها بنویسم که در دستورالعملش  برای جنسیت فرد حالت های زیر در نظر گرفته شده بود:
1- مرد
2- زن
3- دوجنسی (نامشخص) //این نامشخص رو خود من هم نفهمیدم اینجا چیکار میکنه :)
4- تعیین نشده
خوب برای حالت بالا چیکار کنیم، یا اگر در آینده به حالت بالا نیاز شد چه کاری باید انجام بشه؟ آیا میشه باز هم از Boolean استفاده کرد؟
 از نظر بنده نوع داده Enum برای تعیین نوع جنسیت و یا موارد مشابه خیلی بهتر هست تا استفاده از Boolean . چون هم خوانایی کد را افزایش میده و هم کار با اون راحته. در ضمن نیازنیست چیزی رو به خاطر بسپریم. و نکته آخر اینکه اگر در آینده مجبور شدیم که از حالت چهار جنسیتی استفاده کنیم، خیلی راحت میتونیم جنسیت ها رو به برنامه اضافه کنیم.

 پ.ن
چند وقت پیش آقای Nick Hodges مطلبی را در وبلاگشون نوشتن با عنوان How Not To Code #2: Don’t Use Boolean Method Parameters که درباره پارامترهای Boolean برای توابع صحبت می کنن و توضیح میدن که چرا نباید از نوع Boolean برا پارامتر های تابع استفاده کنیم. (مطالعه این مطلب رو بهتون پیشنهاد می کنم)

Wiki is so important!

در محل کار جدیدم، به عنوان یه تازه وارد یه چیز بود که خیلی منو آزار داد. به خصوص اینکه من در هر لحضه که چیزی مشنوم، نمیتونم اونو به خاطر بسپرم! قضیه از اینجا شروع شد که در روز اول کاریم مسئولمون اومد و چند تا آدرس شبکه به صورت خلاصه بهم گفت.
بعد از اون یکی از همگروهی ها اومد پیشم و یه آدرس دیگه بهم گفت تا بدونم که مخزن فایل هاشون کجاست.
روز بعدش، مسئول شبکه اومد و یه برگه بهم داد که رمز شبکه ،آدرس میل، و طریقه ورود و آدرس فایلی که راهنمای کار با شبکه بود رو توش نوشته بودن. 
 خوب این ها همش باعث سردرگمی تازه واردی مثل من شد و یکمی طول کشید تا بفهمم چی رو کجا باید پیدا کنم یا با کی برای چه کاری صحبت کنم.
برای حل این مشکل چه راه حلی وجود داره؟
 جواب: Wiki



شرکت ها به راحتی میتونن اطلاعاتی مثل اطلاعات زیر رو تو ویکی قرار بدن:

- نرم افزار های کاربردی با آدرس اون ها
- درایو های مپ شده در شبکه
- لیست راهنماها
- قوانین و مقررات کاری
- FAQ
- قرار ملاقات ها
- آدرس پرتال های داخلی
- ساعت و تاریخ Meeting هایی که در گروه های برنامه نویسی انجام میشه (مثل اسکرام) یا میتینگ های مدیران
- مشخصات مربوط به گروه های مختلف برنامه نویسی (یا بقیه گروه های کاری)

حتی برنامه نویس ها هم میتونن از اون ها استفاده کنن:

- لیست نرم افزار ها و کامپوننت هایی که ساختن
- اطلاعاتی مثل تاریخ ارائه نسخه Alpha و Beta  برای هر نرم افزار
- آدرس برنامه ها در Version Control


پ.ن:در حال حاضر خودم دارم روی TWiki که Open Source هم هست کار می کنم تا روی سایت قرار بدم.
Ahmad.

Keyboard layout changes to default when exiting dbgrid

چند روز پيش يکي از دوستان با من تماس گرفت و سوالي از من کرد.
سوال ايشون اين بود: يک برنامه را مي خواهيم با دلفي 2010 کامپايل کنيم. اين برنامه شامل يک DBGrid و يک کنترل ديگه مثل Edit هستش. حال اگر در زمان اجرا، Layout کيبورد رو عوض کنيم، مثلا به فارسي تغيير بديم و از DBGrid خارج بشيم، Layout کيبورد، هنگام خارج شدن به حالت اولش برمي گرده. حالا چطور ميشه جلوي اين کار رو گرفت.
حالا خود من به اين مشکل برخوردم و به روش زير حلش کردم:
اول به "source\Win32\db" در مسير نصب دلفي بريد، به عنوان مثال
C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\source\Win32\db
فايل DBGrids.pas رو پيدا کنيد و به مسير ديگري کپي کنيد.
در فايلي که کپي کرديد، دنبال پروسيجر "TCustomDBGrid.WMKillFocus" بگرديد. که به صورت زير نوشته شده
procedure TCustomDBGrid.WMKillFocus(var Message: TMessage);
begin
  ImeName := Screen.DefaultIme;
  ImeMode := imDontCare;
  inherited;
  if not ((InplaceEditor <> nil) and
    (HWND(Message.WParam) = InplaceEditor.Handle)) then
    ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);
end;
حالا پروسيجر رو به شکل زير تغيير بديد

procedure TCustomDBGrid.WMKillFocus(var Message: TMessage);
var kblayout: HKL;
begin
  kblayout := GetKeyboardLayout(0);
  ImeName := Screen.DefaultIme;
  ImeMode := imDontCare;
  inherited;
  if not ((InplaceEditor <> nil) and
    (HWND(Message.WParam) = InplaceEditor.Handle)) then
    ActivateKeyboardLayout(kblayout, KLF_ACTIVATE);
end;

حالا بايد اين فايل رو کامپايل کنيد. براي اين کار اين فايل رو در پوشه پروژتون قرار بديد و کل برنامه را Build کنيد.
شاد باشيد.

API

تعريف API
API به معني رابط برنامه کاربردي به مجموعه اي از دستورات گفته مي شود، که رابط بين برنامه ها و پردازنده است.
 معني ديگري که در منابع فارسي گفته شده است: API مجموعه دستوراتي است براي برقراري ارتباط بين اجزاي سيستم عامل و برنامه ها.
API در سيستم عامل ها
سيستم عامل هاي مختلف، API هاي مختلف را ارائه ميدهند و به همين خاطر است که وقتي برنامه نويس ، برنامه خود را با API ويندوز پايه گذاري مي کند، آن برنامه يا نرم افزار در سيستم عامل لينوکس قابليت اجرايي ندارد.
API  سيستم عامل ويندوز Windows API ، لينوکس Xlib و مک Mac OS X) Cocoa) است.

اگر يک جستجوي کوچک درمورد Api ها به زبان فارسي انجام داده باشيد، مي بينيد که در بيشتر مطالبي که درمورد API نوشته شده است، گفته شده است که Mac از Carbon استفاده مي کند.Cocoa يک فريم ورک جديدتر از Carbonاست. تفاوت اين دو را به اين صورت مي توان گفت که Cocoa يک لايه بالاتر از Carbon است و همچنين Carbon  يک فريم ورک به صورت procedural  و   Cocoa‌ يک فريم ورک به صورت object-oriented است. چون ادامه اين مبحث در قالب کلي اين وبلاگ نمي گنجد، بيشتر از اين درباره اين دو نوع API‌صحبت نمي کنم و شما نيز براي اطلاع بيشتر از تفاوت اين دو مي تونيد عبارت " Cocoa vs. Carbon" را جستجو کنيد.

Windows API
Windows API شامل هزاران function ، structure و constant است که ما مي توانيم آن ها را در برنامه تعريف و از آن ها استفاده کنيم. براي اينکه بتوانيم از اين توابع استفاده کنيم، ابتدا بايد آن ها را معرفي کنيم و چون اين توابع با زبان C نوشته شده اند، اين کار کمي پيچيده خواهد بود. در ادامه توضيح داده خواهد شد که زبان هاي برنامه نويسي چگونه اين توابع را در اختيار برنامه نويسان قرار خواهند داد.

API ها را مي توان به سه دسته تقسيم کرد:
•    Kernel
نام کتابخانه آن KERNEL32.DLL است و. قابليت هايي را که سيستم عامل به ما مي دهد را در بر دارد:
-Process loading.
-Context switching.
-File I/O.
-Memory management.

•    User
نام کتابخانه آن USER32.DLL است و براي کنترل نماي کاربري استفاده مي شود:
-Windows
-Menus
-Dialog Boxes
-Icons etc.,

•    GDI
نام کتابخانه آن GDI32.dll است. اين کتابخانه قابليت ايجاد خروجي هاي گرافيکي مانند پنجره ها، منوها و dialog box ها را ارائه ميدهد.
براي اطلاع از تقسيم بندي توابع و نام کتابخانه ها به لينک زير مراجعه کنيد
API و برنامه نويسي
شما قبل از اينکه چگونگي استفاده توابع API را ياد بگيريد، بايد با مفهوم هاي مختلفي مثل شيوه هاي برنامه نويسي managed/unmanaged/Native ، کدهاي safe/unsafe و ... آشنايي داشته باشيد.
پيشتر مطلبي درمورد شيوه برنامه نويسي Native و Managed در اين وبلاگ قرار داده شده بود که در اين آدرس قابل دسترس است.

اکثر زبان هاي پيشرفته برنامه نويسي اين امکان را به برنامه نويس ميدهند که از API ها استفاده کنند. در زبان هاي Native که به صورت مستقيم با API سرو کار دارند مي توان به زبان هاي ++C و Delphi و در زبان هاي Managed به #C و VB.Net اشاره کرد. در ++C دستورات در فريم ورک MFC، Microsoft Foundation Class جاسازي شده است و به همين خاطر ديگر نياز نيست که برنامه نويس تابع ها را تعريف کند.
در ادامه يک مثال از Delphi براي شما آورده شده است و نشان داده شده است که چگونه دلفي توابع API را در دل خود جاي داده است.
محيط دلفي را اجرا کرده ويک پروژه Console ايجاد کنيد و آن را به فرم زير تغيير دهيد.

program TestConsoleDateTime;

{$APPTYPE CONSOLE}

uses
  SysUtils,Windows;

var SystemTime:TSystemTime;
begin
  GetLocalTime(SystemTime);
  Writeln(
  IntToStr(SystemTime.wHour)+':'
  + IntToStr(SystemTime.wMinute) 
  +':'+ IntToStr(SystemTime.wSecond));

  Readln;
end.

اين برنامه ساعت سيستم را نمايش ميدهد. ما در کد بالا به کمک تابع GetLocalTime توانستيم ساعت جاري را بدست بياوريم. حال اگر کليد Ctrl را نگه داريد و روي کد GetLocalTime  در برنامه کليک کنيد، محيط دلفي شما را به صفحه جديدي (کد يونيت Windows)هدايت خواهد کرد. در صفحه جديد کد زير به نمايش در خواهد آمد

procedure GetLocalTime; external kernel32 name 'GetLocalTime';


در اينجا براي دلفي تعريف شده است که با فراخواني پروسيجر GetLocalTime ، تابع GetLocalTime در kernel32.dll فراخواني شود.
همانطور که ديديد دستورات API در داخل دستورات دلفي قرار داده شده اند و ما بدون اينکه آن ها را تعريف کنيم،  و يا از ساختار آن با خبر باشيم مي توانيم از آن ها استفاده کنيم. البته دانستن ساختار و استفاده از کد هاي API براي برنامه نويساني که از زبان هاي برنامه نويسي Native استفاده مي کنند اهميت بالايي دارد.

API در #C
براي استفاده از توابع API در برنامه خود، ابتدا بايد با ساختار توابع آشنا باشيم. به عنوان مثال براي تابع GetLocalTime در MSDN ساختار زير تعريف شده است
procedure void WINAPI GetLocalTime(
  __out  LPSYSTEMTIME lpSystemTime
);

اين تابع خروجي ندارد و ورودي آن (lpSystemTime  ) از نوع SystemTime است که بعد از فراخواني تابع مقداردهي مي شود.
در اين لينک ميتوانيد ساختار SystemTime را مشاهده کنيد.
براي استفاده از تابع بايد ابتدا namespace زير را به Use ها اضافه کنيم
System.Runtime.InteropServices
براي استفاده از يک تابع بايد آن را به برنامه معرفي کنيم که براي تابع GetLocalTime به صورت زير است
[DllImport("kernel32.dll")]
public static extern void GetLocalTime(out Win32.DateTime.SystemTime systemTime);
DllImport براي  فراخواني کتابخانه هاي مديريت نشده (Unmanaged) به کار برده مي شود. در اينجا کتابخانه kernel32.dll معرفي شده است.
extern براي فراخواني توابعي که در خارج اجرا مي شوند به کار مي رود که در اين مورد حتما بايد با واژه static همراه باشد. اين واژه معمولا در هنگامي که از DllImport استفاده مي شود و قرار است کد Unmanaged اجرا شود به کار ميرود.
SystemTime يک ساختار است. که به صورت زير در برنامه تعريف ميکنيم
[StructLayout(LayoutKind.Sequential)]
public struct SystemTime
{
 public ushort Year;
 public ushort Month;
 public ushort DayOfWeek;
 public ushort Day;
 public ushort Hour;
 public ushort Minute;
 public ushort Second;
 public ushort Milliseconds;
}

حال براي فراخواني تابع به روش زير عمل مي کنيم:

SystemTime sysTime;
GetLocalTime(out sysTime);
MessageBox.Show(System.String.Format("{0}:{1}:{2}", sysTime.Hour, sysTime.Minute,sysTime.Second));

در خط اول متغير sysTime از نوع SystemTime تعريف شده است. در خط دوم تابع GetLocalTime فراخواني شده است که در آن متغير sysTime به عنوان آرگومان خروجي داده شده است و در خط سوم تاريخ نمايش داده شده است.

براي آشنايي بيشتر يک نمونه برنامه در لينک زير قرار داده شده است
لينک يک  Win32API.7z
يا

لينک دو Win32API.7z

تصويري از نماي برنامه

Native vs. Managed

,در اين پست سعي کردم که يک نگاه کلي به کد هاي Native و Managed بوجود بيارم. براي اطلاعات بيشتر و دقيق تر مي تونيد به منابعي در آخر پست ذکر شده مراجعه کنيد.


Managed
کد Managed به کدي که کامپايلر دات نت توليد مي کند گفته مي شود. وقتي شما يک برنامه را در دات نت کامپايل مي کنيد، اين کد به Intermediate Language  تبديل مي شود. IL کد بين زبان سطح بالا مثل #C و کد زبان ماشين است. IL در فايل هاي assembly ذخيره مي شود، که به تنهايي قابليت اجرا ندارند. Common Language Runtime وظيفه اجراي اسمبلي ها را به عهده دارد. يعني اسمبلي در CLR اجرا ميشود. بعد از اين که CLR ، صحت IL را تاييد کرد، Just In Time  را فراخواني مي کند تا کد IL را به کد ماشين تبديل کند.
وقتي CLR اسمبلي را اجرا مي کند سرويس هاي مختلفي را براي آن در نظر مي گيرد، مانند: امنيت ، مديريت حافظه و رم و ...
وجود CLR اين امکان را ميدهد که کد IL بر روي هر سيستم عاملي که داراي CLR است به اجرا درآيد.


زبان هايي مثل  C#، VB.Net، C++.Net کد هاي Managed توليد مي کنند.
جاوا نيز يکي ديگر از زبان هايي است که Managed هستند. در اين زبان bytecode ها توسط  Java Virtual Machine  اجرا مي شوند.

مزايا و معايب:
مزايا:
    Portable – runs on any platform with a CLR
    Easier to write
معايب
    Can run slower
    May require more system resources
Native
کد هاي Native برخلاف کد هاي Managed به کد ماشين تبديل ميشوند و توسط پردازنده اجرا ميشوند و نيازي به Runtime براي اجرا ندارند.
وقتي به شيوه Native کد نويسي مي کنيد، بعضي از قابليت هايي که Managed ارائه ميدهد را از دست مي دهيد، مانند مديريت حافظه. به عنوان مثال بعد از اينکه يک Object  را در برنامه بوجود آورديد، بايد آن را Free کنيد، که اين عمل در دات نت به وسيله Garbage Collection انجام مي شود.
يکي از معايب ديگري که کد Native نسبت به Managed داراست، مسئله اجرا در Platform هاي مختلف است. به عنوان مثال وقتي شما برنامه را در ويندوز کامپايل مي کنيد ، کد توليد شده (EXE)  فقط در ويندوز اجرا خواهد شد.
البته اين بدان معني نيست که شما با کد Native نميتوانيد Cross-Platform برنامه بنويسيد. هم اکنون فريم ورک هايي وجود دارند که وقتي شما کد را مينويسيد، کد شما را به API سيستم عامل هاي ديگر تبديل مي کنند.


زبان هايي مثل ++C  و Delphi کد هاي Native  توليد مي کنند.
مزايا و معايب
مزايا:
    Fast performance
    Smallest footprint

معايب
    More complex to write
    Dependent on specific platform
managed data
Managed Data داده هايي هستند که توسط GarbageCollection  مديريت مي شوند.
وقتي شما با #C که کد Managed توليد مي کند برنامه نويسي مي کنيد، مصرف حافظه براي داده ها به وسيله  GarbageCollection   مديريت مي شوند. اما وقتي شما با  ++C در دات نت برنامه نويسي مي کنيد، دات نت اين اختيار را به شما مي دهد که حافظه را CLR با GarbageCollection   مديريت کند يا خود شما مديريت حافظه را در دست بگيريد. در حالت پيش فرض مديريت حافظه به عهده شماست و براي اينکه مديريت را به دات نت بسپريد ، بايد از کلمه کليدي gc__ استفاده کنيد. براي درک بهتر به مثال زير توجه کنيد:

Unmanaged Data
class Ta
{
 private:
 int a;
}

Managed Data
__gc class Ta
{
 private:
 int a;
}
منابعي که براي اطلاعات بيشتر مي توانيد به آن ها مراجعه کنيد:


جستجو