Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module dk.tcl;
- struct TclProcs
- {
- __gshared extern(C):
- void function(const char* argv0) Tcl_FindExecutable;
- const(char*) function() Tcl_GetNameOfExecutable;
- int function(Tcl_Interp* interp, char* str) Tcl_Eval;
- Tcl_Interp* function() Tcl_CreateInterp;
- char* function(Tcl_Obj * objPtr, int* lengthPtr) Tcl_GetStringFromObj;
- char* function(const Tcl_Obj * objPtr) Tcl_GetString;
- void function(Tcl_Interp* interp, char* str, Tcl_FreeProc* freeProc) Tcl_SetResult;
- Tcl_Command function(Tcl_Interp* interp, char* cmdName,
- Tcl_ObjCmdProc proc, ClientData clientData,
- Tcl_CmdDeleteProc deleteProc) Tcl_CreateObjCommand;
- int function(Tcl_Interp* interp) Tcl_Init;
- void function(Tcl_Interp* interp) Tcl_DeleteInterp;
- }
- struct TkProcs
- {
- __gshared extern(C):
- int function(Tcl_Interp* interp) Tk_Init;
- Tk_Window function(Tcl_Interp* interp) Tk_MainWindow;
- void function() Tk_MainLoop;
- }
- string getAliasesAsString(T, string TString)()
- {
- string result;
- foreach (string member; __traits(allMembers, T))
- {
- result ~= "alias " ~ TString ~ "." ~ member ~ " " ~ member ~ ";\n";
- }
- return result;
- }
- // mixin to local scope
- mixin(getAliasesAsString!(TkProcs, "TkProcs"));
- mixin(getAliasesAsString!(TclProcs, "TclProcs"));
- version (Windows)
- {
- // Safe symbol loader. Pass a DLL handle, the exported function name,
- // and a static field at CT. The function will throw if the symbol name is not found.
- private void loadSymbol(alias field)(HANDLE handle, string symbol)
- {
- field = cast(typeof(field))enforce(GetProcAddress(handle, symbol.toStringz),
- format("%s failed to load.", symbol));
- }
- shared static this()
- {
- HMODULE hTcl = enforce(LoadLibraryA("tcl85.dll"));
- foreach (string member; __traits(allMembers, TclProcs))
- {
- mixin("loadSymbol!(" ~ "TclProcs." ~ member ~ ")(hTcl, member);");
- }
- HMODULE hTk = enforce(LoadLibraryA("tk85.dll"));
- foreach (string member; __traits(allMembers, TkProcs))
- {
- mixin("loadSymbol!(" ~ "TkProcs." ~ member ~ ")(hTk, member);");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement