INFO: Jak Regsvr32.exe registruje a zruší registraci knihovny COM DLL

Překlady článku Překlady článku
ID článku: 207132 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Tento článek popisuje, jak RegSvr32.exe program registruje a zruší registraci Component Object Model (COM) dynamická knihovna (DLL). Tyto informace slouží k odstraňování chyb, ke kterým dochází při pokusu použít RegSvr32.exe program knihovny COM DLL.

Další informace

Nástroj RegSvr32.exe volá následující funkce Win32 v tomto pořadí:
  • Provedení funkce OleInitialize
  • Funkce LoadLibrary Načtení knihovny DLL
  • Funkce DllRegisterServer nebo DllUnregisterServer
  • FreeLibrary
  • Provedení funkce OleUninitialize
Nejčastěji používané nástroje RegSvr32.exe se nezdaří, protože Funkce LoadLibrary, Funkce DllRegisterServer, nebo DllUnregisterServer funkce se nezdaří.Funkce LoadLibrary může selhat, pokud knihovna DLL není v zadané cestě nebo je zadaná cesta nesprávná. Funkce LoadLibrary Můžete také selhat, pokud není splněna jedna závislostí knihovny DLL, která se pokoušíte načíst; jinými slovy Pokud závislá knihovna DLL není k dispozici nebo není v zadané cestě.

POZNÁMKA: Nástroj Depends.exe můžete zkontrolovat, zda jsou splněny všechny závislosti knihovny DLL. Depends.exe zahrnuta s Microsoft Platform Software Development Kit (SDK), která je dodávána s aplikací Microsoft Visual Studio.

Knihovny DLL musí implementovat. Funkce DllRegisterServer a DllUnregisterServer, které obsahují logiku, je nutné přidat nebo odstranit položky registru požadované komponenty modelu COM. Nástroj RegSvr32.exe vyhledá vstupní bod těchto funkcí a odpovídajícím způsobem jejich volání.

POZNÁMKA: Pokud použijete průvodce Microsoft Active šablonu knihovny (ATL) k vytvoření knihovny COM DLL, průvodce vygeneruje kód nezbytné Funkce DllRegisterServer a DllUnregisterServer.

Pokud používáte Microsoft Visual C++, odkazovat na vzorku Platform SDK v \Platform SDK\Samples\Com\Fundamentals\Async\Server.

Podrobný příklad

Následující příklad popisuje funkce registru, které lze registrovat a rušit registraci knihovny COM DLL.

Můžete také napsat kód k tomu nemá RegSvr32.exe. To pomáhá identifikovat, oddělení a snadněji řešit chyby.

Vytvoření aplikace typu Win32, který slouží k registraci nebo zrušení registrace knihovny DLL modelu COM, proveďte následující kroky:
  1. V jazyce C++ vytvoření nové aplikace Win32 s názvem rejstříku. Přijmete všechny výchozí hodnoty.
  2. Vytvořit nový soubor cpp s názvem Register.cpp a přidejte jej do projektu.
  3. V Register.cpp, vložte následující kód:
    #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. Vytvoření aplikace a pomocí registrace nebo zrušení registrace knihovny COM DLL.

Odkazy

Další informace získáte v následujících článcích znalostní báze Microsoft:
140346 Možné příčiny selhání registrace ovládacího prvku OLE
141824 INFO: Běžné vzdálené OLE Automation chyby
146219 POSTUPY: Ručně zaregistrujte ovládací prvek ActiveX (OCX)
185599 Oprava: OleAut32.dll není zaregistrován nesprávně

Vlastnosti

ID článku: 207132 - Poslední aktualizace: 26. dubna 2011 - Revize: 5.0
Informace v tomto článku jsou určeny pro produkt:
  • 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
Klíčová slova: 
kbinfo kbmt KB207132 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:207132

Dejte nám zpětnou vazbu

 

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