Browse Source

*** empty log message ***

Josh Yelon 18 years ago
parent
commit
f718170091
1 changed files with 124 additions and 0 deletions
  1. 124 0
      pandatool/src/mayaprogs/mayaWrapper.cxx

+ 124 - 0
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 <windows.h>
+#include <winuser.h>
+#include <stdlib.h>
+#include <process.h>
+#include <malloc.h>
+#include <stdio.h>
+#include <signal.h>
+#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);
+  }
+}
+