Update: ADO-Recordsets oder Befehle aggregieren Speicherverlust verursachen

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 283106 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Wenn eine Visual C++-Anwendung oder dynamic-link Bibliothek (DLL) Objekte (ActiveX Data Objects) Recordset oder Befehl aggregiert, kann ein erheblichen Speicherverlust aufgrund von Ressourcen auftreten, die nicht freigegeben werden, wenn die Release -Funktion für das Objekt aufgerufen wird.

Dies tritt in allen Versionen von ADO vor und einschließlich Version 2.6 RTM (2.60.6526).

Ursache

Aggregation in Recordset- und Command -Objekten wird durch Verwendung der CComAggObject Klassen in ATL (Active Template Library) implementiert. CComAggObject löscht selbst, wenn sein Verweiszähler auf 0 (null) geht und einfach das Recordset oder sowie Command -Objekt löscht. Der Recordset - oder Command -Objekt auch Funktion wird nie aufgerufen, ist die Bereinigung von zugewiesenen Ressourcen auftritt.

Lösung

MDAC

Installieren Sie das neueste Servicepack für Microsoft MDAC 2.5, um dieses Problem zu beheben. Weitere Informationen finden Sie die folgende KB-Artikelnummer:
293312INFO: Wie erhalten Sie die neueste MDAC 2.5 Servicepack
Dieses Problem wurde in Microsoft Data Access Components 2.6 Service Pack 1 behoben.
Weitere Informationen finden Sie die Artikel der Microsoft Knowledge Base:
300635INFO: Wie erhalten Sie die neueste MDAC 2.6 Servicepack
Die englische Version dieses Updates sollte die folgenden Dateiattribute (oder höher) aufweisen:

MDAC 2.5
   Date          Version        Size             File name
   ------------------------------------------------------------
   12/14/2000    2.53.6013.0     20,480 bytes    Msader15.dll	
   12/14/2000    2.53.6013.0    491,792 bytes    Msado15.dll	
   12/14/2000    2.53.6013.0    172,304 bytes    Msadomd.dll	
   12/14/2000    2.53.6013.0     57,616 bytes    Msador15.dll	
   12/14/2000    2.53.6013.0    188,688 bytes    Msadox.dll	
   12/14/2000    2.53.6013.0     57,616 bytes    Msadrh15.dll	   	
   12/14/2000    2.53.6013.0     94,480 bytes    Msjro.dll	
   12/22/2000                   824,744 bytes    Q283106_w2k_sp3_x86_en.exe
				

Status

MDAC

Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel genannten Microsoft-Produkten handelt. Dieses Problem wurde erstmals im Microsoft MDAC 2.5 Service Pack 3.Dieses Problem wurde erstmals im Microsoft Data Access Components 2.6 Service Pack 1.

Windows 2000

Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel genannten Microsoft-Produkten handelt.

Weitere Informationen

Dieses Verhalten ist wahrscheinlich nur, wenn die Anwendung geschrieben wurde, in Visual C++, und wenn der Entwickler bewusst Recordset oder Command -Objekte aggregiert angezeigt werden. Dieses Verhalten tritt in Microsoft Visual Basic-Anwendungen nicht, da Aggregation nicht aus Visual Basic möglich ist.

Die MDAC 2.5 Version dieses Hotfixes kann über 2,5 RTM (2.50.4403) und 2.5 SP1 angewendet werden (2.50.5303).

Schritte zum Reproduzieren des Verhaltens

  1. Fügen Sie den folgenden Code in eine neue Visual C++-Konsolenanwendung, und dann Kompilierung und Ausführung des Codes.
    #include "objbase.h"
    #import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename( "EOF", "adoEOF" )
    
    struct InitOle {
      InitOle()  { ::CoInitialize(NULL); }
      ~InitOle() { ::CoUninitialize();   }
    } _init_InitOle_; 
    
    
    
    class MyClass : public IUnknown
    {
    public:
    	MyClass()
    	{
    		m_refCount = 0;
    	}
    
    	STDMETHODIMP_(ULONG) AddRef()
      {
    		m_refCount++;
    		return m_refCount;
      }
    
    	STDMETHODIMP_(ULONG) Release()
    	{
    		m_refCount--;
    		return m_refCount;
      }
    
    	STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
    	{
    		if (riid == IID_IUnknown) {
    			*ppv = static_cast<IUnknown *> (this);
    			AddRef();
    			return S_OK;
    		}
    
    		return E_NOINTERFACE;
    	}
    
    private:
    	ULONG m_refCount;	
    };
    
    
    int main(int argc, char* argv[])
      {
    	MyClass cls;
    	HRESULT hr;
    	IUnknown *pUnkInner;
    
    	CoInitialize(NULL);
    	cls.AddRef();
    
    	for (int i=0; i<10000; i++)
    	{
    		//while (true) {
    		pUnkInner = NULL;
    		hr = CoCreateInstance(__uuidof(Recordset), &cls, CLSCTX_INPROC_SERVER, IID_IUnknown,
    			(void **) &pUnkInner);
    		pUnkInner->Release();
    	}
    	return 0;
    }
    					
  2. Starten Sie den Systemmonitor, und wählen Sie den Leistungsindikator Private Bytes für die ausführbare Datei ausführen. Es wird eine wachsende Menge an Speicher reserviert wird nie freigegeben.

Eigenschaften

Artikel-ID: 283106 - Geändert am: Montag, 24. Februar 2014 - Version: 3.2
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft ActiveX Data Objects 2.0
  • Microsoft ActiveX Data Objects 2.1
  • Microsoft ActiveX Data Objects 2.5
  • Microsoft ActiveX Data Objects 2.6
  • Microsoft Data Access Components 2.0
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.5
  • Microsoft Data Access Components 2.6
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Keywords: 
kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbmdac250sp3fix kbbug kbfix kbmdac260sp1fix KB283106 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 283106
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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