У @HovercraftFullOfEels была небольшая дежа вю и я вспомнил, что раньше я отвечал на очень похожий вопрос;)
public static User32 USER32_INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
user32 = USER32_INSTANCE;
user32.EnumWindows((hWnd, arg) -> {
int size = 1024 * 8;
char[] buffer = new char[size];
USER32_INSTANCE.GetWindowTextW(hWnd, buffer, size);
char[] buffer2 = new char[size];
PointerByReference pointer = new PointerByReference();
User32DLL.GetWindowThreadProcessId(hWnd, pointer);
Pointer process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pointer.getValue());
Psapi.GetModuleBaseNameW(process, null, buffer2, size);
String result = Native.toString(buffer).trim();
String proc = Native.toString(buffer2).trim();
// ... (non-JNA stuff)
}
касался C / C ++ с колледжа и, честно говоря, понятия не имею, как на самом деле освободить память здесь
Я знаю, что есть утечка памяти - я выполнил некоторое профилирование с YourKit и отследил утечку памяти для этого блока кода (в частности, он, похоже, просачивается в вызове GetWindowTextW и вызовах Native.toString ()). Может ли кто-нибудь просто дать мне пример того, как правильно освободить используемые блоки памяти?
я вижу этоPointer
имеетclear()
метод, я должен использовать это? Но я не знаю, как получить размер (clear
принимает аргумент длины). Я также вижу, что естьMemory
введите эти подклассыPointer
но согласноinstanceof
Ни один из Указателей, которые у меня есть сейчас, на самом деле не является примером этого.