Code:
CreateInterfaceFn* findValidInterface(CreateInterfaceFn fac,const char * inter,unsigned int offset) {
if (fac==NULL || inter==NULL || offset ==0) return NULL;
CreateInterfaceFn *temp;
temp = (CreateInterfaceFn*)fac(inter,NULL);
if (!temp) {
int sLenName=strlen(inter);
char intName[256], newVer[256];
memcpy(intName,inter,(sLenName>256?256:sLenName));
unsigned int cVersion;
cVersion = intName[sLenName-1]+(intName[sLenName-2]*10)+(intName[sLenName-3]*100);
cVersion = atoi(&intName[sLenName-3]);
intName[sLenName-3] = 0;
for (cVersion=cVersion+offset;(cVersion>cVersion-offset && cVersion>0);cVersion--) {
_snprintf(newVer,256,"%s%03d",intName,cVersion);
temp = (CreateInterfaceFn *)fac(newVer,NULL);
if (temp) break;
}
}
return temp;
}
You use this as so.
To replace
Code:
m_ServerDll = (IServerGameDLL *)((ismm->serverFactory())(INTERFACEVERSION_SERVERGAMEDLL, NULL));
You would use
Code:
m_ServerDll = (IServerGameDLL *)findValidInterface(ismm->serverFactory(),INTERFACEVERSION_SERVERGAMEDLL,2);
In that way, as long as the interface available is either 2 above or below the one it was compiled against, you will get a valid interface pointer. It's still possible to get null's, if for example the interface was totally removed.
__________________