4

我想使用Runtime.loadLibrary和加载 Win32 API 函数GetProcAddress(...)。使用mixin

template GetProcA(alias func, alias name_in_DLL)
{
    const char[] GetProcA = func ~ ` = cast(typeof(`~func~`)) GetProcAddress(hModule,"`~name_in_DLL~`");`;
}
...
static extern (Windows) Object function (HWND hWnd, int nIndex) GetWindowLong;
static extern (Windows) Object function (HWND hWnd, int nIndex, Object dwNewLong) SetWindowLong;

我可以通过这种方式实例化它(在类构造函数中):

mixin GetProcA!("SetWindowLong", "SetWindowLongA");

但如果再次将其用于另一个功能:

mixin GetProcA!("GetWindowLong", "GetWindowLongA");

编译器抱怨:

mixin GetProcA!("GetWindowLong","GetWindowLongA") GetProcA isn't a template...

我不明白这一点:如果创建了第一个实例GetProcA并且我不能再次使用它,那么它在这里对我有什么帮助?

4

2 回答 2

6

从您的代码来看,您需要一个mixin 表达式,而不是模板 mixin

string GetProcA(string func, string name_in_dll)
{
   return func ~ ` = cast(typeof(` ~ func ~ `)) ` ~
                       `GetProcAddress(hModule,"` ~ name_in_dll ~ `");`;
}

mixin(GetProcA("SetWindowLong", "SetWindowLongA"));
mixin(GetProcA("GetWindowLong", "GetWindowLongA"));

实际上,您甚至不需要 mixin。一个内部模板函数就足够了:

hModule = ...;

void GetProcA(T)(ref T func, string name_in_all)
{
    func = cast(typeof(func)) GetProcAddress(hModule, toStringz(name_in_all));
}

GetProcA(SetWindowLong, "SetWindowLongA");
GetProcA(GetWindowLong, "GetWindowLongA");
于 2012-01-10T15:29:32.560 回答
3

我认为KennyTM是正确的。但是为了完整起见,如果您命名它们,您可以多次使用相同的模板mixin。在此处搜索“MixinIdentifier”

于 2012-01-10T15:40:12.217 回答