FIX: تجميعها مجموعات السجلات ADO أو أوامر قد تتسبب تسرب الذاكرة

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

283106
تمت أرشفة هذه المقالة. وتظهر "كما هي" ولن يتم تحديثها بعد الآن.
الأعراض
إذا تطبيق Visual C++ أو مكتبة الارتباط الحيوي (DLL) تجمع الكائنات كائنات بيانات ActiveX (ADO) Recordset أو الأمر "، يمكن حدوث تسرب للذاكرة هامة بسبب إلى الموارد التي يتم تحريرها عندما يتم استدعاء الدالة تحرير على الكائن.

يحدث هذا في كافة إصدارات ADO قبل والإصدار بما في ذلك RTM 2.6 (2.60.6526).
السبب
يتم تطبيق التجميع في كائنات Recordset والأمر باستخدام الفئات CComAggObject في مكتبة قالب النشطة (ATL). يحذف CComAggObject نفسه عند الانتقال إلى صفر به عدد مرجع ببساطة حذف Recordset أو كائن الأوامر أيضاً. كائن Recordset أو الأمرمصطلح يتم أبداً استدعاء الدالة ، وهو يحدث تنظيف الموارد المخصصة.
الحل

MDAC

لحل هذه المشكلة، يجب الحصول على أحدث حزمة خدمة لـ Microsoft MDAC 2.5. للحصول على معلومات إضافية، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف لـ Microsoft:
293312INFO: كيفية الحصول على أحدث MDAC 2.5 حزمة الخدمات
تم تصحيح هذه المشكلة في Microsoft بيانات Access مكونات 2.6 المزود بحزمة الخدمة Service Pack 1.
للحصول على معلومات إضافية، انقر فوق رقم المقالة أدناه لعرضها في "قاعدة المعارف لـ Microsoft:
300635INFO: كيفية الحصول على أحدث MDAC 2.6 حزمة الخدمات
يجب أن يكون للنسخة الإنجليزية من هذا الإصلاح سمات الملفات التالية أو أحدث:

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				
تصريح

MDAC

أقرت Microsoft أن هذه مشكلة في منتجات Microsoft المسردة في بداية هذه المقالة. تم تصحيح هذه المشكلة لأول مرة في Microsoft MDAC 2.5 المزود بحزمة الخدمة Service Pack 3.تم تصحيح هذه المشكلة لأول مرة في Microsoft بيانات Access مكونات 2.6 المزود بحزمة الخدمة Service Pack 1.

نظام التشغيل Windows 2000

أقرت Microsoft أن هذه مشكلة في منتجات Microsoft المسردة في بداية هذه المقالة.
معلومات أخرى
هذا السلوك على الغالب برؤية فقط عندما تمت كتابة التطبيق في Visual C++ ، وعندما المطور تجمع كائنات Recordset أو الأوامر عن عمد. لا تحدث هذه المشكلة في تطبيقات Microsoft Visual Basic بسبب التجميع غير ممكنة من Visual Basic.

يمكن تطبيق الإصدار MDAC 2.5 من هذا الإصلاح العاجل عبر كل 2.5 RTM (2.50.4403) و 2.5 SP1 (2.50.5303).

خطوات إعادة إنشاء السلوك

  1. قم بلصق التعليمة البرمجية التالية إلى تطبيق وحدة تحكم جديد Visual C++ ، و ثم ترجمة التعليمات البرمجية.
    #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. بدء تشغيل مراقبة الأداء "، ثم حدد عداد وحدات البايت الخاصة تشغيل القابل للتنفيذ. لاحظ أن هناك زيادة مقدار الذاكرة المخصصة التي يتم تحرير أبداً.
cocreateinstance التجميع التجميعية تسرب الذاكرة الأمر مجموعة سجلات

تحذير: تمت ترجمة هذا المقال تلقائياً

خصائص

رقم الموضوع: 283106 - آخر مراجعة: 02/28/2014 04:24:24 - المراجعة: 3.2

  • 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
  • kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbmdac250sp3fix kbbug kbfix kbmdac260sp1fix KB283106 KbMtar
تعليقات