JNA按名称从进程中获取模块

时间:2018-10-28 16:56:18

标签: java pointers winapi jna

我正在寻找一种用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。

1 个答案:

答案 0 :(得分:1)

我认为您在这里找不到composer remove --dev squizlabs/php_codesniffer 。看看它的documentation

  

返回指定数组内容的字符串表示形式。字符串表示形式由数组元素列表组成,并用方括号(“ []”)括起来。相邻元素由字符“,”(逗号后跟空格)分隔。元素通过String.valueOf(char)转换为字符串。如果a为null,则返回“ null”。

例如,一个Arrays.toString的{​​{1}}数组将被字符串化为char[]

由于您只想按原样将char数组转换为字符串,请尝试使用String class' constructor来完成此操作。

{ 'h', 'e', 'l', 'l', 'o' }

如果您不查找完全匹配的内容,则可以尝试"[h, e, l, l, o]"

此外,请像使用C ++版本一样,记住要使用if (module.equals(new String(moduleEntry.szModule))) { // ... } 关闭快照的句柄!如果不关闭该句柄,则每次调用该方法都会泄漏内存。

.contains()