ReactOS 0.4.16-dev-1602-gd4d52e1
inputprocessor.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS CTF
3 * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later)
4 * PURPOSE: ITfInputProcessorProfiles implementation
5 * COPYRIGHT: Copyright 2009 Aric Stewart, CodeWeavers
6 * Copyright 2025 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
7 */
8
9#include "precomp.h"
10
11#include <wine/debug.h>
13
15
17 : public ITfInputProcessorProfiles
18 , public ITfSource
19 , public ITfInputProcessorProfileMgr
20 // , public ITfInputProcessorProfilesEx
21 // , public ITfInputProcessorProfileSubstituteLayout
22{
23public:
26
27 static HRESULT CreateInstance(IUnknown *pUnkOuter, CInputProcessorProfiles **ppOut);
28
29 // ** IUnknown methods **
30 STDMETHODIMP QueryInterface(REFIID iid, LPVOID *ppvObj) override;
33
34 // ** ITfInputProcessorProfiles methods **
35 STDMETHODIMP Register(_In_ REFCLSID rclsid) override;
36 STDMETHODIMP Unregister(_In_ REFCLSID rclsid) override;
38 _In_ REFCLSID rclsid,
41 _In_ const WCHAR *pchDesc,
42 _In_ ULONG cchDesc,
43 _In_ const WCHAR *pchIconFile,
44 _In_ ULONG cchFile,
45 _In_ ULONG uIconIndex) override;
47 _In_ REFCLSID rclsid,
49 _In_ REFGUID guidProfile) override;
54 _Out_ CLSID *pclsid,
55 _Out_ GUID *pguidProfile) override;
58 _In_ REFCLSID rclsid,
59 _In_ REFGUID guidProfiles) override;
61 _In_ REFCLSID rclsid,
63 _In_ REFGUID guidProfiles) override;
65 _In_ REFCLSID rclsid,
66 _Out_ LANGID *plangid,
67 _Out_ GUID *pguidProfile) override;
69 _In_ REFCLSID rclsid,
72 _Out_ BSTR *pbstrProfile) override;
76 _Out_ LANGID **ppLangId,
77 _Out_ ULONG *pulCount) override;
80 _Out_ IEnumTfLanguageProfiles **ppEnum) override;
82 _In_ REFCLSID rclsid,
85 _In_ BOOL fEnable) override;
87 _In_ REFCLSID rclsid,
90 _Out_ BOOL *pfEnable) override;
92 _In_ REFCLSID rclsid,
95 _In_ BOOL fEnable) override;
97 _In_ REFCLSID rclsid,
100 _In_ HKL hKL) override;
101
102 // ** ITfSource methods **
105 _In_ IUnknown *punk,
106 _Out_ DWORD *pdwCookie) override;
107 STDMETHODIMP UnadviseSink(_In_ DWORD dwCookie) override;
108
109 // ** ITfInputProcessorProfileMgr methods **
111 _In_ DWORD dwProfileType,
115 _In_ HKL hkl,
116 _In_ DWORD dwFlags) override;
118 _In_ DWORD dwProfileType,
122 _In_ HKL hkl,
123 _In_ DWORD dwFlags) override;
125 _In_ DWORD dwProfileType,
129 _In_ HKL hkl,
130 _Out_ TF_INPUTPROCESSORPROFILE *pProfile) override;
133 _Out_ IEnumTfInputProcessorProfiles **ppEnum) override;
135 _In_ REFCLSID rclsid,
136 _In_ DWORD dwFlags) override;
138 _In_ REFCLSID rclsid,
141 _In_ const WCHAR *pchDesc,
142 _In_ ULONG cchDesc,
143 _In_ const WCHAR *pchIconFile,
144 _In_ ULONG cchFile,
145 _In_ ULONG uIconIndex,
146 _In_ HKL hklsubstitute,
147 _In_ DWORD dwPreferredLayout,
148 _In_ BOOL bEnabledByDefault,
149 _In_ DWORD dwFlags) override;
151 _In_ REFCLSID rclsid,
154 _In_ DWORD dwFlags) override;
157 _Out_ TF_INPUTPROCESSORPROFILE *pProfile) override;
158
159protected:
163};
164
166
168 : public IEnumGUID
169{
170public:
172 virtual ~CProfilesEnumGuid();
173
175
176 // ** IUnknown methods **
177 STDMETHODIMP QueryInterface(REFIID iid, LPVOID *ppvObj) override;
180
181 // ** IEnumGUID methods **
183 _In_ ULONG celt,
184 _Out_ GUID *rgelt,
185 _Out_ ULONG *pceltFetched) override;
186 STDMETHODIMP Skip(_In_ ULONG celt) override;
187 STDMETHODIMP Reset() override;
188 STDMETHODIMP Clone(_Out_ IEnumGUID **ppenum) override;
189
190protected:
194};
195
197
200{
201public:
203 virtual ~CEnumTfLanguageProfiles();
204
206
207 // ** IUnknown methods **
208 STDMETHODIMP QueryInterface(REFIID iid, LPVOID *ppvObj) override;
211
212 // ** IEnumTfLanguageProfiles methods **
215 _In_ ULONG ulCount,
216 _Out_ TF_LANGUAGEPROFILE *pProfile,
217 _Out_ ULONG *pcFetch) override;
218 STDMETHODIMP Reset() override;
219 STDMETHODIMP Skip(_In_ ULONG ulCount) override;
220
221protected:
230
232};
233
235
238{
239public:
242
243 // ** IUnknown methods **
244 STDMETHODIMP QueryInterface(REFIID iid, LPVOID *ppvObj) override;
247
248 // ** IEnumTfInputProcessorProfiles methods **
251 _In_ ULONG ulCount,
253 _Out_ ULONG *pcFetch) override;
254 STDMETHODIMP Reset() override;
255 STDMETHODIMP Skip(_In_ ULONG ulCount) override;
256
257protected:
259};
260
262
263static void
265{
266 HKEY key;
267 WCHAR buf[39], buf2[39], fullkey[168];
268 DWORD disposition = 0;
270
271 TRACE("\n");
272
273 StringFromGUID2(rclsid, buf, _countof(buf));
275 StringCchPrintfW(fullkey, _countof(fullkey), L"%s\\%s\\%s\\0x%08x\\%s",
276 szwSystemTIPKey, buf, L"LanguageProfile", langid, buf2);
277
279 KEY_READ | KEY_WRITE, NULL, &key, &disposition);
280
281 if (error == ERROR_SUCCESS && disposition == REG_CREATED_NEW_KEY)
282 {
283 DWORD zero = 0;
284 RegSetValueExW(key, L"Enable", 0, REG_DWORD, (PBYTE)&zero, sizeof(DWORD));
285 }
286
287 if (error == ERROR_SUCCESS)
289}
290
292
294 : m_cRefs(1)
295 , m_currentLanguage(::GetUserDefaultLCID())
296{
298}
299
301{
302 TRACE("destroying %p\n", this);
304}
305
307{
308 *ppvObj = NULL;
309
310 if (iid == IID_IUnknown || iid == IID_ITfInputProcessorProfiles)
311 *ppvObj = static_cast<ITfInputProcessorProfiles *>(this);
312 else if (iid == IID_ITfInputProcessorProfileMgr)
313 *ppvObj = static_cast<ITfInputProcessorProfileMgr *>(this);
314 else if (iid == IID_ITfSource)
315 *ppvObj = static_cast<ITfSource *>(this);
316
317 if (!*ppvObj)
318 {
319 WARN("unsupported interface: %s\n", debugstr_guid(&iid));
320 return E_NOINTERFACE;
321 }
322
323 AddRef();
324 return S_OK;
325}
326
328{
329 return ::InterlockedIncrement(&m_cRefs);
330}
331
333{
335 if (!ret)
336 delete this;
337 return ret;
338}
339
341{
342 HKEY tipkey;
343 WCHAR buf[39], fullkey[68];
344
345 TRACE("(%p) %s\n", this, debugstr_guid(&rclsid));
346
347 StringFromGUID2(rclsid, buf, _countof(buf));
348 StringCchPrintfW(fullkey, _countof(fullkey), L"%s\\%s", szwSystemTIPKey, buf);
349
351 &tipkey, NULL) != ERROR_SUCCESS)
352 {
353 return E_FAIL;
354 }
355
356 RegCloseKey(tipkey);
357 return S_OK;
358}
359
361{
362 WCHAR buf[39], fullkey[68];
363
364 TRACE("(%p) %s\n", this, debugstr_guid(&rclsid));
365
366 StringFromGUID2(rclsid, buf, _countof(buf));
367 StringCchPrintfW(fullkey, _countof(fullkey), L"%s\\%s", szwSystemTIPKey, buf);
368
371 return S_OK;
372}
373
375 _In_ REFCLSID rclsid,
378 _In_ const WCHAR *pchDesc,
379 _In_ ULONG cchDesc,
380 _In_ const WCHAR *pchIconFile,
381 _In_ ULONG cchFile,
382 _In_ ULONG uIconIndex)
383{
384 HKEY tipkey, fmtkey;
385 WCHAR buf[39], fullkey[100];
386 DWORD disposition = 0;
388
389 TRACE("(%p) %s %x %s %s %s %i\n", this, debugstr_guid(&rclsid), langid,
390 debugstr_guid(&guidProfile), debugstr_wn(pchDesc, cchDesc),
391 debugstr_wn(pchIconFile, cchFile), uIconIndex);
392
393 StringFromGUID2(rclsid, buf, _countof(buf));
394 StringCchPrintfW(fullkey, _countof(fullkey), L"%s\\%s", szwSystemTIPKey, buf);
395
396 error = RegOpenKeyExW(HKEY_LOCAL_MACHINE, fullkey, 0, KEY_READ | KEY_WRITE, &tipkey);
397 if (error != ERROR_SUCCESS)
398 return E_FAIL;
399
401 StringCchPrintfW(fullkey, _countof(fullkey), L"%s\\0x%08x\\%s", L"LanguageProfile", langid, buf);
402
403 error = RegCreateKeyExW(tipkey, fullkey, 0, NULL, 0, KEY_READ | KEY_WRITE,
404 NULL, &fmtkey, &disposition);
405 if (error == ERROR_SUCCESS)
406 {
407 DWORD zero = 0x0;
408 RegSetValueExW(fmtkey, L"Description", 0, REG_SZ, (PBYTE)pchDesc, cchDesc * sizeof(WCHAR));
409 RegSetValueExW(fmtkey, L"IconFile", 0, REG_SZ, (PBYTE)pchIconFile, cchFile * sizeof(WCHAR));
410 RegSetValueExW(fmtkey, L"IconIndex", 0, REG_DWORD, (PBYTE)&uIconIndex, sizeof(uIconIndex));
411 if (disposition == REG_CREATED_NEW_KEY)
412 RegSetValueExW(fmtkey, L"Enable", 0, REG_DWORD, (PBYTE)&zero, sizeof(DWORD));
413 RegCloseKey(fmtkey);
415 }
416 RegCloseKey(tipkey);
417
418 return (error == ERROR_SUCCESS) ? S_OK : E_FAIL;
419}
420
422 _In_ REFCLSID rclsid,
425{
426 FIXME("STUB:(%p)\n", this);
427 return E_NOTIMPL;
428}
429
431{
432 TRACE("(%p) %p\n", this, ppEnum);
433
435}
436
440 _Out_ CLSID *pclsid,
441 _Out_ GUID *pguidProfile)
442{
443 WCHAR fullkey[168], buf[39];
444 HKEY hKey;
445 DWORD count;
447
448 TRACE("%p) %x %s %p %p\n", this, langid, debugstr_guid(&catid), pclsid, pguidProfile);
449
450 if (cicIsNullPtr(&catid) || !pclsid || !pguidProfile)
451 return E_INVALIDARG;
452
454 StringCchPrintfW(fullkey, _countof(fullkey), L"%s\\%s\\0x%08x\\%s", szwSystemCTFKey,
455 L"Assemblies", langid, buf);
456
458 if (error != ERROR_SUCCESS)
459 return S_FALSE;
460
461 count = sizeof(buf);
462 error = RegQueryValueExW(hKey, L"Default", 0, NULL, (PBYTE)buf, &count);
463 if (error != ERROR_SUCCESS)
464 {
466 return S_FALSE;
467 }
468 CLSIDFromString(buf, pclsid);
469
470 error = RegQueryValueExW(hKey, L"Profile", 0, NULL, (PBYTE)buf, &count);
471 if (error == ERROR_SUCCESS)
472 CLSIDFromString(buf, pguidProfile);
473
475
476 return S_OK;
477}
478
481 _In_ REFCLSID rclsid,
482 _In_ REFGUID guidProfiles)
483{
484 WCHAR fullkey[168], buf[39];
485 HKEY hKey;
486 GUID catid;
487 HRESULT hr;
488 ITfCategoryMgr *catmgr;
490 static const GUID * tipcats[3] = { &GUID_TFCAT_TIP_KEYBOARD,
493
494 TRACE("(%p) %x %s %s\n", this, langid, debugstr_guid(&rclsid), debugstr_guid(&guidProfiles));
495
496 if (cicIsNullPtr(&rclsid) || cicIsNullPtr(&guidProfiles))
497 return E_INVALIDARG;
498
500 if (FAILED(hr))
501 return hr;
502
503 if (catmgr->FindClosestCategory(rclsid, &catid, tipcats, _countof(tipcats)) != S_OK)
504 hr = catmgr->FindClosestCategory(rclsid, &catid, NULL, 0);
505 catmgr->Release();
506 if (FAILED(hr))
507 return E_FAIL;
508
510 StringCchPrintfW(fullkey, _countof(fullkey), L"%s\\%s\\0x%08x\\%s", szwSystemCTFKey, L"Assemblies", langid, buf);
511
513 NULL, &hKey, NULL);
514 if (error != ERROR_SUCCESS)
515 return E_FAIL;
516
517 StringFromGUID2(rclsid, buf, _countof(buf));
518 RegSetValueExW(hKey, L"Default", 0, REG_SZ, (PBYTE)buf, sizeof(buf));
519 StringFromGUID2(guidProfiles, buf, _countof(buf));
520 RegSetValueExW(hKey, L"Profile", 0, REG_SZ, (PBYTE)buf, sizeof(buf));
522
523 return S_OK;
524}
525
527 _In_ REFCLSID rclsid,
529 _In_ REFGUID guidProfiles)
530{
531 HRESULT hr;
533 TF_LANGUAGEPROFILE LanguageProfile;
534
535 TRACE("(%p) %s %x %s\n", this, debugstr_guid(&rclsid), langid, debugstr_guid(&guidProfiles));
536
538 return E_INVALIDARG;
539
540 if (get_active_textservice(rclsid, NULL))
541 {
542 TRACE("Already Active\n");
543 return E_FAIL;
544 }
545
546 hr = IsEnabledLanguageProfile(rclsid, langid, guidProfiles, &enabled);
547 if (FAILED(hr) || !enabled)
548 {
549 TRACE("Not Enabled\n");
550 return E_FAIL;
551 }
552
553 LanguageProfile.clsid = rclsid;
554 LanguageProfile.langid = langid;
555 LanguageProfile.guidProfile = guidProfiles;
556 LanguageProfile.fActive = TRUE;
557 return add_active_textservice(&LanguageProfile);
558}
559
561 _In_ REFCLSID rclsid,
562 _Out_ LANGID *plangid,
563 _Out_ GUID *pguidProfile)
564{
566
567 TRACE("(%p) %s %p %p\n", this, debugstr_guid(&rclsid), plangid, pguidProfile);
568
569 if (cicIsNullPtr(&rclsid) || !plangid || !pguidProfile)
570 return E_INVALIDARG;
571
572 if (get_active_textservice(rclsid, &profile))
573 {
574 *plangid = profile.langid;
575 *pguidProfile = profile.guidProfile;
576 return S_OK;
577 }
578 else
579 {
580 *pguidProfile = GUID_NULL;
581 return S_FALSE;
582 }
583}
584
586 _In_ REFCLSID rclsid,
589 _Out_ BSTR *pbstrProfile)
590{
591 FIXME("STUB:(%p)\n", this);
592 return E_NOTIMPL;
593}
594
596{
597 TRACE("(%p) 0x%x\n", this, m_currentLanguage);
598
599 if (!plangid)
600 return E_INVALIDARG;
601
602 *plangid = m_currentLanguage;
603 return S_OK;
604}
605
607{
609 struct list *cursor;
610 BOOL accept;
611
612 FIXME("STUB:(%p)\n", this);
613
615 {
616 accept = TRUE;
617 sink->OnLanguageChange(langid, &accept);
618 if (!accept)
619 return E_FAIL;
620 }
621
622 /* TODO: On successful language change call OnLanguageChanged sink */
623 return E_NOTIMPL;
624}
625
627 _Out_ LANGID **ppLangId,
628 _Out_ ULONG *pulCount)
629{
630 FIXME("Semi-STUB:(%p)\n", this);
631 *ppLangId = (LANGID *)CoTaskMemAlloc(sizeof(LANGID));
632 **ppLangId = m_currentLanguage;
633 *pulCount = 1;
634 return S_OK;
635}
636
640{
641 TRACE("(%p) %x %p\n", this, langid, ppEnum);
642
643 if (!ppEnum)
644 return E_INVALIDARG;
645
646 CEnumTfLanguageProfiles *profenum;
648 *ppEnum = static_cast<IEnumTfLanguageProfiles *>(profenum);
649 return hr;
650}
651
653 _In_ REFCLSID rclsid,
656 _In_ BOOL fEnable)
657{
658 HKEY key;
659 WCHAR buf[39], buf2[39], fullkey[168];
661
662 TRACE("(%p) %s %x %s %i\n", this, debugstr_guid(&rclsid), langid, debugstr_guid(&guidProfile), fEnable);
663
664 StringFromGUID2(rclsid, buf, _countof(buf));
666 StringCchPrintfW(fullkey, _countof(fullkey), L"%s\\%s\\%s\\0x%08x\\%s", szwSystemTIPKey, buf,
667 L"LanguageProfile", langid, buf2);
668
670 if (error != ERROR_SUCCESS)
671 return E_FAIL;
672
673 RegSetValueExW(key, L"Enable", 0, REG_DWORD, (LPBYTE)&fEnable, sizeof(fEnable));
675 return S_OK;
676}
677
679 _In_ REFCLSID rclsid,
682 _Out_ BOOL *pfEnable)
683{
684 HKEY key;
685 WCHAR buf[39], buf2[39], fullkey[168];
687
688 TRACE("(%p) %s, %i, %s, %p\n", this, debugstr_guid(&rclsid), langid, debugstr_guid(&guidProfile), pfEnable);
689
690 if (!pfEnable)
691 return E_INVALIDARG;
692
693 StringFromGUID2(rclsid, buf, _countof(buf));
695 StringCchPrintfW(fullkey, _countof(fullkey), L"%s\\%s\\%s\\0x%08x\\%s", szwSystemTIPKey,
696 buf, L"LanguageProfile", langid, buf2);
697
699 if (error == ERROR_SUCCESS)
700 {
701 DWORD count = sizeof(DWORD);
702 error = RegQueryValueExW(key, L"Enable", 0, NULL, (LPBYTE)pfEnable, &count);
704 }
705
706 if (error != ERROR_SUCCESS) /* Try Default */
707 {
709 if (error == ERROR_SUCCESS)
710 {
711 DWORD count = sizeof(DWORD);
712 error = RegQueryValueExW(key, L"Enable", 0, NULL, (LPBYTE)pfEnable, &count);
714 }
715 }
716
717 return (error == ERROR_SUCCESS) ? S_OK : E_FAIL;
718}
719
721 _In_ REFCLSID rclsid,
724 _In_ BOOL fEnable)
725{
726 HKEY key;
727 WCHAR buf[39], buf2[39], fullkey[168];
729
730 TRACE("(%p) %s %x %s %i\n", this, debugstr_guid(&rclsid), langid, debugstr_guid(&guidProfile), fEnable);
731
732 StringFromGUID2(rclsid, buf, _countof(buf));
734 StringCchPrintfW(fullkey, _countof(fullkey), L"%s\\%s\\%s\\0x%08x\\%s", szwSystemTIPKey,
735 buf, L"LanguageProfile", langid, buf2);
736
738 if (error != ERROR_SUCCESS)
739 return E_FAIL;
740
741 RegSetValueExW(key, L"Enable", 0, REG_DWORD, (PBYTE)&fEnable, sizeof(fEnable));
743 return S_OK;
744}
745
747 _In_ REFCLSID rclsid,
750 _In_ HKL hKL)
751{
752 FIXME("STUB:(%p)\n", this);
753 return E_NOTIMPL;
754}
755
757 _In_ DWORD dwProfileType,
761 _In_ HKL hkl,
763{
764 FIXME("(%p)->(%d %x %s %s %p %x)\n", this, dwProfileType, langid, debugstr_guid(&clsid),
766 return E_NOTIMPL;
767}
768
770 _In_ DWORD dwProfileType,
774 _In_ HKL hkl,
776{
777 FIXME("(%p)->(%d %x %s %s %p %x)\n", this, dwProfileType, langid, debugstr_guid(&clsid),
779 return E_NOTIMPL;
780}
781
783 _In_ DWORD dwProfileType,
787 _In_ HKL hkl,
789{
790 FIXME("(%p)->(%d %x %s %s %p %p)\n", this, dwProfileType, langid, debugstr_guid(&clsid),
791 debugstr_guid(&guidProfile), hkl, pProfile);
792 return E_NOTIMPL;
793}
794
798{
799 TRACE("(%p)->(%x %p)\n", this, langid, ppEnum);
800
802 if (!enum_profiles)
803 return E_OUTOFMEMORY;
804
805 *ppEnum = static_cast<IEnumTfInputProcessorProfiles *>(enum_profiles);
806 return S_OK;
807}
808
810 _In_ REFCLSID rclsid,
812{
813 FIXME("(%p)->(%s %x)\n", this, debugstr_guid(&rclsid), dwFlags);
814 return E_NOTIMPL;
815}
816
818 _In_ REFCLSID rclsid,
821 _In_ const WCHAR *pchDesc,
822 _In_ ULONG cchDesc,
823 _In_ const WCHAR *pchIconFile,
824 _In_ ULONG cchFile,
825 _In_ ULONG uIconIndex,
826 _In_ HKL hklsubstitute,
827 _In_ DWORD dwPreferredLayout,
828 _In_ BOOL bEnabledByDefault,
830{
831 FIXME("(%p)->(%s %x %s %s %d %s %u %u %p %x %x %x)\n", this, debugstr_guid(&rclsid), langid,
832 debugstr_guid(&guidProfile), debugstr_w(pchDesc), cchDesc, debugstr_w(pchIconFile),
833 cchFile, uIconIndex, hklsubstitute, dwPreferredLayout, bEnabledByDefault, dwFlags);
834 return E_NOTIMPL;
835}
836
838 _In_ REFCLSID rclsid,
842{
843 FIXME("(%p)->(%s %x %s %x)\n", this, debugstr_guid(&rclsid), langid,
845 return E_NOTIMPL;
846}
847
851{
852 FIXME("(%p)->(%s %p)\n", this, debugstr_guid(&catid), pProfile);
853 return E_NOTIMPL;
854}
855
858 _In_ IUnknown *punk,
859 _Out_ DWORD *pdwCookie)
860{
861 TRACE("(%p) %s %p %p\n", this, debugstr_guid(&riid), punk, pdwCookie);
862
863 if (cicIsNullPtr(&riid) || !punk || !pdwCookie)
864 return E_INVALIDARG;
865
866 if (riid == IID_ITfLanguageProfileNotifySink)
867 return advise_sink(&m_LanguageProfileNotifySink, IID_ITfLanguageProfileNotifySink,
868 COOKIE_MAGIC_IPPSINK, punk, pdwCookie);
869
870 FIXME("(%p) Unhandled Sink: %s\n", this, debugstr_guid(&riid));
871 return E_NOTIMPL;
872}
873
875{
876 TRACE("(%p) %x\n", this, dwCookie);
877
878 if (get_Cookie_magic(dwCookie) != COOKIE_MAGIC_IPPSINK)
879 return E_INVALIDARG;
880
881 return unadvise_sink(dwCookie);
882}
883
885{
886 if (pUnkOuter)
888
890 if (!This)
891 return E_OUTOFMEMORY;
892
893 *ppOut = This;
894 TRACE("returning %p\n", *ppOut);
895 return S_OK;
896}
897
899
901 : m_cRefs(1)
902 , m_key(NULL)
903 , m_next_index(0)
904{
905}
906
908{
909 TRACE("destroying %p\n", this);
911}
912
914{
915 *ppvObj = NULL;
916
917 if (iid == IID_IUnknown || iid == IID_IEnumGUID)
918 *ppvObj = static_cast<IEnumGUID *>(this);
919
920 if (*ppvObj)
921 {
922 AddRef();
923 return S_OK;
924 }
925
926 WARN("unsupported interface: %s\n", debugstr_guid(&iid));
927 return E_NOINTERFACE;
928}
929
931{
932 return ::InterlockedIncrement(&m_cRefs);
933}
934
936{
938 if (!ret)
939 delete this;
940 return ret;
941}
942
944 _In_ ULONG celt,
945 _Out_ GUID *rgelt,
946 _Out_ ULONG *pceltFetched)
947{
948 ULONG fetched = 0;
949
950 TRACE("(%p)\n", this);
951
952 if (!rgelt)
953 return E_POINTER;
954
955 if (m_key)
956 {
957 while (fetched < celt)
958 {
960 HRESULT hr;
961 WCHAR catid[39];
962 DWORD cName = _countof(catid);
963
966 break;
967
968 ++m_next_index;
969
970 hr = CLSIDFromString(catid, rgelt);
971 if (FAILED(hr))
972 continue;
973
974 ++fetched;
975 ++rgelt;
976 }
977 }
978
979 if (pceltFetched)
980 *pceltFetched = fetched;
981 return fetched == celt ? S_OK : S_FALSE;
982}
983
985{
986 TRACE("(%p)\n", this);
987 m_next_index += celt;
988 return S_OK;
989}
990
992{
993 TRACE("(%p)\n", this);
994 m_next_index = 0;
995 return S_OK;
996}
997
999{
1000 TRACE("(%p)\n", this);
1001
1002 if (!ppenum)
1003 return E_POINTER;
1004
1005 *ppenum = NULL;
1006
1007 CProfilesEnumGuid *pEnum;
1009 if (SUCCEEDED(hr))
1010 {
1011 pEnum->m_next_index = m_next_index;
1012 *ppenum = static_cast<IEnumGUID *>(pEnum);
1013 }
1014
1015 return hr;
1016}
1017
1019{
1021 if (!This)
1022 return E_OUTOFMEMORY;
1023
1025 KEY_READ | KEY_WRITE, NULL, &This->m_key, NULL) != ERROR_SUCCESS)
1026 {
1027 delete This;
1028 return E_FAIL;
1029 }
1030
1031 *ppOut = This;
1032 TRACE("returning %p\n", *ppOut);
1033 return S_OK;
1034}
1035
1037
1039 : m_cRefs(1)
1040 , m_langid(langid)
1041{
1042}
1043
1045{
1046 TRACE("destroying %p\n", this);
1048 if (m_langkey)
1050 m_catmgr->Release();
1051}
1052
1054{
1055 HRESULT hr;
1057 if (!This)
1058 return E_OUTOFMEMORY;
1059
1060 hr = CategoryMgr_Constructor(NULL, (IUnknown**)&This->m_catmgr);
1061 if (FAILED(hr))
1062 {
1063 delete This;
1064 return hr;
1065 }
1066
1068 KEY_READ | KEY_WRITE, NULL, &This->m_tipkey, NULL) != ERROR_SUCCESS)
1069 {
1070 delete This;
1071 return E_FAIL;
1072 }
1073
1074 *out = This;
1075 TRACE("returning %p\n", *out);
1076 return S_OK;
1077}
1078
1080{
1081 *ppvObj = NULL;
1082
1083 if (iid == IID_IUnknown || iid == IID_IEnumTfLanguageProfiles)
1084 *ppvObj = static_cast<IEnumTfLanguageProfiles *>(this);
1085
1086 if (*ppvObj)
1087 {
1088 AddRef();
1089 return S_OK;
1090 }
1091
1092 WARN("unsupported interface: %s\n", debugstr_guid(&iid));
1093 return E_NOINTERFACE;
1094}
1095
1097{
1098 return ::InterlockedIncrement(&m_cRefs);
1099}
1100
1102{
1104 if (!ret)
1105 delete this;
1106 return ret;
1107}
1108
1110{
1111 WCHAR fullkey[168], profileid[39];
1112 LSTATUS error;
1113 DWORD cName = _countof(profileid);
1114 GUID profile;
1115
1116 if (!m_langkey)
1117 {
1118 StringCchPrintfW(fullkey, _countof(fullkey), L"%s\\%s\\0x%08x", m_szwCurrentClsid,
1119 L"LanguageProfile", m_langid);
1121 if (error != ERROR_SUCCESS)
1122 {
1123 m_langkey = NULL;
1124 return -1;
1125 }
1126 m_lang_index = 0;
1127 }
1128
1129 error = RegEnumKeyExW(m_langkey, m_lang_index, profileid, &cName, NULL, NULL, NULL, NULL);
1131 {
1133 m_langkey = NULL;
1134 return -1;
1135 }
1136 ++m_lang_index;
1137
1138 if (tflp)
1139 {
1140 static const GUID * tipcats[3] = { &GUID_TFCAT_TIP_KEYBOARD,
1143 HRESULT hr = CLSIDFromString(profileid, &profile);
1144 if (FAILED(hr))
1145 return 0;
1146
1147 tflp->clsid = clsid;
1148 tflp->langid = m_langid;
1150 tflp->guidProfile = profile;
1151 if (m_catmgr->FindClosestCategory(clsid, &tflp->catid, tipcats, 3) != S_OK)
1153 }
1154
1155 return 1;
1156}
1157
1159 _In_ ULONG ulCount,
1160 _Out_ TF_LANGUAGEPROFILE *pProfile,
1161 _Out_ ULONG *pcFetch)
1162{
1163 ULONG fetched = 0;
1164
1165 TRACE("(%p)\n", this);
1166
1167 if (!pProfile)
1168 return E_POINTER;
1169
1170 if (m_tipkey)
1171 {
1172 while (fetched < ulCount)
1173 {
1174 LSTATUS error;
1175 HRESULT hr;
1177 CLSID clsid;
1178
1180 NULL, NULL);
1182 break;
1183
1184 ++m_tip_index;
1185
1187 if (FAILED(hr))
1188 continue;
1189
1190 while (fetched < ulCount)
1191 {
1192 INT res = next_LanguageProfile(clsid, pProfile);
1193 if (res == 1)
1194 {
1195 ++fetched;
1196 ++pProfile;
1197 }
1198 else if (res == -1)
1199 {
1200 break;
1201 }
1202 }
1203 }
1204 }
1205
1206 if (pcFetch)
1207 *pcFetch = fetched;
1208 return (fetched == ulCount) ? S_OK : S_FALSE;
1209}
1210
1212{
1213 FIXME("STUB (%p)\n", this);
1214 return E_NOTIMPL;
1215}
1216
1218{
1219 TRACE("(%p)\n", this);
1220 m_tip_index = 0;
1221 if (m_langkey)
1223 m_langkey = NULL;
1224 m_lang_index = 0;
1225 return S_OK;
1226}
1227
1229{
1230 TRACE("(%p)\n", this);
1231
1232 if (!ppEnum)
1233 return E_POINTER;
1234
1235 *ppEnum = NULL;
1236
1237 CEnumTfLanguageProfiles *new_This;
1239 if (FAILED(hr))
1240 return hr;
1241
1242 new_This->m_tip_index = m_tip_index;
1244
1245 if (m_langkey)
1246 {
1247 WCHAR fullkey[168];
1248 StringCchPrintfW(fullkey, _countof(fullkey), L"%s\\%s\\0x%08x", m_szwCurrentClsid, L"LanguageProfile", m_langid);
1249 RegOpenKeyExW(new_This->m_tipkey, fullkey, 0, KEY_READ | KEY_WRITE, &new_This->m_langkey);
1250 new_This->m_lang_index = m_lang_index;
1251 }
1252
1253 *ppEnum = static_cast<IEnumTfLanguageProfiles *>(new_This);
1254 return hr;
1255}
1256
1258
1260 : m_cRefs(1)
1261{
1262}
1263
1265{
1266}
1267
1269{
1270 if (!ppvObj)
1271 return E_POINTER;
1272
1273 *ppvObj = NULL;
1274 if (iid == IID_IUnknown || iid == IID_IEnumTfInputProcessorProfiles)
1275 *ppvObj = static_cast<IEnumTfInputProcessorProfiles *>(this);
1276
1277 if (*ppvObj)
1278 {
1279 AddRef();
1280 return S_OK;
1281 }
1282
1283 WARN("unsupported interface: %s\n", debugstr_guid(&iid));
1284 return E_NOINTERFACE;
1285}
1286
1288{
1289 return ::InterlockedIncrement(&m_cRefs);
1290}
1291
1293{
1295 if (!ret)
1296 delete this;
1297 return ret;
1298}
1299
1301{
1302 FIXME("(%p)->(%p)\n", this, ppEnum);
1303 return E_NOTIMPL;
1304}
1305
1307 _In_ ULONG ulCount,
1309 _Out_ ULONG *pcFetch)
1310{
1311 FIXME("(%p)->(%u %p %p)\n", this, ulCount, pProfile, pcFetch);
1312 if (pcFetch)
1313 *pcFetch = 0;
1314 return S_FALSE;
1315}
1316
1318{
1319 FIXME("(%p)\n", this);
1320 return E_NOTIMPL;
1321}
1322
1324{
1325 FIXME("(%p)->(%u)\n", this, ulCount);
1326 return E_NOTIMPL;
1327}
1328
1330
1333{
1335}
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define szwSystemCTFKey
Definition: precomp.h:106
#define szwSystemTIPKey
Definition: precomp.h:105
#define SINK_FOR_EACH(cursor, list, type, elem)
Definition: precomp.h:96
#define COOKIE_MAGIC_IPPSINK
Definition: precomp.h:36
static void list_init(struct list_entry *head)
Definition: list.h:51
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define EXTERN_C
Definition: basetyps.h:12
#define STDMETHODIMP
Definition: basetyps.h:43
#define STDMETHODIMP_(t)
Definition: basetyps.h:44
const GUID IID_IUnknown
#define RegCloseKey(hKey)
Definition: registry.h:49
EXTERN_C HRESULT CategoryMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
#define cicNoThrow
Definition: cicbase.h:46
static bool cicIsNullPtr(LPCVOID ptr)
Definition: cicbase.h:40
STDMETHODIMP Reset() override
STDMETHODIMP_(ULONG) AddRef() override
STDMETHODIMP Clone(_Out_ IEnumTfInputProcessorProfiles **ppEnum) override
STDMETHODIMP_(ULONG) Release() override
STDMETHODIMP QueryInterface(REFIID iid, LPVOID *ppvObj) override
STDMETHODIMP Skip(_In_ ULONG ulCount) override
STDMETHODIMP Next(_In_ ULONG ulCount, _Out_ TF_INPUTPROCESSORPROFILE *pProfile, _Out_ ULONG *pcFetch) override
INT next_LanguageProfile(CLSID clsid, TF_LANGUAGEPROFILE *tflp)
STDMETHODIMP QueryInterface(REFIID iid, LPVOID *ppvObj) override
STDMETHODIMP_(ULONG) Release() override
STDMETHODIMP Reset() override
STDMETHODIMP Clone(_Out_ IEnumTfLanguageProfiles **ppEnum) override
CEnumTfLanguageProfiles(LANGID langid)
ITfCategoryMgr * m_catmgr
STDMETHODIMP Skip(_In_ ULONG ulCount) override
static HRESULT CreateInstance(LANGID langid, CEnumTfLanguageProfiles **out)
STDMETHODIMP_(ULONG) AddRef() override
STDMETHODIMP Next(_In_ ULONG ulCount, _Out_ TF_LANGUAGEPROFILE *pProfile, _Out_ ULONG *pcFetch) override
STDMETHODIMP EnableLanguageProfile(_In_ REFCLSID rclsid, _In_ LANGID langid, _In_ REFGUID guidProfile, _In_ BOOL fEnable) override
STDMETHODIMP_(ULONG) Release() override
STDMETHODIMP ActivateProfile(_In_ DWORD dwProfileType, _In_ LANGID langid, _In_ REFCLSID clsid, _In_ REFGUID guidProfile, _In_ HKL hkl, _In_ DWORD dwFlags) override
STDMETHODIMP GetActiveLanguageProfile(_In_ REFCLSID rclsid, _Out_ LANGID *plangid, _Out_ GUID *pguidProfile) override
STDMETHODIMP GetLanguageProfileDescription(_In_ REFCLSID rclsid, _In_ LANGID langid, _In_ REFGUID guidProfile, _Out_ BSTR *pbstrProfile) override
STDMETHODIMP AddLanguageProfile(_In_ REFCLSID rclsid, _In_ LANGID langid, _In_ REFGUID guidProfile, _In_ const WCHAR *pchDesc, _In_ ULONG cchDesc, _In_ const WCHAR *pchIconFile, _In_ ULONG cchFile, _In_ ULONG uIconIndex) override
STDMETHODIMP Register(_In_ REFCLSID rclsid) override
STDMETHODIMP SubstituteKeyboardLayout(_In_ REFCLSID rclsid, _In_ LANGID langid, _In_ REFGUID guidProfile, _In_ HKL hKL) override
STDMETHODIMP GetActiveProfile(_In_ REFGUID catid, _Out_ TF_INPUTPROCESSORPROFILE *pProfile) override
STDMETHODIMP AdviseSink(_In_ REFIID riid, _In_ IUnknown *punk, _Out_ DWORD *pdwCookie) override
STDMETHODIMP QueryInterface(REFIID iid, LPVOID *ppvObj) override
STDMETHODIMP IsEnabledLanguageProfile(_In_ REFCLSID rclsid, _In_ LANGID langid, _In_ REFGUID guidProfile, _Out_ BOOL *pfEnable) override
STDMETHODIMP RegisterProfile(_In_ REFCLSID rclsid, _In_ LANGID langid, _In_ REFGUID guidProfile, _In_ const WCHAR *pchDesc, _In_ ULONG cchDesc, _In_ const WCHAR *pchIconFile, _In_ ULONG cchFile, _In_ ULONG uIconIndex, _In_ HKL hklsubstitute, _In_ DWORD dwPreferredLayout, _In_ BOOL bEnabledByDefault, _In_ DWORD dwFlags) override
STDMETHODIMP EnumInputProcessorInfo(_Out_ IEnumGUID **ppEnum) override
struct list m_LanguageProfileNotifySink
STDMETHODIMP UnadviseSink(_In_ DWORD dwCookie) override
STDMETHODIMP Unregister(_In_ REFCLSID rclsid) override
STDMETHODIMP ChangeCurrentLanguage(_In_ LANGID langid) override
STDMETHODIMP EnableLanguageProfileByDefault(_In_ REFCLSID rclsid, _In_ LANGID langid, _In_ REFGUID guidProfile, _In_ BOOL fEnable) override
static HRESULT CreateInstance(IUnknown *pUnkOuter, CInputProcessorProfiles **ppOut)
STDMETHODIMP EnumLanguageProfiles(_In_ LANGID langid, _Out_ IEnumTfLanguageProfiles **ppEnum) override
STDMETHODIMP_(ULONG) AddRef() override
STDMETHODIMP DeactivateProfile(_In_ DWORD dwProfileType, _In_ LANGID langid, _In_ REFCLSID clsid, _In_ REFGUID guidProfile, _In_ HKL hkl, _In_ DWORD dwFlags) override
STDMETHODIMP SetDefaultLanguageProfile(_In_ LANGID langid, _In_ REFCLSID rclsid, _In_ REFGUID guidProfiles) override
STDMETHODIMP ReleaseInputProcessor(_In_ REFCLSID rclsid, _In_ DWORD dwFlags) override
STDMETHODIMP GetCurrentLanguage(_Out_ LANGID *plangid) override
STDMETHODIMP GetLanguageList(_Out_ LANGID **ppLangId, _Out_ ULONG *pulCount) override
STDMETHODIMP EnumProfiles(_In_ LANGID langid, _Out_ IEnumTfInputProcessorProfiles **ppEnum) override
STDMETHODIMP RemoveLanguageProfile(_In_ REFCLSID rclsid, _In_ LANGID langid, _In_ REFGUID guidProfile) override
STDMETHODIMP ActivateLanguageProfile(_In_ REFCLSID rclsid, _In_ LANGID langid, _In_ REFGUID guidProfiles) override
STDMETHODIMP UnregisterProfile(_In_ REFCLSID rclsid, _In_ LANGID langid, _In_ REFGUID guidProfile, _In_ DWORD dwFlags) override
STDMETHODIMP GetProfile(_In_ DWORD dwProfileType, _In_ LANGID langid, _In_ REFCLSID clsid, _In_ REFGUID guidProfile, _In_ HKL hkl, _Out_ TF_INPUTPROCESSORPROFILE *pProfile) override
STDMETHODIMP GetDefaultLanguageProfile(_In_ LANGID langid, _In_ REFGUID catid, _Out_ CLSID *pclsid, _Out_ GUID *pguidProfile) override
STDMETHODIMP Clone(_Out_ IEnumGUID **ppenum) override
STDMETHODIMP_(ULONG) AddRef() override
STDMETHODIMP Next(_In_ ULONG celt, _Out_ GUID *rgelt, _Out_ ULONG *pceltFetched) override
STDMETHODIMP QueryInterface(REFIID iid, LPVOID *ppvObj) override
STDMETHODIMP Reset() override
STDMETHODIMP Skip(_In_ ULONG celt) override
virtual ~CProfilesEnumGuid()
static HRESULT CreateInstance(CProfilesEnumGuid **ppOut)
STDMETHODIMP_(ULONG) Release() override
Definition: list.h:37
LSTATUS WINAPI RegDeleteTreeW(_In_ HKEY, _In_opt_ LPCWSTR)
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define ERROR_SUCCESS
Definition: deptool.c:10
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2504
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
OLECHAR * BSTR
Definition: compat.h:2293
#define lstrcpynW
Definition: compat.h:738
LCID WINAPI GetUserDefaultLCID(void)
Definition: locale.c:1216
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
Definition: compobj.c:2338
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum GLenum GLsizei const GLuint GLboolean enabled
Definition: glext.h:7750
GLuint res
Definition: glext.h:9613
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLsizei GLenum GLboolean sink
Definition: glext.h:5672
const char cursor[]
Definition: icontest.c:13
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
REFIID riid
Definition: atlbase.h:39
static CInternetFolder * CreateInstance(void)
Definition: inetfolder.c:330
static void add_userkey(_In_ REFCLSID rclsid, _In_ LANGID langid, _In_ REFGUID guidProfile)
EXTERN_C HRESULT InputProcessorProfiles_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
HRESULT FindClosestCategory([in] REFGUID rguid, [out] GUID *pcatid, [in, size_is(ulCount)] const GUID **ppcatidList, [in] ULONG ulCount)
ULONG AddRef()
ULONG Release()
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
#define profile
Definition: kernel32.h:12
#define debugstr_wn
Definition: kernel32.h:33
#define debugstr_w
Definition: kernel32.h:32
#define GUID_NULL
Definition: ks.h:106
#define REG_SZ
Definition: layer.c:22
USHORT LANGID
Definition: mui.h:9
#define error(str)
Definition: mkdosfs.c:1605
LPCWSTR LPCWSTR LPCWSTR DWORD dwFlags
Definition: env.c:37
static IAdviseSinkEx AdviseSink
Definition: htmldoc.c:5184
EXTERN_C HRESULT advise_sink(struct list *sink_list, REFIID riid, DWORD cookie_magic, IUnknown *unk, DWORD *cookie)
Definition: msctf.cpp:259
EXTERN_C DWORD get_Cookie_magic(DWORD id)
Definition: msctf.cpp:203
EXTERN_C HRESULT unadvise_sink(DWORD cookie)
Definition: msctf.cpp:286
const CLSID * clsid
Definition: msctf.cpp:50
EXTERN_C void free_sinks(struct list *sink_list)
Definition: msctf.cpp:297
EXTERN_C HRESULT add_active_textservice(TF_LANGUAGEPROFILE *lp)
Definition: msctf.cpp:369
EXTERN_C BOOL get_active_textservice(REFCLSID rclsid, TF_LANGUAGEPROFILE *profile)
Definition: msctf.cpp:432
GUID guidProfile
Definition: msctf.idl:628
HKL hkl
Definition: msctf.idl:632
UINT_PTR HKL
Definition: msctf.idl:125
TF_INPUTPROCESSORPROFILE
Definition: msctf.idl:634
GUID catid
Definition: msctf.idl:629
EXTERN_C const GUID GUID_TFCAT_TIP_KEYBOARD
Definition: msctf.idl:81
EXTERN_C const GUID GUID_TFCAT_TIP_SPEECH
Definition: msctf.idl:82
EXTERN_C const GUID GUID_TFCAT_TIP_HANDWRITING
Definition: msctf.idl:83
LANGID langid
Definition: msctf.idl:626
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define KEY_READ
Definition: nt_native.h:1023
#define REG_CREATED_NEW_KEY
Definition: nt_native.h:1084
#define KEY_WRITE
Definition: nt_native.h:1031
#define DWORD
Definition: nt_native.h:44
BYTE * PBYTE
Definition: pedump.c:66
long LONG
Definition: pedump.c:60
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
#define REG_DWORD
Definition: sdbapi.c:598
int zero
Definition: sehframes.cpp:29
HRESULT hr
Definition: shlfolder.c:183
#define _countof(array)
Definition: sndvol32.h:70
SOCKET WSAAPI accept(IN SOCKET s, OUT LPSOCKADDR addr, OUT INT FAR *addrlen)
Definition: socklife.c:23
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
Definition: scsiwmi.h:51
Definition: copy.c:22
unsigned char * LPBYTE
Definition: typedefs.h:53
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:3771
#define E_POINTER
Definition: winerror.h:3480
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
__wchar_t WCHAR
Definition: xmlstorage.h:180