| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (C) 2007 Apple Inc. All rights reserved. | |
| 3 * | |
| 4 * Redistribution and use in source and binary forms, with or without | |
| 5 * modification, are permitted provided that the following conditions | |
| 6 * are met: | |
| 7 * | |
| 8 * 1. Redistributions of source code must retain the above copyright | |
| 9 * notice, this list of conditions and the following disclaimer. | |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | |
| 11 * notice, this list of conditions and the following disclaimer in the | |
| 12 * documentation and/or other materials provided with the distribution. | |
| 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of | |
| 14 * its contributors may be used to endorse or promote products derived | |
| 15 * from this software without specific prior written permission. | |
| 16 * | |
| 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY | |
| 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
| 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
| 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY | |
| 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
| 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
| 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |
| 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |
| 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 27 */ | |
| 28 | |
| 29 #ifndef SoftLinking_h | |
| 30 #define SoftLinking_h | |
| 31 | |
| 32 #include <windows.h> | |
| 33 #include <wtf/Assertions.h> | |
| 34 | |
| 35 #define SOFT_LINK_LIBRARY_HELPER(lib, suffix) \ | |
| 36 static HMODULE lib##Library() \ | |
| 37 { \ | |
| 38 static HMODULE library = LoadLibraryW(L###lib suffix); \ | |
| 39 return library; \ | |
| 40 } | |
| 41 | |
| 42 #if OS(WINCE) | |
| 43 #define SOFT_LINK_GETPROCADDRESS GetProcAddressA | |
| 44 #else | |
| 45 #define SOFT_LINK_GETPROCADDRESS GetProcAddress | |
| 46 #endif | |
| 47 | |
| 48 #define SOFT_LINK_LIBRARY(lib) SOFT_LINK_LIBRARY_HELPER(lib, L".dll") | |
| 49 #define SOFT_LINK_DEBUG_LIBRARY(lib) SOFT_LINK_LIBRARY_HELPER(lib, L"_debug.dll"
) | |
| 50 | |
| 51 #define SOFT_LINK(library, functionName, resultType, callingConvention, paramete
rDeclarations, parameterNames) \ | |
| 52 static resultType callingConvention init##functionName parameterDeclarations
; \ | |
| 53 static resultType (callingConvention*softLink##functionName) parameterDeclar
ations = init##functionName; \ | |
| 54 \ | |
| 55 static resultType callingConvention init##functionName parameterDeclarations
\ | |
| 56 { \ | |
| 57 softLink##functionName = reinterpret_cast<resultType (callingConvention*
) parameterDeclarations>(SOFT_LINK_GETPROCADDRESS(library##Library(), #functionN
ame)); \ | |
| 58 ASSERT(softLink##functionName); \ | |
| 59 return softLink##functionName parameterNames; \ | |
| 60 }\ | |
| 61 \ | |
| 62 inline resultType functionName parameterDeclarations \ | |
| 63 {\ | |
| 64 return softLink##functionName parameterNames; \ | |
| 65 } | |
| 66 | |
| 67 #define SOFT_LINK_OPTIONAL(library, functionName, resultType, callingConvention,
parameterDeclarations) \ | |
| 68 typedef resultType (callingConvention *functionName##PtrType) parameterDecla
rations; \ | |
| 69 static functionName##PtrType functionName##Ptr() \ | |
| 70 { \ | |
| 71 static functionName##PtrType ptr; \ | |
| 72 static bool initialized; \ | |
| 73 \ | |
| 74 if (initialized) \ | |
| 75 return ptr; \ | |
| 76 initialized = true; \ | |
| 77 \ | |
| 78 ptr = reinterpret_cast<functionName##PtrType>(SOFT_LINK_GETPROCADDRESS(l
ibrary##Library(), #functionName)); \ | |
| 79 return ptr; \ | |
| 80 }\ | |
| 81 | |
| 82 #define SOFT_LINK_LOADED_LIBRARY(library, functionName, resultType, callingConve
ntion, parameterDeclarations) \ | |
| 83 typedef resultType (callingConvention *functionName##PtrType) parameterDecla
rations; \ | |
| 84 static functionName##PtrType functionName##Ptr() \ | |
| 85 { \ | |
| 86 static functionName##PtrType ptr; \ | |
| 87 static bool initialized; \ | |
| 88 \ | |
| 89 if (initialized) \ | |
| 90 return ptr; \ | |
| 91 initialized = true; \ | |
| 92 \ | |
| 93 static HINSTANCE libraryInstance = ::GetModuleHandle(L#library); \ | |
| 94 \ | |
| 95 ptr = reinterpret_cast<functionName##PtrType>(SOFT_LINK_GETPROCADDRESS(l
ibraryInstance, #functionName)); \ | |
| 96 return ptr; \ | |
| 97 }\ | |
| 98 | |
| 99 /* | |
| 100 In order to soft link against functions decorated with __declspec(dllimport)
, we prepend "softLink_" to the function names. | |
| 101 If you use SOFT_LINK_DLL_IMPORT(), you will also need to #define the functio
n name to account for this, e.g.: | |
| 102 | |
| 103 SOFT_LINK_DLL_IMPORT(myLibrary, myFunction, ...) | |
| 104 #define myFunction softLink_myFunction | |
| 105 */ | |
| 106 #define SOFT_LINK_DLL_IMPORT(library, functionName, resultType, callingConventio
n, parameterDeclarations, parameterNames) \ | |
| 107 static resultType callingConvention init##functionName parameterDeclarations
; \ | |
| 108 static resultType(callingConvention*softLink##functionName) parameterDeclara
tions = init##functionName; \ | |
| 109 \ | |
| 110 static resultType callingConvention init##functionName parameterDeclarations
\ | |
| 111 { \ | |
| 112 softLink##functionName = reinterpret_cast<resultType (callingConvention*
)parameterDeclarations>(SOFT_LINK_GETPROCADDRESS(library##Library(), #functionNa
me)); \ | |
| 113 ASSERT(softLink##functionName); \ | |
| 114 return softLink##functionName parameterNames; \ | |
| 115 }\ | |
| 116 \ | |
| 117 inline resultType softLink_##functionName parameterDeclarations \ | |
| 118 {\ | |
| 119 return softLink##functionName parameterNames; \ | |
| 120 } | |
| 121 | |
| 122 #define SOFT_LINK_DLL_IMPORT_OPTIONAL(library, functionName, resultType, calling
Convention, parameterDeclarations) \ | |
| 123 typedef resultType (callingConvention *functionName##PtrType) parameterDecla
rations; \ | |
| 124 static functionName##PtrType functionName##Ptr() \ | |
| 125 { \ | |
| 126 static functionName##PtrType ptr; \ | |
| 127 static bool initialized; \ | |
| 128 \ | |
| 129 if (initialized) \ | |
| 130 return ptr; \ | |
| 131 initialized = true; \ | |
| 132 \ | |
| 133 ptr = reinterpret_cast<resultType(callingConvention*)parameterDeclaratio
ns>(SOFT_LINK_GETPROCADDRESS(library##Library(), #functionName)); \ | |
| 134 return ptr; \ | |
| 135 }\ | |
| 136 | |
| 137 #define SOFT_LINK_DLL_IMPORT_OPTIONAL(library, functionName, resultType, calling
Convention, parameterDeclarations) \ | |
| 138 typedef resultType (callingConvention *functionName##PtrType) parameterDecla
rations; \ | |
| 139 static functionName##PtrType functionName##Ptr() \ | |
| 140 { \ | |
| 141 static functionName##PtrType ptr; \ | |
| 142 static bool initialized; \ | |
| 143 \ | |
| 144 if (initialized) \ | |
| 145 return ptr; \ | |
| 146 initialized = true; \ | |
| 147 \ | |
| 148 ptr = reinterpret_cast<resultType(callingConvention*)parameterDeclaratio
ns>(SOFT_LINK_GETPROCADDRESS(library##Library(), #functionName)); \ | |
| 149 return ptr; \ | |
| 150 }\ | |
| 151 | |
| 152 /* | |
| 153 Variables exported by a DLL need to be accessed through a function. | |
| 154 If you use SOFT_LINK_VARIABLE_DLL_IMPORT(), you will also need to #define th
e variable name to account for this, e.g.: | |
| 155 | |
| 156 SOFT_LINK_VARIABLE_DLL_IMPORT(myLibrary, myVar, int) | |
| 157 #define myVar get_myVar() | |
| 158 */ | |
| 159 #define SOFT_LINK_VARIABLE_DLL_IMPORT(library, variableName, variableType) \ | |
| 160 static variableType get_##variableName() \ | |
| 161 { \ | |
| 162 static variableType* ptr = reinterpret_cast<variableType*>(SOFT_LINK_GET
PROCADDRESS(library##Library(), #variableName)); \ | |
| 163 ASSERT(ptr); \ | |
| 164 return *ptr; \ | |
| 165 }\ | |
| 166 | |
| 167 /* | |
| 168 Note that this will only work for variable types for which a return value of
0 can signal an error. | |
| 169 */ | |
| 170 #define SOFT_LINK_VARIABLE_DLL_IMPORT_OPTIONAL(library, variableName, variableTy
pe) \ | |
| 171 static variableType get_##variableName() \ | |
| 172 { \ | |
| 173 static variableType* ptr = reinterpret_cast<variableType*>(SOFT_LINK_GET
PROCADDRESS(library##Library(), #variableName)); \ | |
| 174 if (!ptr) \ | |
| 175 return 0; \ | |
| 176 return *ptr; \ | |
| 177 }\ | |
| 178 | |
| 179 #endif // SoftLinking_h | |
| OLD | NEW |