You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.6 KiB
94 lines
3.6 KiB
/*++
|
|
|
|
Copyright (c) 2001, Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
delay.cpp
|
|
|
|
Abstract:
|
|
|
|
This file implements the delay load.
|
|
|
|
Author:
|
|
|
|
Revision History:
|
|
|
|
Notes:
|
|
|
|
--*/
|
|
|
|
#include "private.h"
|
|
#include "delay.h"
|
|
|
|
FARPROC GetFn(HINSTANCE *phInst, WCHAR *pchLib, char *pchFunc, BOOL fLoad)
|
|
{
|
|
if (*phInst == NULL)
|
|
{
|
|
if (fLoad)
|
|
*phInst = LoadSystemLibraryW(pchLib);
|
|
|
|
if (*phInst == NULL)
|
|
{
|
|
#ifdef DEBUG
|
|
if (fLoad)
|
|
{
|
|
Assert(0);
|
|
}
|
|
#endif
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
return GetProcAddress(*phInst, pchFunc);
|
|
}
|
|
|
|
#define DELAYLOAD(_hInst, _DllName, _CallConv, _FuncName, _Args1, _Args2, _RetType, _ErrVal, _fLoad) \
|
|
_RetType _CallConv _FuncName _Args1 \
|
|
{ \
|
|
static FARPROC pfn = NULL; \
|
|
\
|
|
if (pfn == NULL || _hInst == NULL) \
|
|
{ \
|
|
pfn = GetFn(&_hInst, L#_DllName, #_FuncName, _fLoad); \
|
|
\
|
|
if (pfn == NULL) \
|
|
{ \
|
|
if (_fLoad) \
|
|
{ \
|
|
Assert(0); \
|
|
} \
|
|
return (_RetType) _ErrVal; \
|
|
} \
|
|
} \
|
|
\
|
|
return ((_RetType (_CallConv *)_Args1) (pfn)) _Args2; \
|
|
}
|
|
|
|
|
|
HINSTANCE g_hOle32 = NULL;
|
|
|
|
HRESULT Internal_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv)
|
|
{
|
|
static FARPROC pfn = NULL;
|
|
if (pfn == NULL || g_hOle32 == NULL) {
|
|
pfn = GetFn(&g_hOle32, L"ole32.dll", "CoCreateInstance", TRUE);
|
|
if (pfn == NULL) {
|
|
Assert(0);
|
|
return E_FAIL;
|
|
}
|
|
}
|
|
return ((HRESULT (WINAPI *)(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv))(pfn))(rclsid, pUnkOuter, dwClsContext, riid, ppv);
|
|
}
|
|
|
|
HINSTANCE g_hMsimtf = NULL;
|
|
DELAYLOAD(g_hMsimtf, Msimtf.dll, WINAPI, MsimtfIsWindowFiltered, (HWND hwnd), (hwnd), BOOL, FALSE, TRUE)
|
|
DELAYLOAD(g_hMsimtf, Msimtf.dll, WINAPI, MsimtfIsGuidMapEnable, (HIMC himc,BOOL *pbGuidMap), (himc, pbGuidMap), BOOL, FALSE, TRUE)
|
|
|
|
|
|
HINSTANCE g_hMsctf = NULL;
|
|
DELAYLOAD(g_hMsctf, Msctf.dll, WINAPI, TF_CreateThreadMgr, (ITfThreadMgr **pptim), (pptim), HRESULT, E_FAIL, TRUE)
|
|
DELAYLOAD(g_hMsctf, Msctf.dll, WINAPI, TF_GetThreadMgr, (ITfThreadMgr **pptim), (pptim), HRESULT, E_FAIL, TRUE)
|
|
DELAYLOAD(g_hMsctf, Msctf.dll, WINAPI, TF_CreateInputProcessorProfiles, (ITfInputProcessorProfiles **ppipp), (ppipp), HRESULT, E_FAIL, TRUE)
|
|
DELAYLOAD(g_hMsctf, Msctf.dll, WINAPI, TF_DllDetachInOther, (void), (), BOOL, FALSE, FALSE)
|
|
|