0

为什么要注册 DLL?我对 DLL 有很多基本的疑问,我试图将它们放在下面列出的问题表格中:

  1. 为什么我们需要注册一个DLL?

  2. 当我们注册一个 DLL 时会发生什么?

  3. 当我在 C# 代码中使用“LoadLibrary”时,我不进行任何注册。两者之间有什么联系/区别?(注册 DLL 和加载 DLL)

  4. 我可以注册所有的 DLL 吗?或者是否有一些无法注册的 DLL,为什么?

如果有人可以推荐一些在线文章来澄清我的疑问,那将有很大帮助!否则代码片段。

我正在使用这段代码,但它并没有给出我需要的东西,这就是我在这里问的原因....它在 32 位机器上工作正常,但它在 64 位机器上给出了拒绝路径错误

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Security;
using System.Management;
using System.IO;
using CCC_DLLRegistar.LoadLibrary;
using System.Security.Principal;
using System.Diagnostics;



namespace CCC_DLLRegistar
{
    public partial class Form1 : Form
    {

        #region Is64BitOperatingSystem (IsWow64Process)


        public static bool Is64BitOperatingSystem()
        {
            if (IntPtr.Size == 8)  // 64-bit programs run only on Win64
            {
                return true;
            }
            else  // 32-bit programs run on both 32-bit and 64-bit Windows
            {
                // Detect whether the current process is a 32-bit process 
                // running on a 64-bit system.
                bool flag;
                return ((DoesWin32MethodExist("kernel32.dll", "IsWow64Process") &&
                    IsWow64Process(GetCurrentProcess(), out flag)) && flag);
            }
        }


        static bool DoesWin32MethodExist(string moduleName, string methodName)
        {
            IntPtr moduleHandle = GetModuleHandle(moduleName);
            if (moduleHandle == IntPtr.Zero)
            {
                return false;
            }
            return (GetProcAddress(moduleHandle, methodName) != IntPtr.Zero);
        }

        [DllImport("kernel32.dll")]
        static extern IntPtr GetCurrentProcess();

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr GetModuleHandle(string moduleName);

        [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
        static extern IntPtr GetProcAddress(IntPtr hModule,
            [MarshalAs(UnmanagedType.LPStr)]string procName);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool IsWow64Process(IntPtr hProcess, out bool wow64Process);

        #endregion


        #region Is64BitOperatingSystem (WMI)


        public static bool Is64BitOperatingSystem(string machineName,
            string domain, string userName, string password)
        {
            ConnectionOptions options = null;
            if (!string.IsNullOrEmpty(userName))
            {

                options = new ConnectionOptions();
                options.Username = userName;
                options.Password = password;
                options.Authority = "NTLMDOMAIN:" + domain;
            }
            // Else the connection will use the currently logged-on user

            // Make a connection to the target computer.
            ManagementScope scope = new ManagementScope("\\\\" +
                (string.IsNullOrEmpty(machineName) ? "." : machineName) +
                "\\root\\cimv2", options);
            scope.Connect();


            ObjectQuery query = new ObjectQuery(
                "SELECT AddressWidth FROM Win32_Processor");

            // Perform the query and get the result.
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
            ManagementObjectCollection queryCollection = searcher.Get();
            foreach (ManagementObject queryObj in queryCollection)
            {
                if (queryObj["AddressWidth"].ToString() == "64")
                {
                    return true;
                }
            }

            return false;
        }

        #endregion




        public Form1()
        {
            InitializeComponent();
        }

        private string _RootPath = string.Empty;
        private string _path = string.Empty;
        private List<string> _Regfiles;

        DLLHelper obj;

        public string path
        {
            get { return _path; }
            set { _path = value; }
        }


        public string RootPath
        {
            get { return _RootPath; }
            set { _RootPath = value; }

         }

        private void Form1_Load(object sender, EventArgs e)
        {

            // Solution 1. Is64BitOperatingSystem (IsWow64Process)
            // Determine whether the current operating system is a 64 bit 
            // operating system.
            bool f64bitOS = Is64BitOperatingSystem();
            //Console.WriteLine("The current operating system {0} 64-bit.",
            //    f64bitOS ? "is" : "is not");

            // Solution 2. Is64BitOperatingSystem (WMI)
            // Determine whether the current operating system is a 64 bit 
            // operating system through WMI. The function is also able to 
            // query the bitness of OS on a remote machine.
            try
            {
                f64bitOS = Is64BitOperatingSystem(".", null, null, null);
                //Console.WriteLine("The current operating system {0} 64-bit.",
                //    f64bitOS ? "is" : "is not");
                if (f64bitOS == true)
                {
                    RootPath = "C:\\windows\\SysWow64\\";
                }
                else
                {
                    RootPath = "C:\\Windows\\System32\\";
                }

                bool isAdmin = new WindowsPrincipal(WindowsIdentity.GetCurrent())
                 .IsInRole(WindowsBuiltInRole.Administrator) ? true : false;

                if (isAdmin)
                {
                    MessageBox.Show("you are an administrator");
                }
                else
                {
                    MessageBox.Show("You are not an administrator");
                }
                path = Application.StartupPath + "\\CCC DLL\\";

                List<string> regsvr = new List<string>();

                foreach (string s in Directory.GetFiles(path, "*.*").Select(Path.GetFileName))
                {
                    regsvr.Add(Application.StartupPath + "\\CCC DLL\\" + s);
                }

                foreach (string filepath in regsvr)
                {
                    Registar_Dlls(filepath);
                }

                _Regfiles=new List<string>();
                foreach (string s in Directory.GetFiles(path, "*.dll").Select(Path.GetFileName))
                {
                    _Regfiles.Add(Application.StartupPath + "\\CCC DLL\\" + s);
                    if (DLLHelper.UnmanagedDllIs64Bit(Application.StartupPath + "\\CCC DLL\\" + s) == true)
                    {
                        MessageBox.Show("62 bit");
                    }
                    else
                    {
                        MessageBox.Show("32 bit");
                    }
                }

                foreach (string s in Directory.GetFiles(path, "*.ocx").Select(Path.GetFileName))
                    _Regfiles.Add(Application.StartupPath + "\\CCC DLL\\" + s);



                    foreach (string filepath in _Regfiles)
                    {
                        obj = new DLLHelper(filepath);
                        obj.DumpToFile(RootPath + obj.GetDLLName());                       
                    }

                    MessageBox.Show("Register Colmpleted");

            }
            catch (Exception ex)
            {
                //Console.WriteLine("Is64BitOperatingSystem throws the exception: {0}",
                //    ex.Message);
                MessageBox.Show(ex.Message.ToString());
            }
        }




        public  void Registar_Dlls(string filePath)
        {

            try
            {
                //'/s' : Specifies regsvr32 to run silently and to not display any message boxes.
                //string arg_fileinfo = "/s" + " " + "\"" + filePath + "\"";

                string arg_fileinfo = RootPath +"\regsvr32.exe"+" "+ "/s" + " "  + "\"" + filePath;
                Process reg = new Process();
                //This file registers .dll files as command components in the registry.
                reg.StartInfo.FileName = "cmd.exe"; //"regsvr32.exe";
                reg.StartInfo.Arguments = arg_fileinfo;
                reg.StartInfo.UseShellExecute = false;
                reg.StartInfo.CreateNoWindow = true;
                reg.StartInfo.RedirectStandardOutput = true;
                if (System.Environment.OSVersion.Version.Major >= 6)
                {
                    reg.StartInfo.Verb = "runas";
                }
                reg.Start();
                reg.WaitForExit();
                reg.Close();
               // MessageBox.Show("Successfully Registered your Ocx files");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


    }
}
4

0 回答 0