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

ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ

ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้: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 เป็นไม่ลงทะเบียนไม่ถูกต้อง

คำเตือน: บทความนี้ได้รับการแปลโดยอัตโนมัติ

คุณสมบัติ

รหัสบทความ: 207132 - การตรวจสอบครั้งสุดท้าย: 12/05/2015 10:45:25 - ฉบับแก้ไข: 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

  • kbnosurvey kbarchive kbinfo kbmt KB207132 KbMtth
คำติชม