Last active
December 24, 2025 21:32
-
-
Save sunmeat/e47178bb4281eb78d8c8591856b5be69 to your computer and use it in GitHub Desktop.
callbacks dllimport example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using System.Runtime.InteropServices; | |
| using System.Text; | |
| public delegate bool CallBack(int hwnd, int lParam); | |
| public class OldFunctionsHolder | |
| { | |
| [DllImport("user32.dll")] | |
| public static extern int EnumWindows(CallBack x, int nothing); | |
| [DllImport("user32")] | |
| public static extern int GetWindowText(int hWnd, StringBuilder text, int count); | |
| } | |
| class Program | |
| { | |
| static int counter = 1; | |
| static void Main() | |
| { | |
| var myCallBack = new CallBack(Report); | |
| OldFunctionsHolder.EnumWindows(myCallBack, 0); | |
| } | |
| static bool Report(int hwnd, int lParam) | |
| { | |
| var text = new StringBuilder(255); | |
| OldFunctionsHolder.GetWindowText(hwnd, text, 255); | |
| Console.Write(counter++ + ". handle: {0,8}, caption: {1}\n", hwnd, text); | |
| Thread.Sleep(100); | |
| return true; | |
| } | |
| } | |
| /* | |
| Спочатку були визначені Win32-функції EnumWindows і GetWindowText за допомогою атрибуту Dlllmport. | |
| Потім - делегат Callback і метод Report. Після цього залишається тільки в методі Main створити | |
| екземпляр делегата Callback (передаючи йому метод Report), і викликати метод EnumWindows. | |
| Для кожного вікна, знайденого в системі, Windows викличе метод Report. | |
| Метод Report цікавий, оскільки використовує клас StringBuilder для створення рядка | |
| фіксованої довжини, який він передає функції GetWindowText. Тому функція GetWindowText | |
| визначається так: | |
| static extern int GetWindowText(int hWnd, StringBuilder text, int count); | |
| Причина в тому, що функції DLL не дозволяється змінювати рядок, так що не вийде використовувати | |
| цей тип. І навіть якщо спробувати здійснити передачу за посиланням, код, що викликає, не може | |
| ініціалізувати рядок з правильним розміром. Тут в справу вступає клас StringBuilder. | |
| Оскільки довжина тексту не перевищує максимального значення, переданого конструктору | |
| StringBuilder, об'єкт StringBuilder може бути розіменуваний і модифікований викликаною функцією. | |
| */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment