Все оказалось не просто и я окончательно запутался.
Автор
статьи предлагает использовать интерфейс ITfLanguageProfileNotifySink для получения ссобщейни об изменении языкового профайла. Окунувшись в
MSDN, узнаем, что для этого нам необходимо получить объект от ITfSource, который, ы свою очередь мы получим из объекта другого интерфейса: ITfInputProcessorProfiles, путем вызова QueryInterface. Я решил начать с ITfInputProcessorProfiles. В Delphi XE2 он не реализован, к сожалению. Из того же
MSDN узнаем, что получить указатель на этот интерыейс можно вызовом функции CoCreateInstance с параметром CLSID_TF_InputProcessorProfiles. Запускаем regedit и выясняем как выглядит GUID:
HKEY_CLASSES_ROOT\CLSID\{33C53A50-F456-4884-B049-85FD643ECFED}.
Далее объявляю интерфейсы:
Код:
const
{ from Msctf.h }
{$EXTERNALSYM CLSID_TF_InputProcessorProfiles}
CLSID_TF_InputProcessorProfiles: TGUID = '{33C53A50-F456-4884-B049-85FD643ECFED}';
SID_InProcProfiles = '{33C53A51-F456-4884-B049-85FD643ECFED}';
type
{$EXTERNALSYM ITfInputProcessorProfiles}
ITfInputProcessorProfiles = interface(IUnknown)
[SID_InProcProfiles]
function Register(const clsid: TCLSID): HRESULT; stdcall;
function GetActiveLanguageProfile(const clsid: TCLSID;
var langid: DWORD;
var profile: TGUID
): HRESULT; stdcall;
end;
И пытаюсь получить указатель:
Код:
procedure MyProc(Sender: TObject);
var
Status: HRESULT;
FLangId: DWORD;
FProfile: TGUID;
tfipProfiles: ITfInputProcessorProfiles ;
begin
Coinitialize(nil);
tfipProfiles := nil;
Status := CoCreateInstance(CLSID_TF_InputProcessorProfiles,
nil,
CLSCTX_INPROC_SERVER,
ITfInputProcessorProfiles,
tfipProfiles);
if Status = S_OK then
try
tfipProfiles.Register(CLSID_TF_InputProcessorProfiles);
finally
tfipProfiles._Release;
end;
end;
И ничего не получаю :-( То есть Status равен каком-то огромному отрацательному числу.
Может быть кто-нить подскажет, что я делаю не так?