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 손도 안 나는 솔직히 실제로 여기에 메모리 :(JNA 메모리 누출 - 수정 방법?
내가 메모리 누수가 있다는 걸 알고 확보하는 방법을 단서가 없다 - 나는 YourKit 몇 가지 프로파일을했고, 추적을 이 코드 블록에 대한 메모리 누수 (특히, GetWindowTextW 호출과 Native.toString() 호출에서 새어 나가고있는 것처럼 보입니다.) 누군가가 사용중인 메모리 블록을 적절히 비우는 방법에 대한 예제를 줄 수 있습니까?
Pointer
은 clear()
메서드를 사용하고 있는데, 사용해야합니까?하지만 크기를 얻는 방법을 모르겠다. (clear
길이 인수). 또한 Pointer
서브 클래스 인 Memory
유형이 있지만, instanceof
에 따르면, 현재 가지고있는 포인터 중 실제로 해당 인스턴스가 없습니다.
당신은'저장하는 net.java.dev.jna 플랫폼 패키지 상자에서 윈도우 API의 꽤 심도있는 매핑을 제공하는 것도
는주 결과'어딘가에 (해방되지 않도록)? – jdigital
나는 단지 누수와 아무런 관련이 없다는 것을 확신하지만, 표준 프로 시저 일 뿐이므로 문자열을 올바르게 제거 할 수있다. – misaka
최소한의 완전하고 검증 가능한 예제를 만든다면 도움이 될 것이다. . [최소한의 완전하고 검증 가능한 예제를 만드는 방법] (https://stackoverflow.com/help/mcve)을 참조하십시오. – jdigital