?????: ???? Regsvr32.exe Registers ?? COM DLL Unregisters

???? ?????? ???? ??????
???? ID: 207132 - ?? ???????? ?? ?????? ??? ?? ?? ???? ???? ???? ??.
??? ?? ??????? ???? | ??? ?? ??????? ????

?? ????? ??

??????

?? ???? ????? ???? ?? ?? ???? RegSvr32.exe ????????? registers ?? ??? ???????? ???? (COM) ????????-???? ????????? (DLL) unregisters. ?? ???? COM DLL ?? ??? RegSvr32.exe ????????? ?? ????? ???? ?? ?????? ???? ??? ??????? ???? ???? ????????? ?? ?????? ???? ?? ??? ?? ??????? ?? ????? ?? ???? ???

???? ???????

?? ???? ??? RegSvr32.exe ?? ????? Win32 ?????? ???:
  • OleInitialize
  • LoadLibraryDLL ?? ??? ???? ?? ???
  • DllRegisterServer??,DllUnregisterServer
  • FreeLibrary
  • OleUninitialize
????? ???? RegSvr32.exe ???? ???????LoadLibrary,DllRegisterServer??,DllUnregisterServer??????? ?????LoadLibrary??? ??? DLL ????????? ?? ??? ???? ??, ?? ??? ????????? ?? ??? ??, ?? ???? ?? ???? ????LoadLibrary???? ?? ?? ???? ??? ??? ?????????? DLL ?? ??? ???? ?? ??? ?? ?????? ?? ??? ??? ?? ?? ?? ???? ???? ?? ??; ????? ?????? ???, ??? ??? ?????? DLL ????? ???? ?? ?? ????????? ?? ??? ???? ???

???::?? ???? ?? ? ??? ?????????? ???? DLL ?? ???? ??? ?? ???? ???? ?? ??? Depends.exe ????? ?? ????? ?? ???? ???? Depends.exe ?? ??? Microsoft ??????????? ?????????? ????????? ??? (SDK), ?? Microsoft Visual Studio ?? ??? ???? ????? ???

???? DLL ?? ??????????? ???? ????DllRegisterServer, ??DllUnregisterServer, ?? ????? ????? ?? COM ??? ?? ??? ?????? ????????? ???????????? ?? ????? ?? ??? ?????? ?? ?? ??? ??? RegSvr32.exe ????????? ????? ?????? ?? ???? ?? ??? ????? ??, ?? ?????? appropriately ??? ?????

???::??? ?? COM DLL ????? ?? ??? Microsoft ?????? ???????? ????????? (ATL) ??????? ?? ????? ???? ???????? ????? ?? ??? ?????? ???DllRegisterServer, ??DllUnregisterServer.

??? ?? Microsoft Visual C++ ?? ????? ???? ?? ??? ??????????? SDK ????? \Platform SDK\Samples\Com\Fundamentals\Async\Server ?? ??????

Step-by-Step ??????

????? ????? ????? ???? ?? ?? ????????? ???????? ?? ??????? ?? ???? COM DLL ???????? ???? ?? ??? ????? ?? ???? ????

?? ???? ??? ?? ???? RegSvr32.exe ?? ???? ???? ?? ??? ?? ??? ???? ??? ?? ??????? ???, ?? ???? ????? ?? ????????? ?? ?????? ???? ?? ??? ??? ???? ???

????? ?? ??? ?? Win32 ????????? ?? ?? ???? COM DLL ???????? ???? ?? ??? ????? ?? ???? ??? ??, ????? ????? ?? ????:
  1. ????? C++, ??? ?? ??? Win32 ????????? ??????? ?? ??? ?????? ??? ??????? ??????? ?????
  2. Register.cpp ???? ?? .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. ????????? ?????, ?? ??? ?? ????? ???? ?? ???? COM DLL ???????? ???? ?? ????

??????

???????? ??????? ?? ??? ?????? ?? Microsoft ???????? ??? ????? ?? ??? ????? ???? ???????? ?? ????? ????:
140346OLE ???????? ??????? ???? ???? ?? ??? ??????? ???? ?? ????
141824?????: ??????? ?????? OLE ??????? ?????????
146219HOWTO: ??????? ??? ActiveX ???????? (.ocx) ?????????
185599FIX: OleAut32.dll ?? ???????? ??? ??? ??

???

???? ID: 207132 - ????? ???????: 28 ??????? 2011 - ??????: 3.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
??????: 
kbinfo kbmt KB207132 KbMthi
???? ?????? ????????
??????????: ?? ???? ?? ???? ??????? ?? ????? ?? 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