كيفية التحقق من تثبيت برنامج تشغيل OLEDB على النظام؟

StackOverflow https://stackoverflow.com/questions/113860

  •  02-07-2019
  •  | 
  •  

سؤال

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

من المحتمل أن تكون هناك وظيفة صغيرة لطيفة تقوم بإرجاع جميع برامج التشغيل المثبتة ولكني لم أجدها.

هل كانت مفيدة؟

المحلول

لدى كل موفر GUID مرتبط بفئته.للعثور على الدليل، افتح regedit وابحث في السجل عن اسم الموفر.على سبيل المثال، ابحث عن "Microsoft Jet 4.0 OLE DB Provider".عندما تجده، انسخ المفتاح (قيمة GUID) واستخدمه في بحث التسجيل في التطبيق الخاص بك.

function OleDBExists : boolean;
var
  reg : TRegistry;
begin
  Result := false;

  // See if Advantage OLE DB Provider is on this PC
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    Result := reg.OpenKeyReadOnly( '\SOFTWARE\Classes\CLSID\{C1637B2F-CA37-11D2-AE5C-00609791DC73}' );
  finally
    reg.Free;
  end;
end;

نصائح أخرى

هذا سؤال قديم ولكني أواجه نفس المشكلة الآن وربما يساعد هذا الآخرين.

في دلفي 7 يوجد إجراء في ADODB يقوم بإرجاع TStringList مع أسماء الموفرين.

مثال الاستخدام:

names := TStringList.Create;
ADODB.GetProviderNames(names);

if names.IndexOf('SQLNCLI10')<>-1 then
  st := 'Provider=SQLNCLI10;'
else if names.IndexOf('SQLNCLI')<>-1 then
  st := 'Provider=SQLNCLI;'
else if names.IndexOf('SQLOLEDB')<>-1 then
  st := 'Provider=SQLOLEDB;';

يمكنك الحصول على اسم موفر ADO والتحقق منه في التسجيل على المسار HKEY_CLASSES_ROOT\[Provider_Name].

ألن تكون الطريقة الأسهل هي محاولة إجراء اتصال عند بدء التشغيل واكتشاف الخطأ؟

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

أعتقد أن كائنات OLEDB المعنية مدفونة في مكان ما في السجل، نظرًا لأن OLEDB/ADO هو حل COM.سيكون تخميني هو معرفة ما إذا كان يمكنك العثور على المعرف الفريد العمومي (GUID) الذي تم تثبيت برنامج التشغيل الخاص بك فيه كما هو الحال في السجل.

namespace Common {
  public class CLSIDHelper {

  [DllImport("ole32.dll")]
  static extern int CLSIDFromProgID([MarshalAs(UnmanagedType.LPWStr)] string lpszProgID, out Guid pclsid);


  public static Guid RetrieveGUID(string Provider) {
    Guid CLSID = Guid.Empty;
    int Ok = CLSIDFromProgID(Provider, out CLSID);
    if (Ok == 0)
       return CLSID;
    return null;
  }
 }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top