В своей программе я использую слегка модифицированную "стандартную" процедуру для анализа установленных в системе голосовых движков и заполнения комбобокса (в моем случае - комбобоксов) их выбора:
Код:
procedure LEARN_ENGINES;
var
NumFound : DWord;
ModeInfo : TTSModeInfo;
begin
try
{Инициализация аудиоустройства}
CoCreateInstance(CLSID_MMAudioDest, Nil, CLSCTX_ALL,
IID_IAudioMultiMediaDevice, fIAMM);
except
end;
{Создание перечисляемого объекта для перебора всех движков в системе
с помощью интерфейса ITTSEnum}
CoCreateInstance(CLSID_TTSEnumerator, Nil, CLSCTX_ALL,
IID_ITTSEnum, aTTSEnum);
aTTSEnum.Reset;//Сбрасываем на первый
aTTSEnum.Next(1, ModeInfo, @NumFound); {Получаем первый движок}
While NumFound > 0 do
begin
s:=String(ModeInfo.szModeName);
if pos('RUS',UpperCase(s))>0 then
COMBO_VOICE_RUS.Items.Add(s)
else
COMBO_VOICE_ENG.Items.Add(s);
aTTSEnum.Next(1, ModeInfo, @NumFound); {Получаем остальные}
end;
end;
Программа нормально работает, в том числе и этот модуль, но после закрытия программы она остается "висеть" в памяти, закрывается только ее видимая часть. Вопрос: Какие действия надо предпринять при закрытии программы, чтобы избежать этого?
PS То, что в неполном закрытии программы виноват именно этот код, убедился точно.
PPS Код брал
отсюда.