ΠΛΗΡΟΦΟΡΙΕΣ: Πώς οι Regsvr32.exe καταχωρητών και καταργεί την καταχώρηση COM DLL

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 207132 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Αυτό το άρθρο περιγράφει τον τρόπο το πρόγραμμα RegSvr32.exe καταχωρεί και καταργεί την καταχώρηση ενός μοντέλου αντικειμένου στοιχείου (COM) βιβλιοθήκη δυναμικής σύνδεσης (DLL). Μπορείτε να χρησιμοποιήσετε αυτές τις πληροφορίες για την αντιμετώπιση προβλημάτων σχετικά με σφάλματα που παρουσιάζονται κατά την προσπάθειά σας να χρησιμοποιήσετε το πρόγραμμα RegSvr32.exe με το COM DLL.

Περισσότερες πληροφορίες

RegSvr32.exe καλεί τις παρακάτω συναρτήσεις Win32 με την εξής σειρά:
  • OleInitialize
  • Η φόρτωση βιβλιοθήκηςη φόρτωση του αρχείου DLL
  • DllRegisterServerήDllUnregisterServer
  • FreeLibrary
  • OleUninitialize
Συχνότατα, RegSvr32.exe αποτυγχάνει, επειδή ηΗ φόρτωση βιβλιοθήκης,DllRegisterServer, ήDllUnregisterServerσυνάρτηση αποτυγχάνει.Η φόρτωση βιβλιοθήκηςμπορεί να αποτύχει, εάν το αρχείο DLL δεν βρίσκεται στην καθορισμένη διαδρομή, ή εάν η καθορισμένη διαδρομή είναι εσφαλμένη.Η φόρτωση βιβλιοθήκηςΕπίσης μπορεί να αποτύχει, εάν μία από τις εξαρτήσεις του αρχείου DLL που προσπαθείτε να φορτώσετε δεν ισχύει, με άλλα λόγια, εάν ένα εξαρτημένο αρχείο DLL δεν υπάρχει ή δεν είναι στην καθορισμένη διαδρομή.

ΣΗΜΕΙΩΣΗ:Μπορείτε να χρησιμοποιήσετε το εργαλείο Depends.exe για τον έλεγχο ή όχι οι ικανοποιούνται όλες τις εξαρτήσεις του αρχείου DLL. Depends.exe περιλαμβάνεται με το Microsoft Platform κιτ ανάπτυξης λογισμικού (SDK), που διατίθεται μαζί με το Microsoft Visual Studio.

Πρέπει να εφαρμόσετε το αρχείο DLLDllRegisterServerANDDllUnregisterServer, που περιέχουν τη λογική που είναι απαραίτητο για να προσθέσετε ή να διαγράψετε τις καταχωρήσεις μητρώου που απαιτείται για το στοιχείο COM. RegSvr32.exe εντοπίζει το σημείο εισόδου σε αυτές τις λειτουργίες και καλεί κατάλληλα.

ΣΗΜΕΙΩΣΗ:Εάν χρησιμοποιείτε τον Οδηγό Microsoft Active βιβλιοθήκη προτύπων (ATL) για τη δημιουργία του αρχείου DLL COM, ο οδηγός δημιουργεί τον απαραίτητο κώδικα γιαDllRegisterServerANDDllUnregisterServer.

Εάν χρησιμοποιείτε το Microsoft Visual C++, ανατρέξτε το δείγμα του Platform SDK στο \Platform SDK\Samples\Com\Fundamentals\Async\Server.

Παράδειγμα βήμα προς βήμα

Το ακόλουθο δείγμα περιγράφει τις λειτουργίες μητρώου που μπορείτε να χρησιμοποιήσετε για να καταχωρήσετε και να καταργήσετε την καταχώρηση του COM DLL.

Μπορείτε επίσης να γράψετε το δικό σας κώδικα για να το κάνετε Τι σημαίνει RegSvr32.exe. Αυτό βοηθά στην αναγνώριση, να απομονώσετε και να αντιμετωπίσετε σφάλματα πιο εύκολα.

Για να δημιουργήσετε μια εφαρμογή Win32 που μπορείτε να χρησιμοποιήσετε για να καταχωρήσετε ή να καταργήσετε την καταχώρηση του αρχείου DLL του COM, ακολουθήστε τα παρακάτω βήματα:
  1. Στη Visual C++, δημιουργήστε μια νέα εφαρμογή 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 σφάλματα
146219ΔΙΑΔΙΚΑΣΙΕΣ: Καταχώρηση με μη αυτόματο τρόπο το στοιχείο ελέγχου ActiveX (.ocx)
185599ΕΝΗΜΕΡΩΣΗ: OleAut32.dll έχει καταχωρηθεί εσφαλμένα

Ιδιότητες

Αναγν. άρθρου: 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 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της 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