Kodbank İndir

! CODEBANK 2012 !

İNDİRMEK&DETAYLI BİLGİ ALMAK İÇİN BURAYI TIKLAYINIZ.

ÖNEMLİ AÇIKLAMA: MUTLAKA OKUYUNUZ!

Gönderen Konu: API Fonksiyonlarını Deklare Edip Kullanmak(*)  (Okunma sayısı 2569 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Memik_

  • Yeni Üye
  • *
  • İleti: 13
  • Rep: +0/-4
  • Cinsiyet: Bay
API Fonksiyonlarını Deklare Edip Kullanmak(*)
« : 24 Şubat 2007 12:01:54 »
Bildiğiniz gibi Delphi’de API fonksiyonlarını kullanmak son derece kolaydır. Çünkü Delphi ile gelen Windows ve ShellApi gibi bir kaç Unit sayesinde Api fonksiyonlarını Delphi fonksiyonuymuş gibi kullanmak mümkün olmaktadır.
Bu makelede Delphi’nin API fonksiyonlarının kullanımını kolaylaştıran Unit’lerinden yararlanmadan nasıl kullanılabileceğini GlobalMemoryStatus() fonksiyonu üzerinde anlatmayı deneyeceğim. Delphi projelerinde Windows’un GlobalMemoryStatus() fonksiyonundan yararlanıp kullanılan bilgisayarın belleği hakkında bilgi edinebilirsiniz.
 
Tahmin edebileceğiniz gibi Windows’un API fonksiyonları C dili ile yazılmıştır. Bu nedenle bu fonksiyonları Turbo Delphi projesi dahilinde kullanabilmek için Delphi’ye uyarlamak gerekmektedir. Borland programcıların API fonksiyonlarını kolay kullanabilmesini sağlamak birkaç Unit hazırlamıştır. Windows adlı Unit bunlardan birisidir. Windows.pas adlı kod dosyasında yüzlerce API fonksiyonu hakkında bilgi bulabilirsiniz. Aşağıda verdiğim satırı Windows.pas dosyasından aldım.
 
Kod: [Seç]
[color=blue]procedure GlobalMemoryStatus(var lpBuffer: TMemoryStatus); stdcall;[/color]
Verilen satırdan tespit edebileceğiniz gibi Windows’un GlobalMemoryStatus fonksiyonu TMemoryStatus tipinde bir parametreye sahiptir. TMemoryStatus adı verilen bu yapının orijinal halini aşağıda görebilirsiniz.
 
Kod: [Seç]
typedef struct _MEMORYSTATUS {
    DWORD dwLength;       
    DWORD dwMemoryLoad;
    DWORD dwTotalPhys;     
    DWORD dwAvailPhys;   
    DWORD dwTotalPageFile;
    DWORD dwAvailPageFile;
    DWORD dwTotalVirtual;
    DWORD dwAvailVirtual;
} MEMORYSTATUS, *LPMEMORYSTATUS; 

Delphi projelerinde Windows’un GlobalMemoryStatus fonksiyonunu kullanabilmek için bu yapının Delphi’ye dönüştürülmesi gerekir. Başka bir deyişle C’de Struct olarak yapılan tanımlananın Delphi’de Record olarak yapılması gerekmektedir. Bu hazırlık Delphi ile gelen Windows.pas adlı Unit’te yapılmış olduğu için sizler GlobalMemoryStatus fonksiyonun gerek duyduğu tipi hazırlamak zorunda değilsiniz.
 
Kod: [Seç]
type
 PMemoryStatus = ^TMemoryStatus;
 _MEMORYSTATUS = record
    dwLength: DWORD;
    dwMemoryLoad: DWORD;
    dwTotalPhys: DWORD;
    dwAvailPhys: DWORD;
    dwTotalPageFile: DWORD;
    dwAvailPageFile: DWORD;
    dwTotalVirtual: DWORD;
    dwAvailVirtual: DWORD;
 end;
Kod: [Seç]
procedure TForm1.Bellek_durumuClick(Sender: TObject);
Var
 Bellek : TMEMORYSTATUS;
begin
 GlobalMemoryStatus(Bellek);
 Edit1.Text := IntToStr(Bellek.dwTotalPhys div 1024 div 1024) +' MB';
 Edit2.Text := '%' + IntToStr(Bellek.dwMemoryLoad);
 Edit3.Text := IntToStr(Bellek.dwAvailPhys Div 1024 Div 1024) +' MB';
end;
Kod: [Seç]
unit Unit1;
interface
uses
 Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, ExtCtrls, Menus;
Type
 TBELLEK_DURUMU = record
    dwLength: LONGINT;
    dwMemoryLoad: LONGINT;
    dwTotalPhys: LONGINT;
    dwAvailPhys: LONGINT;
    dwTotalPageFile: LONGINT;
    dwAvailPageFile: LONGINT;
    dwTotalVirtual: LONGINT;
    dwAvailVirtual: LONGINT;
 end;
type
 TForm1 = class(TForm)
    procedure FormClick(Sender: TObject);
 private
 public
 end;
var
 Form1: TForm1;
Kod: [Seç]
implementation
Function GlobalMemoryStatus(Var Bellek : TBELLEK_DURUMU): Integer;
         StdCall; External 'Kernel32.dll';
{$R *.dfm}
Kod: [Seç]
procedure TForm1.Bellek_durumuClick(Sender: TObject);
Var
 Bellek : TBELLEK_DURUMU;
begin
 GlobalMemoryStatus(Bellek);
 Edit1.Text := IntToStr(Bellek.dwTotalPhys div 1024 div 1024) + ' MB';
 Edit2.Text := '%' + IntToStr(Bellek.dwMemoryLoad);
 Edit3.Text := IntToStr(Bellek.dwAvailPhys Div 1024 Div 1024) + ' MB';
end;
Kod: [Seç]
implementation
Function Bellek_bilgisi(var Bellek :TBELLEK_DURUMU): Integer;
      StdCall; external 'kernel32.dll' Name 'GlobalMemoryStatus';
{$R *.dfm}
procedure TForm1.Bellek_durumuClick(Sender: TObject);
Var
   Bellek : TBELLEK_DURUMU;
begin
   Bellek_bilgisi(Bellek);
   Edit1.Text := IntToStr(Bellek.dwTotalPhys div 1024 div 1024) + ' MB';
   Edit2.Text := '%' + IntToStr(Bellek.dwMemoryLoad);
   Edit3.Text := IntToStr(Bellek.dwAvailPhys Div 1024 Div 1024) + ' MB';
end;
« Son Düzenleme: 24 Şubat 2007 13:00:12 by Fatih »
Memik YANIK - www.memikyanik.com

Çevrimdışı Win32

  • Yeni Üye
  • *
  • İleti: 6
  • Rep: +0/-0
Ynt: API Fonksiyonlarını Deklare Edip Kullanmak(*)
« Yanıtla #1 : 28 Ocak 2010 18:27:55 »
Ellerine sağlık Memik Hocam!!

Çevrimdışı ultrahalo

  • Yeni Üye
  • *
  • İleti: 10
  • Rep: +0/-0
Ynt: API Fonksiyonlarını Deklare Edip Kullanmak(*)
« Yanıtla #2 : 08 Şubat 2010 09:30:28 »
ellerine sağlık hocam.hocam kendimize ait APİ oluşturabilirmiyiz ve nasıl oluşturabiliriz?

Çevrimdışı sabanakman

  • Global Moderatör
  • *****
  • İleti: 769
  • Rep: +13/-0
  • Cinsiyet: Bay
Ynt: API Fonksiyonlarını Deklare Edip Kullanmak(*)
« Yanıtla #3 : 09 Şubat 2010 14:33:04 »
Yazarsan olur ;) . Şaka bir yana API fonksiyonu dediğimiz şey .dll içinde hazır sunulan fonksiyondan ibarettir. .dll nasıl yazılır bu konuda araştırma yaparsanız daha fazla bilgi edinebilirsiniz. Sistem programlama konusunda ise çok daha fazla araştırma yapmak gerekecektir :) .
« Son Düzenleme: 09 Şubat 2010 14:47:17 by sabanakman »
Şaban Şahin AKMAN

Derin olan kuyu değil kısa olan iptir