Kaydet (Commit) 271f9776 authored tarafından Guido van Rossum's avatar Guido van Rossum

Seem to be some changes related to DLL version from string resource,

again (Mark Hammond is the cause of all this).
üst ec680929
...@@ -155,6 +155,9 @@ search_for_prefix(argv0_path, landmark) ...@@ -155,6 +155,9 @@ search_for_prefix(argv0_path, landmark)
} }
#ifdef MS_WIN32 #ifdef MS_WIN32
#include "malloc.h" // for alloca - see comments below!
extern const char *PyWin_DLLVersionString; // a string loaded from the DLL at startup.
/* Load a PYTHONPATH value from the registry. /* Load a PYTHONPATH value from the registry.
Load from either HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER. Load from either HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER.
...@@ -172,9 +175,23 @@ getpythonregpath(HKEY keyBase, BOOL bWin32s) ...@@ -172,9 +175,23 @@ getpythonregpath(HKEY keyBase, BOOL bWin32s)
LONG rc; LONG rc;
char *retval = NULL; char *retval = NULL;
char *dataBuf; char *dataBuf;
const char keyPrefix[] = "Software\\Python\\PythonCore\\";
const char keySuffix[] = "\\PythonPath";
int versionLen;
char *keyBuf;
// Tried to use sysget("winver") but here is too early :-(
versionLen = strlen(PyWin_DLLVersionString);
// alloca == no free required, but memory only local to fn.
// also no heap fragmentation! Am I being silly?
keyBuf = alloca(sizeof(keyPrefix)-1 + versionLen + sizeof(keySuffix)); // chars only, plus 1 NULL.
// lots of constants here for the compiler to optimize away :-)
memcpy(keyBuf, keyPrefix, sizeof(keyPrefix)-1);
memcpy(keyBuf+sizeof(keyPrefix)-1, PyWin_DLLVersionString, versionLen);
memcpy(keyBuf+sizeof(keyPrefix)-1+versionLen, keySuffix, sizeof(keySuffix)); // NULL comes with this one!
rc=RegOpenKey(keyBase, rc=RegOpenKey(keyBase,
"Software\\Python\\PythonCore\\" keyBuf,
MS_DLL_ID "\\PythonPath",
&newKey); &newKey);
if (rc==ERROR_SUCCESS) { if (rc==ERROR_SUCCESS) {
RegQueryInfoKey(newKey, NULL, NULL, NULL, NULL, NULL, NULL, RegQueryInfoKey(newKey, NULL, NULL, NULL, NULL, NULL, NULL,
......
...@@ -10,6 +10,9 @@ ...@@ -10,6 +10,9 @@
#include "osdefs.h" #include "osdefs.h"
#include <windows.h> #include <windows.h>
#include "importdl.h" #include "importdl.h"
#include "malloc.h" // for alloca
extern const char *PyWin_DLLVersionString; // a string loaded from the DLL at startup.
/* Return whether this is Win32s, i.e., Win32 API on Win 3.1(1). /* Return whether this is Win32s, i.e., Win32 API on Win 3.1(1).
This function is exported! */ This function is exported! */
...@@ -29,13 +32,32 @@ BOOL PyWin_IsWin32s() ...@@ -29,13 +32,32 @@ BOOL PyWin_IsWin32s()
FILE *PyWin_FindRegisteredModule( const char *moduleName, struct filedescr **ppFileDesc, char *pathBuf, int pathLen) FILE *PyWin_FindRegisteredModule( const char *moduleName, struct filedescr **ppFileDesc, char *pathBuf, int pathLen)
{ {
char moduleKey[128]; char *moduleKey;
char *pos;
const char keyPrefix[] = "Software\\Python\\PythonCore\\";
const char keySuffix[] = "\\Modules\\";
struct filedescr *fdp = NULL; struct filedescr *fdp = NULL;
FILE *fp; FILE *fp;
int modNameSize = pathLen; int modNameSize = pathLen;
int versionLen, moduleLen;
HKEY keyBase = PyWin_IsWin32s() ? HKEY_CLASSES_ROOT : HKEY_LOCAL_MACHINE; HKEY keyBase = PyWin_IsWin32s() ? HKEY_CLASSES_ROOT : HKEY_LOCAL_MACHINE;
strcpy(moduleKey, "Software\\Python\\PythonCore\\" MS_DLL_ID "\\Modules\\");
strcat(moduleKey, moduleName); // conceptually, this code is setting up:
// sprintf(buf, "Software\\Python\\PythonCore\\%s\\Modules\\%s", PyWin_DLLVersionString, moduleName);
// the sprintf would be clearer, but slower and less "length-safe"
versionLen = strlen(PyWin_DLLVersionString);
moduleLen = strlen(moduleName);
// alloca == no free required, but memory only local to fn, also no heap fragmentation!
moduleKey = alloca(sizeof(keyPrefix)-1 + versionLen + sizeof(keySuffix) + moduleLen); // chars only, plus 1 NULL.
pos = moduleKey;
memcpy(pos, keyPrefix, sizeof(keyPrefix)-1);
pos += sizeof(keyPrefix)-1;
memcpy(pos, PyWin_DLLVersionString, versionLen);
pos +=versionLen;
memcpy(pos, keySuffix, sizeof(keySuffix));
pos += sizeof(keySuffix)-1;
memcpy(pos, moduleName, moduleLen+1); // NULL comes with this one!
if (RegQueryValue(keyBase, moduleKey, pathBuf, &modNameSize)!=ERROR_SUCCESS) if (RegQueryValue(keyBase, moduleKey, pathBuf, &modNameSize)!=ERROR_SUCCESS)
return NULL; return NULL;
// use the file extension to locate the type entry. // use the file extension to locate the type entry.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment