diff --git a/pandatool/src/mayaprogs/mayaWrapper.cxx b/pandatool/src/mayaprogs/mayaWrapper.cxx new file mode 100644 index 0000000000..506e21768c --- /dev/null +++ b/pandatool/src/mayaprogs/mayaWrapper.cxx @@ -0,0 +1,124 @@ +/////////////////////////////////////////////////////////////////////// +// +// Under windows, when multiple versions of maya are installed, +// maya2egg can accidentally use the wrong version of OpenMaya.dll. +// This small wrapper program alters your PATH and MAYA_LOCATION +// environment variables in order to ensure that maya2egg finds the +// right DLLs. +// +// To use this wrapper, maya2egg.exe must be renamed to +// maya2egg-wrapped.exe. Then, this wrapper program must be +// installed as maya2egg.exe +// +/////////////////////////////////////////////////////////////////////// + + +#ifndef MAYAVERSION +#error You must define the symbol MAYAVERSION when compiling mayawrapper. +#endif + +#define _CRT_SECURE_NO_DEPRECATE 1 + +#include +#include +#include +#include +#include +#include +#include +#define PATH_MAX 1024 + +void getMayaLocation(int major, int minor, char *loc) +{ + char key[1024]; HKEY hkey; + DWORD size, dtype; LONG res; int retry; + loc[0] = 0; + + for (retry=0; retry<3; retry++) { + char *developer; + switch(retry) { + case 0: developer = "Alias|Wavefront"; break; + case 1: developer = "Alias"; break; + case 2: developer = "Autodesk"; break; + } + + sprintf(key, "SOFTWARE\\%s\\Maya\\%d.%d\\Setup\\InstallPath", developer, major, minor); + + res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, KEY_READ, &hkey); + if (res == ERROR_SUCCESS) { + size=1024; + res = RegQueryValueEx(hkey, "MAYA_INSTALL_LOCATION", NULL, &dtype, (LPBYTE)loc, &size); + if ((res == ERROR_SUCCESS)&&(dtype == REG_SZ)) { + loc[size] = 0; + break; + } else { + loc[0] = 0; + } + RegCloseKey(hkey); + } + } +} + +void getWrapperName(char *prog) +{ + DWORD res; + res = GetModuleFileName(NULL, prog, 1000); + if (res == 0) { + prog[0] = 0; + return; + } + int len = strlen(prog); + if (_stricmp(prog+len-4, ".exe")) { + prog[0] = 0; + return; + } + prog[len-4] = 0; +} + +int main(int argc, char **argv) +{ + int major = MAYAVERSION / 10; + int minor = MAYAVERSION - major * 10; + char loc[1024], prog[1024]; + char *cmd, *path, *env1, *env2; int len; + STARTUPINFO si; PROCESS_INFORMATION pi; + + if (major == 0) { + major = minor; + minor = 0; + } + + getMayaLocation(major, minor, loc); + if (loc[0]==0) { + printf("Cannot locate Maya %d.%d (registry key missing)\n", major, minor); + exit(1); + } + + getWrapperName(prog); + if (prog[0]==0) { + printf("mayaWrapper cannot determine its own filename (bug)\n"); + exit(1); + } + strcat(prog, "-wrapped.exe"); + + path = getenv("PATH"); + if (path == 0) path = ""; + env1 = (char*)malloc(100 + strlen(loc) + strlen(path)); + sprintf(env1, "PATH=%s\\bin;%s", loc, path); + env2 = (char*)malloc(100 + strlen(loc)); + sprintf(env2, "MAYA_LOCATION=%s", loc); + _putenv(env1); + _putenv(env2); + + cmd = GetCommandLine(); + memset(&si, 0, sizeof(si)); + si.cb = sizeof(STARTUPINFO); + if (CreateProcess(prog, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { + WaitForSingleObject(pi.hProcess, INFINITE); + exit(0); + } else { + printf("Could not launch %s\n", prog); + exit(1); + } +} +