如何检查系统上是否安装了OLEDB驱动程序?

时间:2020-03-06 14:31:48  来源:igfitidea点击:

启动应用程序时,如何确保安装了特定的OLEDB驱动程序?我使用Delphi中的ADO,并且如果缺少驱动程序,则想显示一个描述性错误消息。从ADO返回的错误并不总是那么用户友好。

可能有一个不错的小功能,可以返回所有已安装的驱动程序,但我还没有找到它。

解决方案

难道不是最简单的方法就是尝试在启动时建立连接并捕获错误?

我的意思是,我们可能会遇到一些不同的错误,具体取决于(例如)用户在线,但是我们应该可以对其进行测试。

我相信有问题的OLEDB对象会埋在注册表中的某个位置,因为OLEDB / ADO是COM解决方案。我的猜测是看是否可以在注册表中找到安装驱动程序的GUID。

每个提供程序都有一个与其类关联的GUID。要找到GUID,请打开regedit,然后在注册表中搜索提供者名称。例如对于搜索" Microsoft Jet 4.0 OLE DB提供程序"。找到它后,复制密钥(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;

我们可以获取ADO提供程序名称,并在注册表中的路径HKEY_CLASSES_ROOT \ [Provider_Name]中对其进行检查。

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;
  }
 }
}