0

安装它的软件时我有一个 dll,它被安装在

HKEY_LOCAL_MACHINE\\SOFTWARE for 32-bit OS

HKEY_CURRENT_USER\\SOFTWARE for 64-bit OS.

如何根据注册表项检测 dll 路径?

我不想像这样硬编码。

RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("Software//NodeName")

我可以尝试检测 32 位或 64 位操作系统并执行类似的操作

如果32-bit

RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("Software//NodeName")

如果64-bit

RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("Software//NodeName")

但是有没有一种方法可以直接检测 dll 的路径,例如,如果指定了 dll 名称,我如何进行整个注册表检查并找到它的路径名?

4

2 回答 2

3

在 WOW64 下,某些注册表项被重定向。当 32 位或 64 位应用程序对重定向的键进行注册表调用时,注册表重定向器会拦截调用并将其映射到键的相应物理注册表位置。

对于 64 位,尝试在 HKEY_CLASSES_ROOT\Wow6432Node\CLSID\ 中查找值

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724072(v=vs.85).aspx

于 2012-11-16T17:09:21.593 回答
1

HKEY_CLASSES_ROOT\CLSID 包含系统上所有已注册的 COM 文件(.ocx、.dll、.ax)的列表,无论是 32 位还是 64 位。

CLSID 下的键由每个 COM 生成的 GUID 表示。

最后进入 GUID 键,有 InprocServer32 子键,在其中,默认值包含 COM 文件进入系统的路径,因此您可以找到它,如下所示:

VB代码:

    ''' <summary>
    ''' Search and Find Registry Function
    ''' </summary>
    Public Shared Function SearchRegistry(ByVal dllName As String) As String

        'Open the HKEY_CLASSES_ROOT\CLSID which contains the list of all registered COM files (.ocx,.dll, .ax) 
        'on the system no matters if is 32 or 64 bits.
        Dim t_clsidKey As RegistryKey = Registry.ClassesRoot.OpenSubKey("CLSID")

        'Get all the sub keys it contains, wich are the generated GUID of each COM.
        For Each subKey In t_clsidKey.GetSubKeyNames.ToList

            'For each CLSID\GUID key we get the InProcServer32 sub-key .
            Dim t_clsidSubKey As RegistryKey = Registry.ClassesRoot.OpenSubKey("CLSID\" & subKey & "\InProcServer32")

            If Not t_clsidSubKey Is Nothing Then

                'in the case InProcServer32 exist we get the default value wich contains the path of the COM file.
                Dim t_valueName As String = (From value In t_clsidSubKey.GetValueNames() Where value = "")(0).ToString

                'Now gets the value.
                Dim t_value As String = t_clsidSubKey.GetValue(t_valueName).ToString


                'And finaly if the value ends with the name of the dll (include .dll) we return it
                If t_value.EndsWith(dllName) Then

                    Return t_value

                End If

            End If

        Next

        'if not exist, return nothing
        Return Nothing

    End Function

C#代码:

    /// <summary>
    /// Search and Find Registry Function
    /// </summary>
    public static string SearchRegistry(string dllName)
    {

        //Open the HKEY_CLASSES_ROOT\CLSID which contains the list of all registered COM files (.ocx,.dll, .ax) 
        //on the system no matters if is 32 or 64 bits.
        RegistryKey t_clsidKey = Registry.ClassesRoot.OpenSubKey("CLSID");

        //Get all the sub keys it contains, wich are the generated GUID of each COM.

        foreach (object subKey_loopVariable in t_clsidKey.GetSubKeyNames.ToList) {
            subKey = subKey_loopVariable;
            //For each CLSID\GUID key we get the InProcServer32 sub-key .
            RegistryKey t_clsidSubKey = Registry.ClassesRoot.OpenSubKey("CLSID\\" + subKey + "\\InProcServer32");


            if ((t_clsidSubKey != null)) {
                //in the case InProcServer32 exist we get the default value wich contains the path of the COM file.
                string t_valueName = (from value in t_clsidSubKey.GetValueNames()where string.IsNullOrEmpty(value))(0).ToString;

                //Now gets the value.
                string t_value = t_clsidSubKey.GetValue(t_valueName).ToString;


                //And finaly if the value ends with the name of the dll (include .dll) we return it

                if (t_value.EndsWith(dllName)) {
                    return t_value;

                }

            }

        }

        //if not exist, return nothing
        return null;

    }
于 2012-08-14T18:26:38.010 回答