首页 > 软件开发 > 编程语言 >

vba 如何获取dll文件的路径

来源:互联网 2023-03-17 00:17:27 68

本文说明在vba中如何获取进程加载的dll文件的路径。dPc办公区 - 实用经验教程分享!

vba 如何获取dll文件的路径dPc办公区 - 实用经验教程分享!

工具/原料

  • 32位Office 2007以上或VB6

方法/步骤

  • 1

    新建VBA工程dPc办公区 - 实用经验教程分享!

    打开Excel,按下Atl F11,打开VBA工程。dPc办公区 - 实用经验教程分享!

    vba 如何获取dll文件的路径dPc办公区 - 实用经验教程分享!

    vba 如何获取dll文件的路径dPc办公区 - 实用经验教程分享!

  • 2

    增加一个FormdPc办公区 - 实用经验教程分享!

    增加一个Form,Form上有一个Label、一个文本框、一个按钮和一个ListBox控件。文本框用来输入进程的名称,ListBox用来显示dll的路径dPc办公区 - 实用经验教程分享!

    vba 如何获取dll文件的路径dPc办公区 - 实用经验教程分享!

  • 3

    增加一个模块dPc办公区 - 实用经验教程分享!

    新增加一个VBA模块,贴入如下代码。dPc办公区 - 实用经验教程分享!

    Option ExplicitdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    Public Const PROCESS_QUERY_INFORMATION = 1024dPc办公区 - 实用经验教程分享!

    Public Const PROCESS_VM_READ = 16dPc办公区 - 实用经验教程分享!

    Public Const MAX_PATH = 260dPc办公区 - 实用经验教程分享!

    Public Const WINNT_System_Found = 2dPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    Type PROCESS_MEMORY_COUNTERSdPc办公区 - 实用经验教程分享!

    cb As LongdPc办公区 - 实用经验教程分享!

    PageFaultCount As LongdPc办公区 - 实用经验教程分享!

    PeakWorkingSetSize As LongdPc办公区 - 实用经验教程分享!

    WorkingSetSize As LongdPc办公区 - 实用经验教程分享!

    QuotaPeakPagedPoolUsage As LongdPc办公区 - 实用经验教程分享!

    QuotaPagedPoolUsage As LongdPc办公区 - 实用经验教程分享!

    QuotaPeakNonPagedPoolUsage As LongdPc办公区 - 实用经验教程分享!

    QuotaNonPagedPoolUsage As LongdPc办公区 - 实用经验教程分享!

    PagefileUsage As LongdPc办公区 - 实用经验教程分享!

    PeakPagefileUsage As LongdPc办公区 - 实用经验教程分享!

    End TypedPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    Public Type OSVERSIONINFOdPc办公区 - 实用经验教程分享!

    dwOSVersionInfoSize As LongdPc办公区 - 实用经验教程分享!

    dwMajorVersion As LongdPc办公区 - 实用经验教程分享!

    dwMinorVersion As LongdPc办公区 - 实用经验教程分享!

    dwBuildNumber As LongdPc办公区 - 实用经验教程分享!

    dwPlatformId As Long '1 = Windows 95.dPc办公区 - 实用经验教程分享!

    '2 = Windows NTdPc办公区 - 实用经验教程分享!

    szCSDVersion As String * 128dPc办公区 - 实用经验教程分享!

    End TypedPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    Public Declare Function GetProcessMemoryInfo Lib "PSAPI.DLL" (ByVal hProcess As Long, ppsmemCounters As PROCESS_MEMORY_COUNTERS, ByVal cb As Long) As LongdPc办公区 - 实用经验教程分享!

    Public Declare Function CloseHandle Lib "Kernel32.dll" (ByVal Handle As Long) As LongdPc办公区 - 实用经验教程分享!

    Public Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As LongdPc办公区 - 实用经验教程分享!

    Public Declare Function EnumProcesses Lib "PSAPI.DLL" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As LongdPc办公区 - 实用经验教程分享!

    Public Declare Function GetModuleFileNameExA Lib "PSAPI.DLL" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As LongdPc办公区 - 实用经验教程分享!

    Public Declare Function EnumProcessModules Lib "PSAPI.DLL" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As LongdPc办公区 - 实用经验教程分享!

    Public Declare Function GetVersionExA Lib "kernel32" (lpVersionInformation As OSVERSIONINFO) As IntegerdPc办公区 - 实用经验教程分享!

    Public Declare Function GetCurrentProcessId Lib "kernel32" () As LongdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    Public Sub GetDLLs(ByVal EXEName As String, list As Collection)dPc办公区 - 实用经验教程分享!

    Dim lngLength As LongdPc办公区 - 实用经验教程分享!

    Dim strProcessName As StringdPc办公区 - 实用经验教程分享!

    Dim lngCBSize As Long 'Specifies the size, In bytes, of the lpidProcess arraydPc办公区 - 实用经验教程分享!

    Dim lngCBSizeReturned As Long 'Receives the number of bytes returneddPc办公区 - 实用经验教程分享!

    Dim lngNumElements As LongdPc办公区 - 实用经验教程分享!

    Dim lngProcessIDs() As LongdPc办公区 - 实用经验教程分享!

    Dim lngCBSize2 As LongdPc办公区 - 实用经验教程分享!

    Dim lngModules(1 To 200) As LongdPc办公区 - 实用经验教程分享!

    Dim lngReturn As LongdPc办公区 - 实用经验教程分享!

    Dim strModuleName As StringdPc办公区 - 实用经验教程分享!

    Dim lngSize As LongdPc办公区 - 实用经验教程分享!

    Dim lngHwndProcess As LongdPc办公区 - 实用经验教程分享!

    Dim lngLoop As LongdPc办公区 - 实用经验教程分享!

    Dim pmc As PROCESS_MEMORY_COUNTERSdPc办公区 - 实用经验教程分享!

    Dim lRet As LongdPc办公区 - 实用经验教程分享!

    Dim strProcName2 As StringdPc办公区 - 实用经验教程分享!

    Dim llLoop As LongdPc办公区 - 实用经验教程分享!

    Dim llEnd As LongdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    'Turn on Error handlerdPc办公区 - 实用经验教程分享!

    On Error GoTo Error_handlerdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    EXEName = UCase$(Trim$(EXEName))dPc办公区 - 实用经验教程分享!

    lngLength = Len(EXEName)dPc办公区 - 实用经验教程分享!

    lngCBSize = 8 ' Really needs To be 16, but Loop will increment prior to calling APIdPc办公区 - 实用经验教程分享!

    lngCBSizeReturned = 96dPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    If EXEName > "" ThendPc办公区 - 实用经验教程分享!

    Do While lngCBSize = lngCBSizeReturneddPc办公区 - 实用经验教程分享!

    DoEventsdPc办公区 - 实用经验教程分享!

    'Increment SizedPc办公区 - 实用经验教程分享!

    lngCBSize = lngCBSize * 2dPc办公区 - 实用经验教程分享!

    'Allocate Memory for ArraydPc办公区 - 实用经验教程分享!

    ReDim lngProcessIDs(lngCBSize / 4) As LongdPc办公区 - 实用经验教程分享!

    'Get Process ID'sdPc办公区 - 实用经验教程分享!

    lngReturn = EnumProcesses(lngProcessIDs(1), lngCBSize, lngCBSizeReturned)dPc办公区 - 实用经验教程分享!

    LoopdPc办公区 - 实用经验教程分享!

    lngNumElements = lngCBSizeReturned / 4dPc办公区 - 实用经验教程分享!

    ElsedPc办公区 - 实用经验教程分享!

    ReDim lngProcessIDs(1) As LongdPc办公区 - 实用经验教程分享!

    lngProcessIDs(1) = GetCurrentProcessIddPc办公区 - 实用经验教程分享!

    lngNumElements = 1dPc办公区 - 实用经验教程分享!

    End IfdPc办公区 - 实用经验教程分享!

    'Count number of processes returneddPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    'Loop thru each processdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    For lngLoop = 1 To lngNumElementsdPc办公区 - 实用经验教程分享!

    'Get a handle to the Process and OpendPc办公区 - 实用经验教程分享!

    lngHwndProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, lngProcessIDs(lngLoop))dPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    If lngHwndProcess > 0 ThendPc办公区 - 实用经验教程分享!

    'Get an array of the module handles for the specified processdPc办公区 - 实用经验教程分享!

    lngReturn = EnumProcessModules(lngHwndProcess, lngModules(1), 200, lngCBSize2)dPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    'If the Module Array is retrieved, Get the ModuleFileNamedPc办公区 - 实用经验教程分享!

    If lngReturn > 0 ThendPc办公区 - 实用经验教程分享!

    llEnd = lngCBSize2 / 4dPc办公区 - 实用经验教程分享!

    'Buffer with spaces first to allocate memory for byte arraydPc办公区 - 实用经验教程分享!

    strModuleName = Space(MAX_PATH)dPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    'Must be set prior to calling APIdPc办公区 - 实用经验教程分享!

    lngSize = 500dPc办公区 - 实用经验教程分享!

    'Get Process NamedPc办公区 - 实用经验教程分享!

    lngReturn = GetModuleFileNameExA(lngHwndProcess, lngModules(1), strModuleName, lngSize)dPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    'Remove trailing spacesdPc办公区 - 实用经验教程分享!

    strProcessName = Left(strModuleName, lngReturn)dPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    'Check for Matching Upper case resultdPc办公区 - 实用经验教程分享!

    strProcessName = UCase$(Trim$(strProcessName))dPc办公区 - 实用经验教程分享!

    strProcName2 = GetElement(Trim(Replace(strProcessName, Chr$(0), "")), "\", 0, 0, _dPc办公区 - 实用经验教程分享!

    GetNumElements(Trim(Replace(strProcessName, Chr$(0), "")), "\") - 1)dPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    'All the items for the processdPc办公区 - 实用经验教程分享!

    If EXEName = "" Or strProcName2 = ExtractFileName(EXEName) ThendPc办公区 - 实用经验教程分享!

    For llLoop = 1 To llEnddPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    lngReturn = GetModuleFileNameExA(lngHwndProcess, lngModules(llLoop), strModuleName, lngSize)dPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    'Remove trailing spacesdPc办公区 - 实用经验教程分享!

    strProcessName = Left(strModuleName, lngReturn)dPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    'Check for Matching Upper case resultdPc办公区 - 实用经验教程分享!

    strProcessName = UCase$(Trim$(strProcessName))dPc办公区 - 实用经验教程分享!

    ' strProcName2 = GetElement(Trim(Replace(strProcessName, Chr$(0), "")), "\", 0, 0, _dPc办公区 - 实用经验教程分享!

    GetNumElements(Trim(Replace(strProcessName, Chr$(0), "")), "\") - 1)dPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    'Add path to the CollectiondPc办公区 - 实用经验教程分享!

    If Right$(strProcessName, 4) = ".DLL" Then list.Add strProcessNamedPc办公区 - 实用经验教程分享!

    NextdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    'Get the Site of the Memory StructuredPc办公区 - 实用经验教程分享!

    pmc.cb = LenB(pmc)dPc办公区 - 实用经验教程分享!

    lRet = GetProcessMemoryInfo(lngHwndProcess, pmc, pmc.cb)dPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    End IfdPc办公区 - 实用经验教程分享!

    End IfdPc办公区 - 实用经验教程分享!

    End IfdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    'Close the handle to this processdPc办公区 - 实用经验教程分享!

    lngReturn = CloseHandle(lngHwndProcess)dPc办公区 - 实用经验教程分享!

    'DoEventsdPc办公区 - 实用经验教程分享!

    NextdPc办公区 - 实用经验教程分享!

    IsProcessRunning_Exit:dPc办公区 - 实用经验教程分享!

    'Exit early to avoid error handlerdPc办公区 - 实用经验教程分享!

    Exit SubdPc办公区 - 实用经验教程分享!

    Error_handler:dPc办公区 - 实用经验教程分享!

    Err.Raise Err, Err.Source, "ProcessInfo", ErrordPc办公区 - 实用经验教程分享!

    Resume NextdPc办公区 - 实用经验教程分享!

    End SubdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    Private Function ExtractFileName(ByVal vStrFullPath As String) As StringdPc办公区 - 实用经验教程分享!

    Dim intPos As IntegerdPc办公区 - 实用经验教程分享!

    intPos = InStrRev(vStrFullPath, "\")dPc办公区 - 实用经验教程分享!

    ExtractFileName = UCase$(Mid$(vStrFullPath, intPos 1))dPc办公区 - 实用经验教程分享!

    End FunctiondPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    Private Function getOsVersion() As LongdPc办公区 - 实用经验教程分享!

    Dim osinfo As OSVERSIONINFOdPc办公区 - 实用经验教程分享!

    Dim retvalue As IntegerdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    osinfo.dwOSVersionInfoSize = 148dPc办公区 - 实用经验教程分享!

    osinfo.szCSDVersion = Space$(128)dPc办公区 - 实用经验教程分享!

    retvalue = GetVersionExA(osinfo)dPc办公区 - 实用经验教程分享!

    getOsVersion = osinfo.dwPlatformIddPc办公区 - 实用经验教程分享!

    End FunctiondPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    Public Function GetElement(ByVal strList As String, ByVal strDelimiter As String, ByVal lngNumColumns As Long, ByVal lngRow As Long, ByVal lngColumn As Long) As StringdPc办公区 - 实用经验教程分享!

    Dim lngCounter As LongdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    ' Append delimiter text to the end of the list as a terminator.dPc办公区 - 实用经验教程分享!

    strList = strList & strDelimiterdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    ' Calculate the offset for the item required based on the number of columns the listdPc办公区 - 实用经验教程分享!

    ' 'strList' has i.e. 'lngNumColumns' and from which row the element is to bedPc办公区 - 实用经验教程分享!

    ' selected i.e. 'lngRow'.dPc办公区 - 实用经验教程分享!

    lngColumn = IIf(lngRow = 0, lngColumn, (lngRow * lngNumColumns) lngColumn)dPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    ' Search for the 'lngColumn' item from the list 'strList'.dPc办公区 - 实用经验教程分享!

    For lngCounter = 0 To lngColumn - 1dPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    ' Remove each item from the list.dPc办公区 - 实用经验教程分享!

    strList = Mid$(strList, InStr(strList, strDelimiter) Len(strDelimiter), Len(strList))dPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    ' If list becomes empty before 'lngColumn' is found then justdPc办公区 - 实用经验教程分享!

    ' return an empty string.dPc办公区 - 实用经验教程分享!

    If Len(strList) = 0 ThendPc办公区 - 实用经验教程分享!

    GetElement = ""dPc办公区 - 实用经验教程分享!

    Exit FunctiondPc办公区 - 实用经验教程分享!

    End IfdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    Next lngCounterdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    ' Return the sought list element.dPc办公区 - 实用经验教程分享!

    GetElement = Left$(strList, InStr(strList, strDelimiter) - 1)dPc办公区 - 实用经验教程分享!

    End FunctiondPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    Public Function GetNumElements(ByVal strList As String, ByVal strDelimiter As String) As IntegerdPc办公区 - 实用经验教程分享!

    Dim intElementCount As IntegerdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    ' If no elements in the list 'strList' then just return 0.dPc办公区 - 实用经验教程分享!

    If Len(strList) = 0 ThendPc办公区 - 实用经验教程分享!

    GetNumElements = 0dPc办公区 - 实用经验教程分享!

    Exit FunctiondPc办公区 - 实用经验教程分享!

    End IfdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    ' Append delimiter text to the end of the list as a terminator.dPc办公区 - 实用经验教程分享!

    strList = strList & strDelimiterdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    ' Count the number of elements in 'strlist'dPc办公区 - 实用经验教程分享!

    While InStr(strList, strDelimiter) > 0dPc办公区 - 实用经验教程分享!

    intElementCount = intElementCount 1dPc办公区 - 实用经验教程分享!

    strList = Mid$(strList, InStr(strList, strDelimiter) 1, Len(strList))dPc办公区 - 实用经验教程分享!

    WenddPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    ' Return the number of elements in 'strList'.dPc办公区 - 实用经验教程分享!

    GetNumElements = intElementCountdPc办公区 - 实用经验教程分享!

    End FunctiondPc办公区 - 实用经验教程分享!

    vba 如何获取dll文件的路径dPc办公区 - 实用经验教程分享!

  • 4

    增加Command按钮事件dPc办公区 - 实用经验教程分享!

    双击Command按钮,增加如下代码:dPc办公区 - 实用经验教程分享!

    Private Sub CommandButton1_Click()dPc办公区 - 实用经验教程分享!

    Dim objDlls As New CollectiondPc办公区 - 实用经验教程分享!

    Dim lngIndex As LongdPc办公区 - 实用经验教程分享!

    dPc办公区 - 实用经验教程分享!

    GetDLLs TextBox1.Text, objDllsdPc办公区 - 实用经验教程分享!

    ListBox1.CleardPc办公区 - 实用经验教程分享!

    For lngIndex = 1 To objDlls.CountdPc办公区 - 实用经验教程分享!

    ListBox1.AddItem objDlls(lngIndex)dPc办公区 - 实用经验教程分享!

    NextdPc办公区 - 实用经验教程分享!

    End SubdPc办公区 - 实用经验教程分享!

    vba 如何获取dll文件的路径dPc办公区 - 实用经验教程分享!

  • 5

    获取当前进程的dll路径dPc办公区 - 实用经验教程分享!

    选择UserForm1,按F5运行,点击按钮,可以获取当前进程所有dll的路径。dPc办公区 - 实用经验教程分享!

    vba 如何获取dll文件的路径dPc办公区 - 实用经验教程分享!

  • 6

    获取指定进程的dll路径dPc办公区 - 实用经验教程分享!

    选择UserForm1,按F5运行,在本文框中输入进程名称,点击按钮,就可以获取和进程名称匹配的进程的所有dll的路径。dPc办公区 - 实用经验教程分享!

    vba 如何获取dll文件的路径dPc办公区 - 实用经验教程分享!

  • 7

    下载测试工程代码dPc办公区 - 实用经验教程分享!

    测试用的Excel及VBA代码共享在如下位置,可以自行下来测试。dPc办公区 - 实用经验教程分享!

    下载路径:http://pan.baidu.com/s/1bpAnpcNdPc办公区 - 实用经验教程分享!

    vba 如何获取dll文件的路径dPc办公区 - 实用经验教程分享!

  • 7该信息未经许可获取自百度经验
  • 注意事项

    • 本经验还会不断补充和完善,直到有一天我们发现这篇经验已无存在价值。
    • 如果有朋友喜欢这篇经验,请为我点赞,后续还会为大家分享更多经验,有兴趣的亲们可以点击关注我。

    以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!dPc办公区 - 实用经验教程分享!


    标签: 编程语言VBA

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号统计代码