#ifndef SoftLinking_h
#define SoftLinking_h
#include <windows.h>
#include <wtf/Assertions.h>
#define SOFT_LINK_LIBRARY_HELPER(lib, suffix) \
static HMODULE lib##Library() \
{ \
static HMODULE library = LoadLibraryW(L###lib suffix); \
return library; \
}
#if OS(WINCE)
#define SOFT_LINK_GETPROCADDRESS GetProcAddressA
#else
#define SOFT_LINK_GETPROCADDRESS GetProcAddress
#endif
#define SOFT_LINK_LIBRARY(lib) SOFT_LINK_LIBRARY_HELPER(lib, L".dll")
#define SOFT_LINK_DEBUG_LIBRARY(lib) SOFT_LINK_LIBRARY_HELPER(lib, L"_debug.dll")
#define SOFT_LINK(library, functionName, resultType, callingConvention, parameterDeclarations, parameterNames) \
static resultType callingConvention init##functionName parameterDeclarations; \
static resultType (callingConvention*softLink##functionName) parameterDeclarations = init##functionName; \
\
static resultType callingConvention init##functionName parameterDeclarations \
{ \
softLink##functionName = reinterpret_cast<resultType (callingConvention*) parameterDeclarations>(SOFT_LINK_GETPROCADDRESS(library##Library(), #functionName)); \
ASSERT(softLink##functionName); \
return softLink##functionName parameterNames; \
}\
\
inline resultType functionName parameterDeclarations \
{\
return softLink##functionName parameterNames; \
}
#define SOFT_LINK_OPTIONAL(library, functionName, resultType, callingConvention, parameterDeclarations) \
typedef resultType (callingConvention *functionName##PtrType) parameterDeclarations; \
static functionName##PtrType functionName##Ptr() \
{ \
static functionName##PtrType ptr; \
static bool initialized; \
\
if (initialized) \
return ptr; \
initialized = true; \
\
ptr = reinterpret_cast<functionName##PtrType>(SOFT_LINK_GETPROCADDRESS(library##Library(), #functionName)); \
return ptr; \
}\
#define SOFT_LINK_LOADED_LIBRARY(library, functionName, resultType, callingConvention, parameterDeclarations) \
typedef resultType (callingConvention *functionName##PtrType) parameterDeclarations; \
static functionName##PtrType functionName##Ptr() \
{ \
static functionName##PtrType ptr; \
static bool initialized; \
\
if (initialized) \
return ptr; \
initialized = true; \
\
static HINSTANCE libraryInstance = ::GetModuleHandle(L#library); \
\
ptr = reinterpret_cast<functionName##PtrType>(SOFT_LINK_GETPROCADDRESS(libraryInstance, #functionName)); \
return ptr; \
}\
#define SOFT_LINK_DLL_IMPORT(library, functionName, resultType, callingConvention, parameterDeclarations, parameterNames) \
static resultType callingConvention init##functionName parameterDeclarations; \
static resultType(callingConvention*softLink##functionName) parameterDeclarations = init##functionName; \
\
static resultType callingConvention init##functionName parameterDeclarations \
{ \
softLink##functionName = reinterpret_cast<resultType (callingConvention*)parameterDeclarations>(SOFT_LINK_GETPROCADDRESS(library##Library(), #functionName)); \
ASSERT(softLink##functionName); \
return softLink##functionName parameterNames; \
}\
\
inline resultType softLink_##functionName parameterDeclarations \
{\
return softLink##functionName parameterNames; \
}
#define SOFT_LINK_DLL_IMPORT_OPTIONAL(library, functionName, resultType, callingConvention, parameterDeclarations) \
typedef resultType (callingConvention *functionName##PtrType) parameterDeclarations; \
static functionName##PtrType functionName##Ptr() \
{ \
static functionName##PtrType ptr; \
static bool initialized; \
\
if (initialized) \
return ptr; \
initialized = true; \
\
ptr = reinterpret_cast<resultType(callingConvention*)parameterDeclarations>(SOFT_LINK_GETPROCADDRESS(library##Library(), #functionName)); \
return ptr; \
}\
#define SOFT_LINK_DLL_IMPORT_OPTIONAL(library, functionName, resultType, callingConvention, parameterDeclarations) \
typedef resultType (callingConvention *functionName##PtrType) parameterDeclarations; \
static functionName##PtrType functionName##Ptr() \
{ \
static functionName##PtrType ptr; \
static bool initialized; \
\
if (initialized) \
return ptr; \
initialized = true; \
\
ptr = reinterpret_cast<resultType(callingConvention*)parameterDeclarations>(SOFT_LINK_GETPROCADDRESS(library##Library(), #functionName)); \
return ptr; \
}\
#define SOFT_LINK_VARIABLE_DLL_IMPORT(library, variableName, variableType) \
static variableType get_##variableName() \
{ \
static variableType* ptr = reinterpret_cast<variableType*>(SOFT_LINK_GETPROCADDRESS(library##Library(), #variableName)); \
ASSERT(ptr); \
return *ptr; \
}\
#define SOFT_LINK_VARIABLE_DLL_IMPORT_OPTIONAL(library, variableName, variableType) \
static variableType get_##variableName() \
{ \
static variableType* ptr = reinterpret_cast<variableType*>(SOFT_LINK_GETPROCADDRESS(library##Library(), #variableName)); \
if (!ptr) \
return 0; \
return *ptr; \
}\
#endif // SoftLinking_h