ข้อมูล: วิธีการลงทะเบียน Regsvr32.exe และ Unregisters DLLs COM

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 207132 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

บทความนี้อธิบายวิธีการที่โปรแกรม RegSvr32.exe ลงทะเบียน และ unregisters ไลบรา dynamic-การเชื่อมโยงรูปแบบวัตถุคอมโพเนนต์ (COM) (DLL) คุณสามารถใช้ข้อมูลนี้เพื่อแก้ไขข้อผิดพลาดที่เกิดขึ้นเมื่อคุณพยายามใช้ RegSvr32.exe โปรแกรมกับ DLL COM ของคุณ

ข้อมูลเพิ่มเติม

regsvr32.exe เรียกฟังก์ชัน Win32 ต่อไปนี้ในใบสั่งนี้:
  • OleInitialize
  • LoadLibraryโหลด DLL
  • DllRegisterServerหรือDllUnregisterServer
  • FreeLibrary
  • OleUninitialize
บ่อย RegSvr32.exe ไม่ได้เนื่องจากการLoadLibrary,DllRegisterServerหรือDllUnregisterServerฟังก์ชันล้มเหลวLoadLibraryสามารถไม่ ถ้า DLL ไม่ได้อยู่ในเส้นทางที่ระบุ หรือ ถ้าเส้นทางที่ระบุไม่ถูกต้องLoadLibraryสามารถยังล้มเหลวถ้ามีการอ้างอิงของ DLL ที่คุณกำลังพยายามโหลดอย่างใดอย่างหนึ่งคือไม่ตรงตาม ในอย่างอื่น ถ้า DLL ที่อ้างถึงไม่มีอยู่ หรือไม่ได้อยู่ในเส้นทางที่ระบุได้

หมายเหตุ::คุณสามารถใช้เครื่องมือ Depends.exe เพื่อตรวจสอบหรือไม่ทั้งหมดของการอ้างอิงของ DLL ของคุณมีการตอบสนอง Depends.exe ถูกรวมอยู่กับ Microsoft แพลตฟอร์มที่ซอฟต์แวร์พัฒนา Kit (SDK), ซึ่งจัดส่งกับ Microsoft Visual Studio

DLL ของคุณต้องปฏิบัติตามDllRegisterServerและDllUnregisterServerซึ่งประกอบด้วยตรรกะที่จำเป็นเพื่อเพิ่ม หรือลบรายการรีจิสทรีที่จำเป็นสำหรับคอมโพเนนต์ COM regsvr32.exe จุดไปยังฟังก์ชันเหล่านี้การค้นหา และเรียกเหล่านั้นอย่างเหมาะสม

หมายเหตุ::ถ้าคุณใช้ตัวช่วยสร้าง Microsoft Active แม่แบบของไลบรารี (ATL) เพื่อสร้าง COM DLL ตัวช่วยสร้างรหัสที่จำเป็นสำหรับDllRegisterServerและDllUnregisterServer.

ถ้าคุณใช้ Microsoft ในการ Visual c ++ อ้างอิงถึงตัวอย่างของแพลตฟอร์มที่ SDK ที่ \Platform SDK\Samples\Com\Fundamentals\Async\Server

ตัวอย่าง step-by-Step

ตัวอย่างต่อไปนี้อธิบายถึงฟังก์ชันของรีจิสทรีที่คุณสามารถใช้เพื่อลงทะเบียน และการถอนการลงทะเบียน DLL COM ของคุณ

นอกจากนี้คุณสามารถเขียนรหัสของคุณเองทำ RegSvr32.exe ทำอะไร ซึ่งช่วยในการระบุ แยก และแก้ไขข้อผิดพลาดได้ง่ายขึ้น

เมื่อต้องการสร้างโปรแกรมประยุกต์ Win32 ที่คุณสามารถใช้เพื่อลงทะเบียน หรือการถอนการลงทะเบียน DLL ของ COM ดำเนินการขั้นตอนต่อไปนี้:
  1. ใน c ++ Visual สร้างโปรแกรมประยุกต์ Win32 ที่ใหม่ที่ชื่อว่าการลงทะเบียน ยอมรับค่าเริ่มต้นทั้งหมด
  2. สร้างแฟ้มการ.cpp ใหม่ที่ชื่อ Register.cpp และเพิ่มลงในโครงการ
  3. วางรหัสต่อไปนี้ใน Register.cpp:
    #include <tchar.h>
    #include <afxole.h>
    #include <stdlib.h>
    
    #define FAIL_ARGS    1
    #define FAIL_OLE     2
    #define FAIL_LOAD    3
    #define FAIL_ENTRY   4
    #define FAIL_REG     5 
    
    static char szAppName[] = "Register";
    static char szUsage[] = "\n\nUsage: Register [/u] dllname";
    static char szDllRegSvr[] = "DllRegisterServer";
    static char szDllUnregSvr[] = "DllUnregisterServer"; 
    
    int PASCAL WinMain(
    		   HINSTANCE hInstance, 
    		   HINSTANCE hPrev, 
    		   LPSTR pszCmdLine, 
    		   int nCmdShow)
    {   
    	int iReturn = 0;       
    	HRESULT (FAR STDAPICALLTYPE * lpDllEntryPoint)(void);  
    	static TCHAR szMsgBuffer[_MAX_PATH*4];         
    	BOOL bVisualC = FALSE; 
    	BOOL bSilent = FALSE;  
    	BOOL bUnregister = FALSE;      
    	LPSTR pszDllEntryPoint = szDllRegSvr;  
    	LPSTR pszDllName = NULL;
    	char szCmdLineCopy[_MAX_PATH]; 
    	strcpy(szCmdLineCopy, pszCmdLine);             
    	LPSTR pszTmp = szCmdLineCopy;  
    	LPSTR pszTok;          
    	
    	while ((pszTok = strtok(pszTmp, " \t")) != NULL)       
    	{                                
    		pszTmp = NULL; 
    		
    		if ((pszTok[0] == '-') || (pszTok[0] == '/'))
    		{      
    			switch (pszTok[1])     
    			{      
    			case 'v':      
    			case 'V':
    				bVisualC = TRUE;
    				break;         
    			case 's':      
    			case 'S':
    				bSilent = TRUE;
    				break;         
    			case 'u':      
    			case 'U':
    				bUnregister = TRUE;
    				pszDllEntryPoint = szDllUnregSvr;
    				break;         
    			default:
    				wsprintf(szMsgBuffer, 
    					"Unrecognized flag: %s%s", 
    					pszTok, 
    					(LPCSTR)szUsage);
    				if (!bSilent)  
    					MessageBox(NULL, 
    					   szMsgBuffer, 
    					   szAppName, 
    					   MB_TASKMODAL | MB_ICONEXCLAMATION);
    				return FAIL_ARGS;      
    			}
    		}
    		else
    		{      
    			if (pszDllName == NULL)
    				pszDllName = pszTok;   
    			else   
    			{
    				wsprintf(szMsgBuffer, 
    					"Extra argument on command line: %s%s", 
    					pszTok, 
    					(LPCSTR)szUsage);
    				if (!bSilent)  
    					MessageBox(NULL, 
    					   szMsgBuffer, 
    					   szAppName, 
    					   MB_TASKMODAL | MB_ICONEXCLAMATION);
    				return FAIL_ARGS;      
    			}
    		}      
    	}      
    	
    	if (pszDllName == NULL)        
    	{
    		if (!bSilent)
    		{      
    			if (bVisualC)  
    			{
    				MessageBox(NULL, 
    				"This command is only valid when "
    				"an OLE Custom Control project is open.", 
    				bUnregister ? 
    				"Unregister Control" : "Register Control",
    				MB_TASKMODAL | MB_ICONEXCLAMATION);
    			}
    			else   
    			{
    				wsprintf(szMsgBuffer, 
    					_T("No DLL name specified%s"), 
    					(LPCSTR)szUsage);
    				MessageBox(NULL, 
    					szMsgBuffer, 
    					szAppName, 
    					MB_TASKMODAL | MB_ICONEXCLAMATION);
    			}
    		}
    		return FAIL_ARGS;      
    	}
    	
    	if (FAILED(OleInitialize(NULL)))       
    	{
    		if (!bSilent)  
    			MessageBox(NULL, 
    				"OleInitialize failed.", 
    				szAppName, 
    				MB_TASKMODAL | MB_ICONINFORMATION);
    		return FAIL_OLE;       
    	}              
    	
    	HINSTANCE hLib = LoadLibrary(pszDllName);      
    	
    	if (hLib < (HINSTANCE)HINSTANCE_ERROR) 
    	{
    		wsprintf(szMsgBuffer, 
    			"LoadLibary(\"%s\") failed.", 
    			pszDllName);
    		MessageBox(NULL, 
    			szMsgBuffer, 
    			szAppName, 
    			MB_TASKMODAL | MB_ICONEXCLAMATION);
    		iReturn = FAIL_LOAD;
    		goto CleanupOle;       
    	}
    	
    	(FARPROC&)lpDllEntryPoint = GetProcAddress(hLib, pszDllEntryPoint);
    	
    	if (lpDllEntryPoint == NULL)   
    	{
    #ifdef _WIN32
    		int nLen = strlen(pszDllName);
    		if ((nLen > 4) && 
    			(stricmp(pszDllName + nLen - 4, ".dll") != 0)  && 
    			(stricmp(pszDllName + nLen - 4, ".ocx") != 0))
    		{      
    			wsprintf(szMsgBuffer, 
    			"%s was loaded, but the %s entry point "
    			"was not found. %s does not appear to be "
    			"an .DLL or .OCX file.", 
    			pszDllName, 
    			pszDllEntryPoint, 
    			pszDllName);
    		}
    		else
    		{      
    			wsprintf(szMsgBuffer, 
    			"%s was loaded, but the %s entry point "
    			"was not found. %s may not be exported, "
    			"or a corrupt version may be in memory.  "
    			"Consider using PView to detect and remove it.",
    			pszDllName, 
    			pszDllEntryPoint, 
    			pszDllEntryPoint);
    		}
    #else
    		wsprintf(szMsgBuffer, 
    		"%s was loaded, but the %s entry point "
    		"was not found. %s may not be exported, "
    		"or a corrupt version may be in memory.  "
    		"Consider using WPS to detect and remove it.",
    		pszDllName, 
    		pszDllEntryPoint, 
    		pszDllEntryPoint);
    #endif
    		
    		if (!bSilent)  
    			MessageBox(NULL, 
    				szMsgBuffer, 
    				szAppName, 
    				MB_TASKMODAL | MB_ICONEXCLAMATION);
    		iReturn = FAIL_ENTRY;
    		
    		goto CleanupLibrary;   
    	}
    	
    	if (FAILED((*lpDllEntryPoint)()))      
    	{
    		wsprintf(szMsgBuffer, 
    			"%s in %s failed.", 
    			pszDllEntryPoint, 
    			pszDllName);
    		
    		if (!bSilent)  
    			MessageBox(NULL, 
    				szMsgBuffer, 
    				szAppName, 
    				MB_TASKMODAL | MB_ICONEXCLAMATION);
    		iReturn = FAIL_REG;
    		
    		goto CleanupLibrary;   
    	}      
    	
    	wsprintf(szMsgBuffer,
    		"%s in %s succeeded.", 
    		pszDllEntryPoint, 
    		pszDllName);     
    	
    	if (! bSilent)
    		MessageBox(NULL, 
    			szMsgBuffer, 
    			szAppName, 
    			MB_TASKMODAL | MB_ICONINFORMATION); 
    CleanupLibrary:     
    	FreeLibrary(hLib); 
    	
    CleanupOle: 
    	OleUninitialize();     
    	
    	return iReturn;
    }
    					
  4. สร้างโปรแกรมประยุกต์ และใช้ในการลงทะเบียน หรือถอนการลงทะเบียน DLL COM ของคุณ

ข้อมูลอ้างอิง

สำหรับข้อมูลเพิ่มเติม ให้คลิกหมายเลขบทความด้านล่างนี้ เพื่อดูบทความใน Microsoft Knowledge Base::
140346สาเหตุที่เป็นไปได้สำหรับการลงทะเบียนของคอนโทรล OLE ไม่สำเร็จ
141824ข้อมูล: ทั่วไปของระยะไกล OLE Automation ผิด
146219HOWTO: ทะเบียนตัวควบคุม ActiveX (.ocx) ด้วยตนเอง
185599การแก้ไข: OleAut32.dll เป็นไม่ลงทะเบียนไม่ถูกต้อง

คุณสมบัติ

หมายเลขบทความ (Article ID): 207132 - รีวิวครั้งสุดท้าย: 28 กันยายน 2554 - Revision: 5.0
ใช้กับ
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professional Edition
  • Microsoft Windows 95
  • Microsoft Windows NT Server 4.0 Standard Edition
  • Microsoft Windows NT Workstation 4.0 Developer Edition
Keywords: 
kbinfo kbmt KB207132 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:207132

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com