【问题标题】:How to find a DLL given a CLSID?如何找到给定 CLSID 的 DLL?
【发布时间】:2009-05-22 13:07:23
【问题描述】:

我有一个托管 DLL 调用一些非托管 DLL 的情况。我知道非托管 DLL 的 CLSID,有什么方法可以找出该 CLSID 所在的二进制文件吗?

【问题讨论】:

  • 您是尝试以编程方式还是临时性的?即,您是否需要一个程序自己来做这件事,或者这是您作为开发人员偶尔需要做的事情?

标签: dll clsid


【解决方案1】:

一般情况下,你可以去:

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\"GUID"

并找到一个名为“InProcServer32”的键,例如,将有具有 DLL 的默认值。这是一种简单的方法。

【讨论】:

  • 值得注意的是,根据它的安装方式,您可能会在 HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID 中找到它。
  • 这意味着应该使用HKEY_CLASSES_ROOT\CLSID
  • 或 HKEY_CLASSES_ROOT\WOW6432Node\CLSID
【解决方案2】:

你能不能不只是使用regedit在注册表中搜索它并查找二进制路径。

【讨论】:

    【解决方案3】:

    根据 BobbyShaftoe 的回复,我们可以构建一个简单的 vbs 脚本来为我们读取该注册表:

    Dll_RegPath = "HKEY_CLASSES_ROOT\CLSID\<GUID>\InProcServer32\"
    

    将以下内容粘贴到“test.vbs”

    Sub Main
    
        ' used to find location of "System.Collections.ArrayList" progid dll
        Const csGUID = "{6896B49D-7AFB-34DC-934E-5ADD38EEEE39}"
    
        MsgBox srGetDllPathByGUID(csGUID)
    
    End Sub
    
    Function srGetDllPathByGUID( sGUID )
        Const csRegPath = "HKEY_CLASSES_ROOT\CLSID\<GUID>\InProcServer32\"
    
        Dim oShell: Set oShell = CreateObject("WScript.Shell")
        Dim sReg: sReg = Replace( csRegPath, "<GUID>", sGUID ) ' build str
    
        srGetDllPathByGUID = oShell.RegRead(sReg)
    
        Set oShell = Nothing ' clean up
    End Function
    
    Call Main
    

    您还可以通过以下方式找到 ProgId:

    ProgID_RegPath = "HKEY_CLASSES_ROOT\CLSID\<GUID>\ProgID\"
    

    【讨论】:

      【解决方案4】:

      我发现了这个问题,因为我正在对一些安装不正确的应用程序进行故障排除,我的目标是查找并注册给定 CLSID(我从应用程序源获得)的 ActiveX dll。因此我的方法有点老套。

      我已经在我认为 dll 所在的目录中进行了搜索,以查找文件内容中的 CLSID。这成功了,因为它以纯文本形式存储在资源中。我相信并非总是如此,但我的问题已经解决了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-03
        • 1970-01-01
        • 2012-08-05
        • 2010-12-15
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 2015-08-23
        相关资源
        最近更新 更多