47
47
void _LoadActCtxPointers()
49
HINSTANCE hKernel32 = GetModuleHandleW(L"kernel32.dll");
51
pfnGetCurrentActCtx = (PFN_GETCURRENTACTCTX) GetProcAddress(hKernel32, "GetCurrentActCtx");
52
// If we can't load GetCurrentActCtx (ie, pre XP) , don't bother with the rest.
53
if (pfnGetCurrentActCtx) {
54
pfnActivateActCtx = (PFN_ACTIVATEACTCTX) GetProcAddress(hKernel32, "ActivateActCtx");
55
pfnDeactivateActCtx = (PFN_DEACTIVATEACTCTX) GetProcAddress(hKernel32, "DeactivateActCtx");
56
pfnAddRefActCtx = (PFN_ADDREFACTCTX) GetProcAddress(hKernel32, "AddRefActCtx");
57
pfnReleaseActCtx = (PFN_RELEASEACTCTX) GetProcAddress(hKernel32, "ReleaseActCtx");
49
HINSTANCE hKernel32 = GetModuleHandleW(L"kernel32.dll");
51
pfnGetCurrentActCtx = (PFN_GETCURRENTACTCTX) GetProcAddress(hKernel32, "GetCurrentActCtx");
52
// If we can't load GetCurrentActCtx (ie, pre XP) , don't bother with the rest.
53
if (pfnGetCurrentActCtx) {
54
pfnActivateActCtx = (PFN_ACTIVATEACTCTX) GetProcAddress(hKernel32, "ActivateActCtx");
55
pfnDeactivateActCtx = (PFN_DEACTIVATEACTCTX) GetProcAddress(hKernel32, "DeactivateActCtx");
56
pfnAddRefActCtx = (PFN_ADDREFACTCTX) GetProcAddress(hKernel32, "AddRefActCtx");
57
pfnReleaseActCtx = (PFN_RELEASEACTCTX) GetProcAddress(hKernel32, "ReleaseActCtx");
61
61
ULONG_PTR _Py_ActivateActCtx()
64
if (PyWin_DLLhActivationContext && pfnActivateActCtx)
65
if (!(*pfnActivateActCtx)(PyWin_DLLhActivationContext, &ret)) {
66
OutputDebugString("Python failed to activate the activation context before loading a DLL\n");
67
ret = 0; // no promise the failing function didn't change it!
64
if (PyWin_DLLhActivationContext && pfnActivateActCtx)
65
if (!(*pfnActivateActCtx)(PyWin_DLLhActivationContext, &ret)) {
66
OutputDebugString("Python failed to activate the activation context before loading a DLL\n");
67
ret = 0; // no promise the failing function didn't change it!
72
72
void _Py_DeactivateActCtx(ULONG_PTR cookie)
74
if (cookie && pfnDeactivateActCtx)
75
if (!(*pfnDeactivateActCtx)(0, cookie))
76
OutputDebugString("Python failed to de-activate the activation context\n");
74
if (cookie && pfnDeactivateActCtx)
75
if (!(*pfnDeactivateActCtx)(0, cookie))
76
OutputDebugString("Python failed to de-activate the activation context\n");
79
BOOL WINAPI DllMain (HANDLE hInst,
80
ULONG ul_reason_for_call,
79
BOOL WINAPI DllMain (HANDLE hInst,
80
ULONG ul_reason_for_call,
83
switch (ul_reason_for_call)
85
case DLL_PROCESS_ATTACH:
86
PyWin_DLLhModule = hInst;
87
// 1000 is a magic number I picked out of the air. Could do with a #define, I spose...
88
LoadString(hInst, 1000, dllVersionBuffer, sizeof(dllVersionBuffer));
90
// and capture our activation context for use when loading extensions.
91
_LoadActCtxPointers();
92
if (pfnGetCurrentActCtx && pfnAddRefActCtx)
93
if ((*pfnGetCurrentActCtx)(&PyWin_DLLhActivationContext))
94
if (!(*pfnAddRefActCtx)(PyWin_DLLhActivationContext))
95
OutputDebugString("Python failed to load the default activation context\n");
98
case DLL_PROCESS_DETACH:
100
(*pfnReleaseActCtx)(PyWin_DLLhActivationContext);
83
switch (ul_reason_for_call)
85
case DLL_PROCESS_ATTACH:
86
PyWin_DLLhModule = hInst;
87
// 1000 is a magic number I picked out of the air. Could do with a #define, I spose...
88
LoadString(hInst, 1000, dllVersionBuffer, sizeof(dllVersionBuffer));
90
// and capture our activation context for use when loading extensions.
91
_LoadActCtxPointers();
92
if (pfnGetCurrentActCtx && pfnAddRefActCtx)
93
if ((*pfnGetCurrentActCtx)(&PyWin_DLLhActivationContext))
94
if (!(*pfnAddRefActCtx)(PyWin_DLLhActivationContext))
95
OutputDebugString("Python failed to load the default activation context\n");
98
case DLL_PROCESS_DETACH:
100
(*pfnReleaseActCtx)(PyWin_DLLhActivationContext);
106
106
#endif /* Py_ENABLE_SHARED */