gpt4 book ai didi

java - JNA 按名称从进程获取模块

转载 作者:行者123 更新时间:2023-11-30 05:56:48 24 4
gpt4 key购买 nike

我正在寻找一种用 Java 重写 C++ 函数的方法,我可以通过进程的名称获取模块条目。我对 JNA 经验不多,很难理解 Java 中指针是如何实现的。这是我的 C++ 代码。

ULONG GetModule(DWORD th32ProcessID, MODULEENTRY32* Entry, PCWSTR szModule) 
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, th32ProcessID);

if (hSnapshot != INVALID_HANDLE_VALUE)
{
ULONG dwError = ERROR_NOT_FOUND;

Entry->dwSize = sizeof(MODULEENTRY32);

if (Module32FirstW(hSnapshot, Entry))
{
do
{
if (!_wcsicmp(Entry->szModule, szModule))
{
dwError = NOERROR;
break;
}
} while (Module32NextW(hSnapshot, Entry));
}

CloseHandle(hSnapshot);

return dwError;
}
return GetLastError();
}

这是我在 java 中实现这个的尝试:

    private Tlhelp32.MODULEENTRY32W findModule(String module) {
Tlhelp32.MODULEENTRY32W moduleEntry = new Tlhelp32.MODULEENTRY32W.ByReference();

WinNT.HANDLE snapshot =
Kernel32.INSTANCE.CreateToolhelp32Snapshot(
TH32CS_SNAPMODULE,
new WinDef.DWORD(pid)
);

if(snapshot != INVALID_HANDLE_VALUE) {
if(Kernel32.INSTANCE.Module32FirstW(snapshot, moduleEntry)) {
do {
if(Arrays.toString(moduleEntry.szModule).equals(module)) {
return moduleEntry;
}
} while (Kernel32.INSTANCE.Module32NextW(snapshot, moduleEntry));
}
}
return null;
}

它总是返回 null。

最佳答案

我认为您不是在此处寻找Arrays.toString。看看它的documentation :

Returns a string representation of the contents of the specified array. The string representation consists of a list of the array's elements, enclosed in square brackets ("[]"). Adjacent elements are separated by the characters ", " (a comma followed by a space). Elements are converted to strings as by String.valueOf(char). Returns "null" if a is null.

例如,{ 'h', 'e', 'l', 'l', 'o' }char[] 数组将是字符串化为“[h, e, l, l, o]”

由于您只想按原样将该 char 数组转换为字符串,因此请尝试使用 String class' constructor它就是这样做的。

if (module.equals(new String(moduleEntry.szModule))) {
// ...
}

如果您不寻找完全匹配的内容,可以尝试 .contains()

此外,记得像 C++ 版本中那样使用 CloseHandle 关闭快照的句柄!如果不关闭句柄,您的方法每次调用时都会泄漏内存。

private Tlhelp32.MODULEENTRY32W findModule(String module) {
Tlhelp32.MODULEENTRY32W moduleEntry = new Tlhelp32.MODULEENTRY32W.ByReference();

WinNT.HANDLE snapshot = Kernel32.INSTANCE.CreateToolhelp32Snapshot(
TH32CS_SNAPMODULE,
new WinDef.DWORD(pid)
);

if (snapshot == INVALID_HANDLE_VALUE) {
return null;
}

Tlhelp32.MODULEENTRY32W match = null;
if (Kernel32.INSTANCE.Module32FirstW(snapshot, moduleEntry)) {
do {
if (module.equals(new String(moduleEntry.szModule))) {
match = moduleEntry;
break;
}
} while (Kernel32.INSTANCE.Module32NextW(snapshot, moduleEntry));
}

Kernel32.INSTANCE.CloseHandle(snapshot);
return match;
}

关于java - JNA 按名称从进程获取模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53033933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com