איך ולמה להשתמש בכלי regsvr32.exe [דוגמאות]

לפעמים, אם אתה משתמש ב-Windows, יש סיכוי שכבר היית צריך להריץ את הכלי regsvr32.exe כדי "לרשום DLL". אם כן, סביר שלא היית מודע לדיוק של מה שקורה מתחת למכסה. כלי קריפטי זה משמש לניהול של בקרי Object Linking and Embedding (OLE) שרבות מיישמי Windows משתמשים בהם.

אך מה בדיוק הוא בקר OLE ולמה תרצה לרשום בקר OLE? במדריך הזה, תלמד את הדרכים השונות להתקין, להסיר, לרשום או לבטל את רישום בקר OLE בעזרת הכלי regsvr32.exe.

דרישות מוקדמות

ודא שיש לך את הדרישות הבאות כדי להשתמש בכלי regsvr32.exe:

  • מאחר וכלי regsvr32.exe מובנה ברוב גרסאות ה-Windows, אתה צריך רק מחשב Windows עם חשבון מנהל.
  • יהיה עליך להשתמש ב-PowerShell 7 כדי להשתמש בתסריט PowerShell שכלול במדריך זה.

מהם בקרי OLE?

לפני שתלמד כיצד להשתמש בכלי regsvr32.exe, עליך להבין בצורה רודימנטרית מה ניהול כלי זה, בקרי OLE.

פקדים OLE הם טכנולוגיה המיועדת לחלונות שפותחה כדי לסייע בהטבעה ובקישור למסמכים ולאובייקטים אחרים. הטכנולוגיה התפתחה מאז והיא נבנתה על ידי מרכיבים שונים.

ייתכן ושמעת על מודל אובייקטי של רכיב (COM), מודל אובייקטי של רכיב פיזורי (DCOM) או בקרי ActiveX. כל אחת מהטכנולוגיות הללו נבנתה על ידי טכנולוגיית OLE או היא הרחבה שלה ומגדירה ממשק תקן לפונקציות שנכתבו בשפות שונות.

ActiveX הוא מיושן אך עדיין זמין דרך Internet Explorer ב- Windows 10, אך לא דרך Microsoft Edge.

הרשמת פקדים OLE

עכשיו שהבנת מה עושה כלי ה-regsvr32.exe, זמן לרשום פקד OLE, וישנן מספר גרסאות של פקודות כדי לעשות זאת. תרגיש חופשי לבחור אחת מהגרסאות הבאות או פשוט לנסות כל אחת במקום.

אפשר לרשום פקדי OLE דרך PowerShell או דרך פקודת חלון פקודה של Windows. בכל מקרה, ודא שאתה מפעיל את שורת הפקודה שלך כמנהל כדי לוודא שהפקד רשום כראוי.

הצגת תוצאה גרפית

רישום קובץ DLL עם regsvr32, בשימוש הפשוט ביותר, כולל עברת את נתיב ה-DLL לכלי. בברירת המחדל, regsvr32 יציג חלון קופץ המציין הצלחה (או כישלון). כדי לרשום קובץ DLL, יש לספק את שם או הנתיב המלא של ה-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 באופן שקט

כאשר אתם מריצים פקודות, לא תמיד רצוי להציג חלון קופץ. אז בואו נראה כיצד תדכאו כל חלון קופץ כאשר מרשמים שליטת OLE.

כדי לדכא את החלונות הקופצים, הריצו 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. ניתן לראות בתוצאת ה־GUI שלמטה שה־DLL של 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 מעדיף את הפלט של ה־GUI, אוטומציה עשויה להיות אתגר. כדי להתמודד עם האתגר הזה, ניתן לקפוץ את הכלי של ה־regsvr32.exe בפונקציה של PowerShell. על ידי יצירת פונקציה של PowerShell, ניתן להריץ את ה־regsvr32.exe בדיוק כמו פקודת cmdlet טבעית של PowerShell.

כדי לקבל דוגמה, בדוק את הפונקציה Invoke-RegSvr32 של PowerShell שמופיעה למטה. פונקציה זו קוראת לכלי regsvr32 ומשתמשת בפוולשל ללכוד את קוד היציאה ולעבד אותו בהתאם. ועם החיבור של אימות ארגומנטים מראש, תוכל אף למנוע שגיאות לגמרי!

כדי לנסות את הפונקציה למטה, פתח קונסול פוולשל חדש והעתק את הקוד אליו. לאחר מכן, תוכל לקרוא לפונקציה כפי שמוצג למטה.

Function Invoke-RegSvr32 {
	<#
	.SYNOPSIS
	ארוז את יישום regsvr32.exe של Windows לרשות תכנות פוולשל להקל על אוטומציה.
	
	.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.

כדי להרחיב עוד יותר, תוכל להשתמש בפוורשל כדי לכלול יותר בדיקות ומקרים קצה. תוכל אף ליצור פונקציה בפוורשל שתציג את השלטים הרשומים במיקום הרשומות של CLSID!

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