Hallo Delphi-Gemeinde,
ich möchte mich heute mit einem (hoffentlich) kleinen Problem an euch wenden. Leider habe ich bisher keine Lösung oder Erklärung für mein Problem gefunden.
Ich habe folgende Routine in mein Programm eingebaut.
Delphi-Quellcode:
procedure TfrmMain.ListAvailableSQLServers(Names: TStringList);
{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
function PtCreateADOObject(
const ClassID: TGUID): IUnknown;
var
Status: HResult;
FPUControlWord: Word;
begin
asm
FNSTCW FPUControlWord
end;
Status := CoCreateInstance(
CLASS_Recordset,
nil,
CLSCTX_INPROC_SERVER
or
CLSCTX_LOCAL_SERVER,
IUnknown,
Result);
asm
FNCLEX
FLDCW FPUControlWord
end;
OleCheck(Status);
end;
{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
var
RSCon: ADORecordsetConstruction;
Rowset: IRowset;
SourcesRowset: ISourcesRowset;
SourcesRecordset: _Recordset;
SourcesName, SourcesType: TField;
begin
SourcesRecordset := PtCreateADOObject(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;
Hat bisher auch super auf mehreren Rechnern funktioniert. Vor einiger Zeit startete das Programm auf einem Rechner sehr langsam. Auf allen anderen Rechnern startete das Programm wie gewohnt. Bisher jedenfalls. Mittlerweile ist der Programmstart auf allen Rechnern langsam.
Der Grund für den langsamen Start ist wohl die folgende Programmzeile.
OleCheck(SourcesRowset.GetSourcesRowset(nil, IRowset, 0, nil, IUnknown(Rowset)));
Die Ausführung dieses Befehls dauert 45 sekunden. Vorher wurde das kpl. Programm in ca. 5-10 sekunden gestartet.
An den einzelnen Rechnern wurde eigentlich nichts verändert. Normale Win 10 Pro Rechner, mit unterschiedlichen Virenprogrammen (MS und Norton) und unterschiedlichen Office-Paketen (2010 bis Office 365). Lediglich die Windowsupdates wurden installiert.
Nun meine Frage, hat jemand eine Idee wo das Problem liegen könnte?
Vorab schon mal vielen Dank.