如何检查系统上是否安装了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; } } }