00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <stdlib.h>
00021 #include <string.h>
00022 #include <stdio.h>
00023 #include <windows.h>
00024 #include <process.h>
00025 #include <assert.h>
00026
00027 #define BUFFER_SIZE 1024
00028
00029 int main (int argc, char* argv[]) {
00030 int i;
00031 char buffer [BUFFER_SIZE];
00032 char* p3dfile;
00033 char* runtime = NULL;
00034 DWORD size;
00035 STARTUPINFO si;
00036 PROCESS_INFORMATION pi;
00037 char *cmd;
00038 char *newcmd;
00039 HKEY hKey = 0;
00040 char buf [1024] = {0};
00041 DWORD dwType = 0;
00042 DWORD dwBufSize = sizeof(buf);
00043 size = GetModuleFileName (NULL, buffer, BUFFER_SIZE);
00044 assert (size > 0);
00045
00046
00047 p3dfile = (char*) malloc (size + 1);
00048 memcpy (p3dfile, buffer, size);
00049 p3dfile [size] = 0;
00050 memcpy (p3dfile + size - 3, "p3d", 3);
00051
00052
00053 if (RegOpenKey (HKEY_CLASSES_ROOT, "Panda3D applet\\DefaultIcon", &hKey) == ERROR_SUCCESS) {
00054 dwType = REG_SZ;
00055 if (RegQueryValueEx(hKey, 0, 0, &dwType, (BYTE*) buf, &dwBufSize) == ERROR_SUCCESS) {
00056 for (i = dwBufSize - 1; i >= 0; --i) {
00057 if (buf [i] == '/' || buf [i] == '\\') {
00058 runtime = (char*) malloc (i + 13);
00059 memcpy (runtime, buf, i);
00060 runtime [i] = 0;
00061 strcat (runtime, "\\panda3d.exe");
00062 break;
00063 }
00064 }
00065 } else {
00066 fprintf (stderr, "Failed to read registry key. Try reinstalling the Panda3D Runtime.\n");
00067 return 1;
00068 }
00069 RegCloseKey(hKey);
00070 } else {
00071 fprintf (stderr, "The Panda3D Runtime does not appear to be installed!\n");
00072 return 1;
00073 }
00074
00075 if (runtime == NULL) {
00076 fprintf (stderr, "Failed to find panda3d.exe in registry. Try reinstalling the Panda3D Runtime.\n");
00077 return 1;
00078 }
00079
00080
00081 cmd = GetCommandLine();
00082 newcmd = (char*) malloc (strlen(runtime) + strlen(p3dfile) + strlen (cmd) - strlen (argv[0]) + 7);
00083 sprintf (newcmd, "\"%s\" \"%s\" %s", runtime, p3dfile, cmd + strlen (argv[0]));
00084 memset(&si, 0, sizeof(si));
00085 si.cb = sizeof(STARTUPINFO);
00086 if (CreateProcess(runtime, newcmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
00087 WaitForSingleObject(pi.hProcess, INFINITE);
00088 }
00089 free (newcmd);
00090 return 0;
00091 }
00092