网上抄的,简单修正,可以使用
DECLARE INTEGER EnumProcessModulesEx IN psapi.dll ;
INTEGER hProcess, ;
string @lphModule, ;
INTEGER cb, ;
INTEGER @lpcbNeeded, ;
INTEGER dwFilterFlag
*!* 声明 GetModuleFileNameEx 来获取模块的完整路径
DECLARE INTEGER GetModuleFileNameEx IN psapi.dll ;
INTEGER hProcess, ;
INTEGER hModule, ;
STRING @lpFilename, ;
INTEGER nSize
*!* 声明 OpenProcess 以获取进程句柄
DECLARE INTEGER OpenProcess IN kernel32.dll ;
INTEGER dwDesiredAccess, ;
INTEGER bInheritHandle, ;
INTEGER dwProcessId
*!* 声明 CloseHandle 释放句柄
DECLARE INTEGER CloseHandle IN kernel32.dll INTEGER hObject
Declare Integer GetCurrentProcessId In kernel32.Dll
tnProcessId=GetCurrentProcessId()
* 参数:目标进程的 ID
*LPARAMETERS tnProcessId
LOCAL hProcess, lnBufSize, lnNeeded, lpHModule, lcBuf, lnIndex, lcModuleName
* 1. 打开进程,需要 PROCESS_QUERY_INFORMATION 和 PROCESS_VM_READ 权限
hProcess = OpenProcess(0x0400 + 0x0010, 0, tnProcessId)
IF hProcess = 0
MESSAGEBOX("无法打开进程,错误代码:" + TRANSFORM(GetLastError()))
RETURN
ENDIF
* 2. 第一次调用:cb=0,获取所需缓冲区大小
lnBufSize = 0
lnNeeded = 0
= EnumProcessModulesEx(hProcess, 0, 0, @lnNeeded, 0x03) && dwFilterFlag = 0x03 (ListModulesAll)
IF lnNeeded = 0
= CloseHandle(hProcess)
RETURN
ENDIF
* 3. 准备缓冲区
lnBufSize = lnNeeded
lpHModule = REPLICATE(CHR(0), lnBufSize)
&& 分配内存
* 4. 第二次调用:获取所有模块句柄
= EnumProcessModulesEx(hProcess, @lpHModule, lnBufSize, @lnNeeded, 0x03)
* 5. 遍历模块,获取名称
FOR lnIndex = 1 TO lnNeeded / 4
&& 每个句柄占4字节(32位)
* 从缓冲区中提取模块句柄
lcModule = CTOBIN(SUBSTR(lpHModule, (lnIndex - 1) * 4 + 1, 4),"4rs")
lcModuleName = SPACE(255)
= GetModuleFileNameEx(hProcess, lcModule, @lcModuleName, 255)
lcModuleName = STRTRAN(lcModuleName, CHR(0), "") && 去除空字符
? "模块 " + TRANSFORM(lnIndex) + ": " + lcModuleName
ENDFOR
= CloseHandle(hProcess)