首先,您不能在 C 中将类型作为参数传递。剩下的唯一选择是宏。
这个方案只需稍加修改即可工作(参数为 void * 数组),前提是您正在执行LoadLibrary/GetProcAddress
调用 Win32 函数。否则,拥有函数名称字符串将毫无用处。在 C 中,调用函数的唯一方法是通过其名称(标识符),在大多数情况下,该名称会衰减为指向该函数的指针。您还必须负责转换返回值。
我最好的选择:
// define a function type to be passed on to the next macro
#define Declare(ret, cc, fn_t, ...) typedef ret (cc *fn_t)(__VA_ARGS__)
// for the time being doesn't work with UNICODE turned on
#define Call(dll, fn, fn_t, ...) do {\
HMODULE lib = LoadLibraryA(dll); \
if (lib) { \
fn_t pfn = (fn_t)GetProcAddress(lib, fn); \
if (pfn) { \
(pfn)(__VA_ARGS__); \
} \
FreeLibrary(lib); \
} \
} while(0)
int main() {
Declare(int, __stdcall, MessageBoxProc, HWND, LPCSTR, LPCSTR, UINT);
Call("user32.dll", "MessageBoxA", MessageBoxProc,
NULL, ((LPCSTR)"?"), ((LPCSTR)"Details"),
(MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2));
return 0;
}