INFO: Como regsvr32.exe registos e anula o registo de DLLs

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 207132
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Sumário
Este artigo descreve como o programa a ferramenta RegSvr32.exe regista e anula o registo de uma biblioteca de ligação dinâmica (DLL) COM (Component Object Model). Pode utilizar estas informações para resolver erros que ocorrem quando tenta utilizar a ferramenta RegSvr32.exe programa com as DLL COM.
Mais Informação
A ferramenta RegSvr32.exe chama as seguintes funções de Win32 por esta ordem:
  • OleInitialize
  • LoadLibrary carregar a DLL
  • DllRegisterServer ou DllUnregisterServer
  • FreeLibrary
  • OleUninitialize
Na maioria dos casos, a ferramenta RegSvr32.exe falha porque a função LoadLibrary , DllRegisterServer ou DllUnregisterServer falha. LoadLibrary pode falhar se a DLL não está no caminho especificado, ou se o caminho especificado está incorrecto. LoadLibrary também pode falhar se uma das dependências da DLL que está a tentar carregar não for obedecida; por outras palavras, se uma DLL dependente não está presente ou não estiver no caminho especificado.

NOTA: Pode utilizar a ferramenta de Depends.exe para verificar ou não forem cumpridas todas as dependências de DLL. Depends.exe está incluído com o Microsoft Platform Software Development Kit (SDK), que é fornecida com o Microsoft Visual Studio.

A DLL tem de implementar DllRegisterServer e DllUnregisterServer , que contém a lógica que é necessária adicionar ou eliminar as entradas de registo necessárias para o componente COM. A ferramenta RegSvr32.exe encontra o ponto de entrada para estas funções e as chama correctamente.

NOTA: Se utilizar o Assistente do Microsoft Active Directory modelo de biblioteca (ATL) para criar a DLL de COM, o assistente gera o código necessário para DllRegisterServer e DllUnregisterServer .

Se utilizar o Microsoft Visual C++, consulte o exemplo de Platform SDK no \Platform SDK\Samples\Com\Fundamentals\Async\Server.

Exemplo passo a passo

O exemplo que se segue descreve as funções de registo que pode utilizar para registar e anular o registo da DLL COM.

Também pode escrever o seu próprio código para fazer o que faz a ferramenta RegSvr32.exe. Isto ajuda a identificar, isolar e resolver erros mais facilmente.

Para criar uma aplicação de Win32 que pode utilizar para registar ou anular o registo da DLL COM, execute os seguintes passos:
  1. No Visual C++, crie uma nova aplicação de Win32 denominada registo. Aceite todas as predefinições.
  2. Crie um novo ficheiro .cpp chamado Register.cpp e adicionar ao projecto.
  3. Cole o seguinte código no 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. Compilar a aplicação e utiliza-a registar ou desregistar DLL COM.
Referências
Para obter informações adicionais, clique nos números de artigo existentes abaixo para visualizar os artigos na Microsoft Knowledge Base:
140346Razões possíveis para falha de registo do controlo OLE
141824INFO: Remoto OLE Automation erros comuns
146219COMO: Registar manualmente um controlo ActiveX (.ocx)
185599CORRECÇÃO: OleAut32.dll não está incorrectamente registado

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 207132 - Última Revisão: 12/05/2015 10:45:22 - Revisão: 2.5

Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server, Microsoft Windows 2000 Professional Edition, Microsoft Windows 2000 Datacenter Server, Microsoft Windows 95, Microsoft Windows 98 Standard Edition, Microsoft Windows NT Advanced Server 3.1, Microsoft Windows NT Server 4.0 Standard Edition, Microsoft Windows NT Workstation 4.0 Developer Edition

  • kbnosurvey kbarchive kbmt kbinfo KB207132 KbMtpt
Comentários