Jump to content

Dllcall Komutu Ve Kullanım Yerleri


SimpsoN_Bart
 Share

Recommended Posts

[b][font=Tahoma]İstek üzerine DllCall komutunu ve kullanım yerlerini,sizlere kendimce basit olarak anlatmaya çalışacağım ilgili arkadaşlar konuyadestek verirse çok daha yararlı bir paylaşım olacağına inanıyorum.Bu kod autoitprojelerinde yeri önemlidir.Programlamaya ilgilenen arkadaşlar bu tarz kodlaragenelde ihtiyaç duyarlar. Bu tarz kodları aktif olarak kullanmak için Sistemkaynaklarını ve API* leri bilmek gerektiğini düşünüyorum.En basit olarakgörülen yerleri kütüphaneler ve hali hazırdaki fonksiyonlardır.Genelde WinAPIve GDIPlus gibi sistem kütüphanelerinden dll çağırılarak bu tarz fonksiyonlaryazılabilir.[/font][/b]

[left][u]DllCall:[/u][/left]
[b][font=Tahoma]Adı üstünde olduğu gibi dinamik olarak Dll* çağırma işlemiolarak bu kodu açıklayabiliriz.[/font][/b]

[b][size=4][u]Kullanım:[/u][/size][/b]
[b][font=Tahoma]DllCall ( "dll", "return type","function" [, type1, param1 [, type n, param n]] )[/font][/b]

[left][b][font=Tahoma]Bu şekilde yazım şekli var bunun yanında en büyük sıkıntı [/font][/b][b][font=Tahoma]yaşanılan yer parametre olayı.Hangi dll hangi parametre ile nerde nasıl [/font][/b][b][font=Tahoma]çalıştığını programcılar az çok bilir bunlar genelde microsoftun msdn [/font][/b][b][font=Tahoma]kütüphanelerinden bulabilirsiniz ama ben burada hazır olarak kod vereceğimden [/font][/b][b][font=Tahoma]az çok mantığını anlayacağınızı ve hangi dll nerde çağırıldığını öğrenmiş [/font][/b][b][font=Tahoma]olacaksınız.Bu arada altını çizerek belirtmek isteğim yer ise bu kod tek başına [/font][/b][b][font=Tahoma]fazla bir şey ifade etmiyor bunların yanında DllOpen,[/font][/b][b][font=Tahoma]DllClose, [/font][/b][b][font=Tahoma]DllStructCreate, DllStructGetData vs gibi kodları da [/font][/b][b][font=Tahoma]bilmeniz şart gibi gözüküyor ancak o zaman iyi bir şekilde konuyu [/font][/b][b][font=Tahoma]anlayabilrisiniz en azından ben böyle düşünüyorum.Bu kodların kullanım [/font][/b][b][font=Tahoma]yelpazesi geniştir bunu bilin yani [img]http://www.tnctr.com/public/style_emoticons/default/smile.gif[/img][/font][/b][/left]
[b][font=Tahoma]Help dosyasında da benim bu yazdıklarım ile üç aşağı beş yukarı aynı konuyu uzatmayalım parametre ve geçerli türleri help dosyasından ulaşabilirsiniz. [/font][/b]

[b][size=3][font=Tahoma][u]Sistem kütüphane ve API türlerindenbildiğim birkaç örnek:[/u][/font][/size][/b]

[size=4][b][font=Tahoma]user32.dll [/font][/b][/size]
[size=3][b][font=Tahoma]Windows kullanıcı arabirimi(Pencere taşıma, temel UI işlevleri ve) ilgiliWindows API fonksiyonları içeren bir modüldür.En cok kullanılanve geniş kapsamlı bir dll' dir.[/font][/b][/size]

[size=4][b][font=Tahoma]Kernel32.dll[/font][/b][/size]
[size=3][b][font=Tahoma]Microsoft Windows'un en önemliişlevsel çekirdek bağlantısını sağlayan modüldür.Sistem çekirdeği çoğukütüphaneyi ve apileri birbirine bağlar. Kernel32.dll dosyası bellekyönetimi, giriş / çıkış işlemleri ve kesmeleri ele alır.[/font][/b][/size]

[size=4][b][font=Tahoma]winmm.dll[/font][/b][/size]
[size=3][b][font=Tahoma]Bu dll düşük seviye sesve joystick fonksiyonları içeren Windows Çokluortam API içinbir modüldür.Bu modül ile ses çaldırma vs gibi işlemler yapılır.[/font][/b][/size]

[size=4][b][font=Tahoma]psapi.dll[/font][/b][/size]
[size=3][b][font=Tahoma]Bu modül işlem durumu içindestek sağlayan bir kütüphane dosyasıdır.Kernel ile kullanıldığındadoğru parametre ile ram optimizasyon işlemleri bile yapabilirsiniz.[/font][/b][/size]

[size=4][b][font=Tahoma]GDI32.dll[/font][/b][/size]
[b][size=3]Bu dll basit 2 boyutlunesneler yaratmak ve Windows pencereleri yardımcı GDI (grafik aygıt arabirimi) fonksiyonları içerir.Grafik ileilgili olduğu için en çok sevdiğim apidir ayrıca üye başlığım GDI Plus Plus dır.[/size][/b][font=Tahoma] [/font][img]http://www.tnctr.com/public/style_emoticons/default/smile.gif[/img]

[size=4][b][font=Tahoma]wininet.dll[/font][/b][/size]
[size=3][b][font=Tahoma]Windows uygulamaları tarafındankullanılan Internet ile ilgili işlevlerini içeren bir modüldür.[/font][/b][/size]

[size=4][b][font=Tahoma]Shell32.dll[/font][/b][/size]
[size=3][b][font=Tahoma]Web sayfaları ve dosyalarıaçarken kullanılan Windows Shell API fonksiyonlarını içerenbir kütüphanedir. İşletim sistemi modifiye ile uğraşan arkadaşlar iyibilir.[/font][/b][/size]

[size=3][b][font=Tahoma]Şimdi çalışmalarınız dakullanabileceğiniz örnek kodlara geçelim.Elimden geldiğince fonksiyon şeklindeyazmaya çalışacağım bu şekilde daha iyi anlayabilecek ve çalışmalarını dasadece değişkenleri yazarak daha kolay kullanabileceksiniz.[/font][/b]

[b][font=Tahoma]Burada ki kod ile yaptığımız işlemuser32.dll kütüphanesini MessageBox parametresi altında çağırarak basit olarakmesaj cıktısı almamızdır.Help dosyasındaki ilk örneğin fonksiyon şeklindeyazılmış halidir.[/font][/b][/size]

[codebox]_MsgBox(64, "Bilgi", "İlk Çalışmamız" & @CRLF & @CRLF & "Telif Hakkı © " & @YEAR & " - " & @UserName)

Func _MsgBox($MsgBoxType, $MsgBoxTitle, $MsgBoxText, $MainGUI = 0)
$RTN = DllCall("user32.dll", "int", "MessageBox", _
"hwnd", $MainGUI, _
"str", $MsgBoxText, _
"str", $MsgBoxTitle, _
"int", $MsgBoxType)
Return $RTN[0]
EndFunc ;==>_MsgBox
[/codebox]

[font=Tahoma][b]Farklı bir örnek daha verelim Yine user32.dll kullanarak güvenli mod da olupolmadığınızı bu fonksiyonla anlayabilirsiniz[/b][/font]

[codebox]
If _Safe_Mode_Check() Then MsgBox(64, "Güvenli Mod", "Şimdi Güvenli Mod'dasınız.")

Func _Safe_Mode_Check()
Local $RTN = DllCall("user32.dll", "int", "GetSystemMetrics", "long", 67)
Return $RTN[0]
EndFunc ;==>_Safe_Mode_Check
[/codebox]

[b][font=Tahoma]Bu örnekte _Ispressed fonksiyonunu en basit halagetirdim.Kısaca form esc tuşuna bastığınız da formu kapatır.Başka bir tuş ilebaşka bir işlem de yaptırabilirsiniz.[/font][/b]

[codebox]
Local $GUI = GUICreate("Test", 300, 143, 192, 124)
Local $EXIT = GUICtrlCreateButton("Çıkış Yap", 64, 80, 137, 25)
GUISetState(@SW_SHOW)

While 1
Local $ESC = DllCall("User32.dll", "short", "GetAsyncKeyState", "int", 0x1B);Esc tuşu daha fazlası için _IsPressed fonksiyonunu inceleyin
If $ESC[0] <> 0 Then Exit
Switch GUIGetMsg()
Case -3, $EXIT
Exit
EndSwitch
WEnd
[/codebox]
[b][font=Tahoma]Oturumu kitlemek için basit bir fonksiyon aslında buradadeğişkeni döndürmeye gerek yok ama böyle orj duruyor [img]http://www.tnctr.com/public/style_emoticons/default/tongue.gif[/img][/font][/b]

[codebox]
Func _SK_LOGON_TEST()
Local $RTN = DllCall("user32.dll", "Int", "LockWorkStation")
Return $RTN[0]
EndIf
EndFunc ;==>_SK_LOGON_TEST
[/codebox]

[b][font=Tahoma]Burada caps lock tuşu açıksa, tuş kapatılana kadar hatamesajı verdirdik .İsteğiniz anahatarı girip farklı işlemler yaptırabilirsiniz.[/font][/b]

[codebox]
While _Key_Detect("14") <> 0
MsgBox(16, "Capslock açık!", "Lütfen CapsLock Tuşunu Kapatın")
WEnd

Func _Key_Detect($HexKey, $DLL = 'user32.dll')
Local $RTN = DllCall($DLL, "short", "GetKeyState", "int", '0x' & $HexKey)
If Not @error And BitAND($RTN[0], 0xFF) = 1 Then Return 1
Return 0
EndFunc ;==>_Key_Detect
[/codebox]

[b][font=Tahoma]Şimdi Farklı bir Dll den görüntü almak için işlem çağıralım.[/font][/b]

[codebox]
; Tam Ekran Görüntüsü Almak için
; Parametreler - Dosyaismi - jpeg kalitesi
DllCall("captdll.dll", "int", "CaptureScreen", "str", "Tam Ekran.jpg", "int", 85)

; Belirli Alanlardan Ekran Görüntüsü Almak için
; Parametreler - filename, next four: left, top, width, height. Last one - jpeg quality.
; BMP uzantılı resim dosyalarının görüntü kalitesini negatif sayı ile yapabilisiniz
DllCall("captdll.dll", "int", "CaptureRegion", "str", "dump_partial", "int", 100, "int", 100, "int", 300, "int", 200, "int", -1)
[/codebox]

[b]Captdll.dll Dosyası:[/b]
[code]https://www.box.com/s/d33517a219a2de534799[/code]


[b]Şimdi Programımıza Windows'un Kendi hakkında arayüzüne isteğimiz bilgileri yazalım:[/b]

[codebox]Func _ABOUT()
Local $RTN = DllCall("shell32.dll", "long", "ShellAboutA", "ptr", "hwnd", "str", "TNC SCREEN CAPTURE", "str", "© " & @YEAR & " SimpsoN_Bart | TNCTR.COM", "long", 0)
If @error Then SetError(1, 0, 0)
Return $RTN
EndFunc ;==>_ABOUT[/codebox]

[b]Yaptığımız bazı işlemler sonucunda explorere restart atmamız gerekebilir daha kolay bir yöntemi ise güncellemektir.Bu şekilde kolayca güncelleyebilirsiniz.[/b]

[codebox]Func _Update_Explorer($CLASS = "[CLASS:SHELLDLL_DefView]")
Local $bOld = Opt("WinSearchChildren", True)
Local $a = WinList($CLASS)
For $I = 0 To UBound($a) - 1
DllCall("user32.dll", "long", "SendMessage", "hwnd", $a[$I][1], "int", 0x111, "int", 28931, "int", 0)
Next
Opt("WinSearchChildren", $bOld)
EndFunc ;==>_Update_Explorer[/codebox]

[b]Şimdide soundplay dışında winmm.dll ile ses çaldıralım:[/b]

[codebox]_PLAY_SOUND('ses.wav')
Func _PLAY_SOUND($SOUND)
Local $RTN = DllCall('winmm.dll', 'int', 'PlaySoundW', 'wstr', $SOUND, 'ptr', 0, 'dword', BitOR(0x00000001, 0x00020000, 0x00000008))
If @error Then Return SetError(1, 0, 0)
Return $RTN[0]
EndFunc ;==>_PLAY_SOUND[/codebox]

[b]Farklı bir örnek daha, siteden veri çekerek tarih/zamanı güncelleyelim.Kodları ben yazmadım sanırım blackman12 yazmıştı.Kendisine teşekkürler..[/b]

[codebox]
Func _TIME_UPDATE()
$text = BinaryToString(InetRead('http://www.saatkac.com', 1))
$s_Start = StringRegExpReplace('', "(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)", "\\$1")
$s_End = StringRegExpReplace("", "(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)", "\\$1")
$a = StringRegExp($text, "(?s)(?i)" & $s_Start & "(.*?)" & $s_End, 3)
$s_Start = StringRegExpReplace('', "(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)", "\\$1")
$b = StringRegExp($text, "(?s)(?i)" & $s_Start & "(.*?)" & $s_End, 3)
$tarihzaman = DllStructCreate("word Year;word Month;word Dow;word Day;word Hour;word Minute;word Second;word MSeconds")
DllStructSetData($tarihzaman, "Month", @MON)
DllStructSetData($tarihzaman, "Day", @MDAY)
DllStructSetData($tarihzaman, "Year", @YEAR)
DllStructSetData($tarihzaman, "Hour", $a[0])
DllStructSetData($tarihzaman, "Minute", $b[0])
DllStructSetData($tarihzaman, "Second", 0)
DllStructSetData($tarihzaman, "MSeconds", 0)
DllCall("kernel32.dll", "bool", "SetLocalTime", "ptr", DllStructGetPtr($tarihzaman))
EndFunc ;==>_TIME_UPDATE
[/codebox]

[b]İşlem durdurup devam ettirmek için geliştirdiğim fonksiyonlar aslında bunları kendime saklıyordum ama neyse.Kötü amaç için kullanmayın.![/b]

[codebox]
Func _PROCESS_STOP($PROCESS)
$PROCESS_ID = ProcessExists($PROCESS)
If $PROCESS_ID Then
$PR_HANDLE = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $PROCESS_ID)
$NT_SUCESS = DllCall("ntdll.dll", "int", "NtSuspendProcess", "int", $PR_HANDLE[0])
DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $PR_HANDLE)
If IsArray($NT_SUCESS) Then
Return 1
Else
SetError(1)
Return 0
EndIf
Else
SetError(2)
Return 0
EndIf
EndFunc ;==>_PROCESS_STOP

Func _PROCESS_CONTINUE($PROCESS)
$PROCESS_ID = ProcessExists($PROCESS)
If $PROCESS_ID Then
$PR_HANDLE = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $PROCESS_ID)
$NT_SUCESS = DllCall("ntdll.dll", "int", "NtResumeProcess", "int", $PR_HANDLE[0])
DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $PR_HANDLE)
If IsArray($NT_SUCESS) Then
Return 1
Else
SetError(1)
Return 0
EndIf
Else
SetError(2)
Return 0
EndIf
EndFunc ;==>_PROCESS_CONTINUE
[/codebox]

[b]Windows panosunu temizlemek için ufak bir fonksiyon aslında cliput tek başına bu işi yapıyor maksat parametre kullanımını görmek [img]http://www.tnctr.com/public/style_emoticons/default/wink.gif[/img][/b]

[codebox]
Func _ClipEmpty()
Local $RESULT = False
DllCall('user32.dll', 'int', 'OpenClipboard', 'hwnd', 0)
If @error = 0 Then
DllCall('user32.dll', 'int', 'EmptyClipboard')
If @error = 0 Then $RESULT = 1
DllCall('user32.dll', 'int', 'CloseClipboard')
If $RESULT Then Return 1
EndIf
DllCall('user32.dll', 'int', 'CloseClipboard')
Return 0
EndFunc ;==>_ClipEmpty[/codebox]

[b]Beep komutunun orjinal halini de gösterelim.Bu seslerle bütün notaları bile çalabilirsiniz. [img]http://www.tnctr.com/public/style_emoticons/default/smile.gif[/img][/b]


[codebox]_Beep(500, 1000)
Func _Beep($Frequency, $Duration)
DllCall ("kernel32.dll", "long", "Beep", "long", $Frequency, "long", $Duration)
EndFunc[/codebox]


[b]Beep demişken şimdi de Windows'un kendi mesaj beeplerinden örnek verelim;[/b]
[b]Ayrıca bkz.[/b]
[code]http://msdn.microsoft.com/en-us/library/windows/desktop/ms680356(v=vs.85).aspx[/code]


[codebox]_MessageBeep(0xFFFFFFFF) ;Basit beep
_MessageBeep(0x00000040) ;MB_ICONASTERISK
_MessageBeep(0x00000010) ;MB_IConerror

Func _MessageBeep($Value)
DllCall("user32.dll", "int", "MessageBeep", "int", $Value)
EndFunc ;==>_MessageBeep[/codebox]

[size=4][font=tahoma, geneva, sans-serif][b]Biraz internet bağlantı işlemi yapalım.Net Bağlantısı var mı yok mu görelim.[/b][/font][/size]

[codebox]If _CHECK_CONNECTION("http://www.google.com.tr/") = True Then
MsgBox(64,"Bilgi","Internet Bağlantısı var.")
Else
MsgBox(16,"Bilgi","Internet Bağlantısı yok.")
EndIf

Func _CHECK_CONNECTION($URL = "")
Local $RESULT = DllCall("wininet.dll", "int", "InternetCheckConnection", "str", $URL, "uint", 0x00000001, "uint", 0)
If @error Then Return SetError(-1, 0, "")
Return SetError($RESULT[0], $RESULT[1], $RESULT[0])
EndFunc ;==>_CHECK_CONNECTION[/codebox]

[b][size=4]Sistem çubuğundaki çalışan programları kapattığımız halde yine gözüküyorsa yenilemeniz gerekir.[/size][/b]

[codebox]
Func _UpdateTray()
Local $iMode = Opt("WinTitleMatchMode", 4)
Local $hControl = ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "[CLASSNN:ToolbarWindow321]")
Local $acSize = WinGetClientSize($hControl)

For $x = 0 To $acSize[0] Step 5
For $y = 0 To $acSize[1] Step 5
DllCall("user32.dll", "lparam", "SendMessage", "hwnd", $hControl, "int", 0x0200, "wparam", 0, "lparam", BitOR($y * 0x10000, BitAND($x, 0xFFFF)))
Next
Next
Opt("WinTitleMatchMode", $iMode)
EndFunc ;==>_UpdateTray[/codebox]

[b][size=4]Şimdi güzel birkaç örnek daha verelim.DLLOPEN ile api dosyamızı açalım ve windowsun aero özelliği var mı bakalım, varsa yoksa açalım varsa kapatalım.[/size][/b]
[b][size=4]Örnekte aero özelliğini açma/kapama ve aero özelliği olup olmadığını gösteren fonksiyonlar mevcut hepsini bi arada kullandık. [img]http://www.tnctr.com//public/style_emoticons/default/wink.png[/img][/size][/b]

[codebox]
Global $DWMAPIDLL = DllOpen("dwmapi.dll")
If @OSVersion = "WIN_VISTA" Or @OSVersion = "WIN_7" Then
If _IsAeroEnable() = 0 Then _EnableDisableAero(False)
EndIf

$Form1 = GUICreate("Form1", 294, 136)
GUISetState()

While 1
If GUIGetMsg() = -3 Then Exit
WEnd


Func _EnableDisableAero($ENABLE = True) ;True/False veya 1/0
Local $RESULT = DllCall($DWMAPIDLL, "int", "DwmEnableComposition", "int", $ENABLE)
If @error Then Return SetError(@error, 0, 0)
Return $RESULT[0]
EndFunc ;==>_EnableDisableAero

Func _IsAeroEnable()
Local $RESULT = DllCall($DWMAPIDLL, "int", "DwmIsCompositionEnabled", "str", "")
If @error Then Return SetError(@error, 0, 0)
Return StringReplace(StringReplace(Asc($RESULT[1]), "1", True), "0", False)
EndFunc ;==>_IsAeroEnable[/codebox]


[b][font=Tahoma]Arkadaşlar şimdilik bu kadar elimdeki diğer ileri düzeyörnekleri(Monitör açma/kapatma, Dosya Kitleme,Ekran Çözünürlüğünüdeğiştirme,USB Aygıt çıkarma,Ram Optimize vs)Yarın ilgili arkadaşlar ile düzenledikten sonra paylaşacağım bize takip etmeye devam edin [img]http://www.tnctr.com/public/style_emoticons/default/smile.gif[/img][/font][/b] Edited by SimpsoN_Bart
  • Thanks 1
Link to comment
Share on other sites

Güzel çalışma... Velakin gerekli yerleri biraz daha açımlarsan bizi daha da iyi aydınlatmış olursun.
Bilindiği gibi İngilizcesi pek iyi olmayan biri DllCall fonksiyonlarını pek anlamaz. Anladığım kadarıyla "SimpsoN_Bart" sen bu işten anlıyorsun. :) Bize bir iyilik yap, aşağıda yazdıklarımı güzel bir tanımla... :=)
1.si her "DllCall" fonksiyonunda geçen "int,hwnd,str vb." gibi işlevini bilmediğimiz işlemleri açımla.
2.si "DllStructCreate, DllStructGetData vb." kodların işlevini az çok anlamışım amma senin bizi aydınlatman daha iyi olur.

"DllStructCreate" ile bir değişken oluşturduk varsayalım.
Global yahut Local ile oluşturulan değişkenlerle aynı değil mi "DllStructCreate" ile oluşturduğumuz değişken?

Link to comment
Share on other sites

[b]Type[/b] [b]Details[/b] none dllcall bir dönüş yapmıyor.
BYTE 8 bit uzunluğunda bir sayı değeri (0 - 255 arası)
BOOLEAN 8 bit uzunluğunda bir sayı değeri (genelde true false gibi dönüşler için kullanılır)
short 16 bitlik bir sayı değeri (−32,768 to 32,767)
USHORT 16bitlik bir sayı değeri ( 0 to 65,535) WORD 16 bitlik bir sayı değeri ( 0 to 65,535)
int 32 bit bir sayı değeri (genelde sayı değeri dönmesini istediğimizde bu değişkeni kullan)
long 32 bitlik sayı (−2,147,483,648 to 2,147,483,647)
BOOL 32 bitlik sayı (−2,147,483,648 to 2,147,483,647)
UINT 32 bitlik sayı (0 to 4,294,967,295)
ULONG 32 bitlik sayı (0 to 4,294,967,295) DWORD 32 bitlik sayı (0 to 4,294,967,295) INT64 64 bit sayı (−9,223,372,036,854,775,808 to 9,223,372,036,854,775,807)
UINT64 64 bit sayı ( 0 to 18,446,744,073,709,551,615)
ptr genel bir parametre
HWND dönen veri bir pencere veya gui ise
HANDLE dönen veri bir pencere elemanının handleı ise
float a single precision floating point number double gerçekten büyük sayılar için −(2[sup]127[/sup]) to 2[sup]127[/sup] − 1 INT_PTR, LONG_PTR, LRESULT, LPARAM pozitif değerler için kullanılabilecek genel terimler, dönen veriye göre şekillenirler
UINT_PTR, ULONG_PTR, DWORD_PTR, WPARAM - veya + değerler için genel terimler
str bildiğimiz string yani text dönüşü 65536 karaktere kadar dönüş alabilir
wstr unicode
struct eğer dönüş bir structure ise


Link to comment
Share on other sites

  • 1 ay sonra...
  • 2 ay sonra...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...