The example from here , adopted for x64, is now compatible with both x32 / x64 systems.
uses
ActiveX, ComObj, OleDB, DB, ADOInt, ADODB;
function CreateADOObject(const ClassID: TGUID): IUnknown;
var
Status: HResult;
{$IFDEF CPUX86}
FPUControlWord: Word;
{$ENDIF CPUX86}
begin
{$IFDEF CPUX86}
asm
FNSTCW FPUControlWord
end;
{$ENDIF CPUX86}
Status := CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IUnknown, Result);
{$IFDEF CPUX86}
asm
FNCLEX
FLDCW FPUControlWord
end;
{$ENDIF CPUX86}
if (Status = REGDB_E_CLASSNOTREG) then
raise Exception.Create('error')
else
OleCheck(Status);
end;
procedure ListAvailableSQLServers(Names: TStringList);
var
RSCon: ADORecordsetConstruction;
Rowset: IRowset;
SourcesRowset: ISourcesRowset;
SourcesRecordset: _Recordset;
SourcesName, SourcesType: TField;
begin
SourcesRecordset := CreateADOObject(CLASS_Recordset) as _Recordset;
RSCon := SourcesRecordset as ADORecordsetConstruction;
SourcesRowset := CreateComObject(ProgIDToClassID('SQLOLEDB Enumerator')) as ISourcesRowset;
OleCheck(SourcesRowset.GetSourcesRowset(nil, IRowset, 0, nil, IUnknown(Rowset)));
RSCon.Rowset := RowSet;
with TADODataSet.Create(nil) do
try
Recordset := SourcesRecordset;
SourcesName := FieldByName('SOURCES_NAME');
SourcesType := FieldByName('SOURCES_TYPE');
Names.BeginUpdate;
Names.Clear;
try
while not EOF do
begin
if (SourcesType.AsInteger = DBSOURCETYPE_DATASOURCE) and
(SourcesName.AsString <> '')
then
Names.Add(SourcesName.AsString);
Next;
end;
finally
Names.EndUpdate;
end;
finally
Free;
end;
end;
procedure GetServer;
var
oItems: TStringList;
begin
oItems:= TStringList.Create;
try
ListAvailableSQLServers(oItems);
// To something with oItems
ShowMessage(oItems.Text);
finally
oItems.Free;
end;
end;
source
share