Off the top of my head, I'm not sure. If the reason it can't infer the template parameters is because the function is an overload, you could try casting the MFP and do something like this:
Code:
SH_CALL(servertools, static_cast<bool (IServerTools::*)(void *, const char *, const char *)>(&IServerTools::SetKeyValue))(p1, p2, p3)