从注册表动态获取DLL路径名

时间:2012-08-14 17:09:31

标签: c# asp.net .net vb.net winforms

我的软件安装后有一个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名称,如何进行整个注册表检查并查找其路径名?

2 个答案:

答案 0 :(得分:3)

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

对于64位尝试在HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID \

中查找值

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

答案 1 :(得分:1)

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

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

最后进入GUID键,有InprocServer32子键,其中默认值包含进入sistem的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#CODE:

    /// <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;

    }