كيف ولماذا استخدام أداة regsvr32.exe [أمثلة]

في بعض الأحيان، إذا كنت مستخدمًا لنظام Windows، فإن هناك احتمالًا كبيرًا أنك قد اضطررت في بعض الأحيان إلى تشغيل أداة regsvr32.exe لـ “تسجيل ملف DLL”. إذا كنت قد قمت بذلك، فإنك ربما لم تكن على علم بتحديد ما يحدث بالضبط تحت الغطاء. تُستخدم هذه الأداة الغامضة لإدارة عناصر التوصيل والتضمين (OLE) التي تستخدمها العديد من تطبيقات Windows.

ولكن ما هي بالضبط عنصر التحكم OLE ولماذا ترغب في تسجيل عنصر تحكم OLE؟ في هذا البرنامج التعليمي، ستتعلم العديد من الطرق لتثبيت أو إلغاء تثبيت أو تسجيل أو إلغاء تسجيل عنصر تحكم OLE باستخدام أداة regsvr32.exe.

المتطلبات المسبقة

تأكد من أن لديك المتطلبات أدناه لمتابعة تشغيل أداة regsvr32.exe:

  • نظرًا لأن أداة regsvr32.exe مضمنة في معظم إصدارات Windows، تحتاج فقط إلى كمبيوتر يعمل بنظام Windows ويحتوي على حساب مسؤول.
  • ستحتاج إلى PowerShell 7 للاستفادة من البرنامج النصي PowerShell المضمن في هذا البرنامج التعليمي.

ما هي عناصر التحكم OLE؟

قبل أن تتعلم كيفية استخدام أداة regsvr32.exe، يجب أن تكون لديك فهم أولي حول ما يديره هذا الأداة، وهي عناصر التحكم OLE.

تعتبر وحدات التحكم OLE تقنية متخصصة لنظام ويندوز تم تطويرها لتسهيل تضمين وربط المستندات والكائنات الأخرى. لقد تطورت هذه التقنية على مر السنين، وتم بناء مكونات مختلفة فوق تقنية OLE.

قد سمعت عن نموذج كائن المكون (COM)، نموذج كائن المكون الموزع (DCOM)، أو عن وحدات التحكم ActiveX. كل هذه التقنيات إما تم بناؤها على تقنية OLE أو تعتبر تمديدًا لها، وتحدد واجهة قياسية للوظائف المكتوبة بلغات مختلفة.

تم إهمال ActiveX ولكنه لا يزال متاح عبر Internet Explorer على ويندوز 10، ولكن ليس على Microsoft Edge.

تسجيل وحدات التحكم OLE

الآن بعد أن فهمت ما يفعله أداة regsvr32.exe، حان الوقت لتسجيل وحدة تحكم OLE، وهناك العديد من الأوامر المختلفة لفعل ذلك. اختر أمرًا واحدًا من الأوامر المذكورة أدناه أو جرب كل واحد منها على حده.

يمكنك تسجيل وحدات التحكم OLE عبر PowerShell أو سطر أوامر ويندوز. على أي حال، تأكد من تشغيل سطر الأوامر كمسؤول لضمان تسجيل الوحدة التحكم بشكل صحيح.

عرض نتيجة الواجهة الرسومية (GUI)

تسجيل ملف DLL باستخدام regsvr32، في أبسط حالة استخدام، يتضمن تمرير مسار الملف DLL إلى الأداة. بشكل افتراضي، ستعرض regsvr32 نافذة منبثقة تشير إلى نجاح (أو فشل) العملية. لتسجيل ملف DLL، قم بتوفير اسم الملف أو المسار الكامل للملف كما هو موضح أدناه.

تشغيل الأمر التالي سينشئ الفئات السجلية الضرورية للتحكم في OLE المستهدف في المفتاح HKEY_CLASSES_ROOT\CLSID لحالات x64 أو HKEY_CLASSES_ROOT\WOW6432Node\CLSID لحالات x86.

regsvr32 msxml3.dll

عند النجاح، سترى نتيجة GUI تشير إلى أن DllRegisterServer نجح بنجاح.

Registering a DLL

عند تسجيل تحكم OLE، سيطبق regsvr32.exe مسار البحث في النظام. لذلك، إذا كنت بحاجة لتسجيل ملف محدد خارج ذلك المسار، فمن الأفضل تحديد المسار المطلق للملف.

تسجيل تحكم OLE بصمت

عند تشغيل الأوامر، ليس دائمًا مرغوبًا فيه عرض نافذة منبثقة GUI. لذلك دعنا نتعرف على كيفية كتم أي نافذة منبثقة GUI عند تسجيل تحكم OLE.

لكتم النوافذ منبثقة GUI، قم بتشغيل regsvr32 تليه اسم الملف DLL (msxml3.dll) والمفتاح /s لتسجيل التحكم OLE بصمت. السلبية الوحيدة لهذا الأمر هي أنك ستكتم أيضًا أي رسائل خطأ.

هناك مفتاح غير موثق، /e، يوجد، يكتم فقط رسالة النجاح GUI ولكن يظهر رسالة الخطأ GUI—ذكي!

regsvr32 msxml3.dll /s
Registering a DLL silently

تسجيل التحكم OLE وتحديد إجراء التثبيت

عند تحديد مكتبة DLL لتسجيل OLE، أنت تقوم بدعوة طريقة DllRegisterServer فقط، ولكن هناك أوقات عندما تحتاج إلى اتخاذ إجراء بعد التسجيل. يمكنك القيام بذلك عند تحديد معامل /i.

على سبيل المثال، يمكنك تمرير سلسلة إدخال (U) إلى المعامل /i والتي ستستدعي طريقة DllInstall وطريقة DllRegisterServer في وقت واحد.

تسمح طريقة DllInstall بأن يقوم أداة regsvr32.exe بتثبيت مكتبة DLL بأكثر من طريقة وتفعيل مختلف لمكتبة DLL واحدة.

regsvr32 /i:U shell32.dll
Registering a DLL and running an install command

تحديد إجراء التثبيت دون استدعاء طريقة DllRegisterServer

ربما تريد فقط تثبيت تحكم OLE دون إعادة تسجيله. إذاً، قم بتشغيل الأمر التالي.

regsvr32 /n /i:U shell32.dll

يستخدم الأمر أعلاه المعامل /n لمنع استدعاء طريقة DllRegisterServer لمكتبة DLL shell32.dll في طريقة التثبيت، DllInstall.

Only running an install command but not registering a DLL

إلغاء تسجيل تحكم OLE باستخدام regsvr32.exe

إذا مررت بتسجيل تحكم OLE بدون أخطاء، فهذا أمر مريح. ولكن قد تحين لحظة عندما تحتاج إلى إلغاء تسجيل تحكم OLE عندما يتعارض مع آخرين. لحسن الحظ، تقدم أداة regsvr32.exe القدرة على إلغاء التسجيل وإلغاء تثبيت تحكم OLE.

لإلغاء تسجيل وإلغاء تثبيت تحكم، قم بتشغيل regsvr32.exe وقم بتمرير المعلمة /u لإلغاء تسجيل التحكم OLE. يمكنك أن ترى في النتيجة الرسومية أدناه أن مكتبة الـ msxml3.dll تم إلغاء تثبيتها بنجاح.

لتشغيل إجراء مع عملية الإلغاء التسجيل، قم بتمرير سلسلة الإجراء (U) إلى المعلمة /i. ثم سيقوم أمر regsvr32 بدعوة الأسلوب DllInstall بتلك الإجراء كإلغاء تثبيت، مثل: regsvr32 /i:action /U msxml3.dll.

regsvr32 /U msxml3.dll
Unregistering a DLL

معالجة الأخطاء لـ regsvr32.exe

لقد واجهت تسجيل تحكم OLE بنجاح، ولكن ماذا لو واجهت أمر التسجيل خطأ؟ هناك عدد قليل من الأخطاء التي قد تظهر عند محاولتك لإدارة التحكم. يمكن أن تكون هذه الرسائل مبهمة في بعض الأحيان ولكن يتم تفكيكها أدناه لتعرف ما الذي يتسبب فيها.

FAIL_ARGS ⦿ “Unrecognized flag”
⦿ “Extra argument on command line”
⦿ “This command is only valid when an OLE Custom Control project is open”
⦿ “No DLL name specified”
Implies that a command-line argument was incorrect.
FAIL_OLE “OleInitialize failed” Implies that there was an error in properly initializing the OLE subsystem.
FAIL_LOAD LoadLibary(<dllname) failed> This can be a host of reasons such as a dependent library missing, the DLL is inaccessible due to permissions, or the file is missing.
FAIL_ENTRY ⦿ ” was loaded, but the entry point was not found. does not appear to be an .DLL or .OCX file”
⦿ ” was loaded, but the entry point was not found. may not be exported or a corrupt version may be in memory. Consider using PView to detect and remove it.”
⦿ ” was loaded, but the entry point was not found. may not be exported, or a corrupt version may be in memory. Consider using WPS to detect and remove it.”
Implies that the entry point in the DLL, or function name, is missing.
FAIL_REG <DLLEntryPoint> in <DLLName> failed Implies that despite all the prior steps completing the system still failed to fully register the DLL.

توسيع أداة regsvr32.exe باستخدام PowerShell

نظرًا لتفضيل regsvr32.exe للإخراج الرسومي، قد تكون الأتمتة تحديًا. للتغلب على هذا التحدي، يمكنك لف الأداة regsvr32.exe في وظيفة PowerShell. من خلال إنشاء وظيفة PowerShell، يمكنك تشغيل regsvr32.exe تمامًا كما لو كانت cmdlet PowerShell الأصلية.

كمثال، تحقق من وظيفة PowerShell Invoke-RegSvr32 أدناه. تقوم هذه الوظيفة باستدعاء أداة regsvr32 وتستخدم PowerShell لالتقاط رمز الخروج ومعالجته وفقًا لذلك. ومع تطبيق التحقق من الوسيطة مسبقًا، يمكنك حتى تجنب الأخطاء تمامًا!

لتجربة الوظيفة أدناه، افتح نافذة PowerShell جديدة وانسخ والصق الكود فيها. بعد ذلك، ستكون قادرًا على استدعاء الوظيفة كما هو موضح أدناه.

Function Invoke-RegSvr32 {
	<#
	.SYNOPSIS
	قم بتغليف أداة Windows regsvr32.exe لتسجيل عناصر تحكم OLE في وظيفة PowerShell للمساعدة في التشغيل التلقائي.
	
	.PARAMETER FilePath
	يُحدد اسم ملف DLL أو التحكم لتمريره إلى regsvr32.exe، يجب أن يكون مسار ملف صالحًا.
	
	.PARAMETER InstallString
	قم بتحديد قيمة سلسلة لتمريرها كقيمة pszCmdLine في وظيفة DllInstall عند تسجيل عنصر تحكم.
	
	.PARAMETER Unregister
	إلغاء تسجيل عنصر تحكم تم تسجيله مسبقًا.
	
	.PARAMETER InstallOnly
	لا تسجل عنصر تحكم، قم فقط بتشغيل وظيفة DllInstall، التي يجب أن تمرر أيضًا InstallString.
	
	.EXAMPLE
	PS> Invoke-RegSvr32 "C:\\Windows\\System32\\msxml3.dll"
	#>
  [CmdletBinding()]
  
  Param (
    [ValidateScript({ Test-Path -Path $_ -PathType 'Leaf' })]
    [String]$FilePath,
    [ValidateScript({-Not [String]::IsNullOrWhiteSpace($_)})]
    $InstallString,
    [Switch]$Unregister,
    [Switch]$InstallOnly
  )

  Begin {
    # يتم وثائق رموز الخطأ في هذه المقالة من Microsoft
	  # <https://devblogs.microsoft.com/oldnewthing/20180920-00/?p=99785>
    $ExitCodes = @{
      0 = "SUCCESS";
      1 = "FAIL_ARGS - Invalid Argument";
      2 = "FAIL_OLE - OleInitialize Failed";
      3 = "FAIL_LOAD - LoadLibrary Failed";
      4 = "FAIL_ENTRY - GetProcAddress failed";
      5 = "FAIL_REG - DllRegisterServer or DllUnregisterServer failed.";
    }
  }

  Process {
    If ($InstallOnly -And -Not $InstallString) {
      Write-Error "If you are running DllInstall by itself, an install string must be included."
      Return
    }

    $Arguments = "/s{0}{1}{2} {3}" -f
      (($Unregister) ? ' /U': ''),
      (($InstallString) ? " /i:$InstallString": ''),
      (($InstallOnly) ? ' /n': ''),
      $FilePath

    Write-Verbose $Arguments

    Try {
      $Result = Start-Process -FilePath 'regsvr32.exe' -Args $Arguments -Wait -NoNewWindow -PassThru

      If ($Result.ExitCode -NE 0) {
        Write-Error $ExitCodes[$Result.ExitCode]
      }
    } Catch {
      Write-Error $_.Exception.Message
    }
	}
}

فيما يلي بعض الأمثلة على كيفية استخدام وظيفة Invoke-RegSvr32.

 # محاولة تشغيل DllInstall فقط ضد msxml3.dll مع الإخراج التفصيلي
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll" -Verbose -InstallOnly
 
 # محاولة تسجيل msxml3.dll بصمت مع الإخراج التفصيلي
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll" -Verbose
 
 # محاولة تسجيل msxml3.dll بصمت ولكن دون إخراج
 Invoke-RegSvr32 "C:\Windows\System32\msxml3.dll"
Running Invoke-RegSvr32 PowerShell Command

الاستنتاج

حتى الآن، لقد تعلمت الطريقة المناسبة لتسجيل وإلغاء تسجيل ملفات DLL ومعالجة الأخطاء. على الرغم من أن regsrv32.exe قد لا يُستخدم كثيرًا في المهام اليومية، إلا أنه يوجد أوقات معينة تحتاج فيها إلى تسجيل أو إلغاء تسجيل ملف DLL.

للتوسيع في هذا المجال أكثر، يمكنك توسيع PowerShell ليشمل المزيد من الفحوصات والحالات الحدودية. يمكنك حتى إنشاء وظيفة PowerShell لعرض الضوابط المسجلة في موقع التسجيل CLSID!

Source:
https://adamtheautomator.com/regsvr32-exe/