SimpsoN_Bart Posted May 22, 2012 Share Posted May 22, 2012 (edited) [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 September 13, 2012 by SimpsoN_Bart 1 Quote Link to comment Share on other sites More sharing options...
77gün Posted May 22, 2012 Share Posted May 22, 2012 (edited) ok arkadaşım 10 numara iş çıkarmışsın bu aralar gördüğüm en iyi bilgilendirme Edited May 22, 2012 by Tırakyalı Quote Link to comment Share on other sites More sharing options...
asmazh Posted May 23, 2012 Share Posted May 23, 2012 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? Quote Link to comment Share on other sites More sharing options...
blackman12 Posted May 23, 2012 Share Posted May 23, 2012 [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 Quote Link to comment Share on other sites More sharing options...
SimpsoN_Bart Posted June 28, 2012 Author Share Posted June 28, 2012 [font="Tahoma"]Edit : Konu güncellenmiştir.Örnek yazılmaya devam edilecektir.[/font] Quote Link to comment Share on other sites More sharing options...
kamuran731 Posted September 10, 2012 Share Posted September 10, 2012 [b]tarih/zamanı güncelleme kodları çalışmıyor. (Saati 00:00 olarak ayarlıyor) su an saat 17:13[/b] Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.