J
Leider ist bei dem Artikel kein Code mehr dabei...
Aber jetzt fällt es mir auch wieder ein
Sowas in der Art:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
VOID NTAPI my__dyn_tls_init(
PVOID hDllHandle,
DWORD dwReason,
LPVOID lpreserved
)
{
const char *szReason = "(unknown)";
switch(dwReason)
{
case DLL_PROCESS_DETACH:
szReason = "DLL_PROCESS_DETACH";
break;
case DLL_PROCESS_ATTACH:
szReason = "DLL_PROCESS_ATTACH";
break;
case DLL_THREAD_ATTACH:
szReason = "DLL_THREAD_ATTACH";
break;
case DLL_THREAD_DETACH:
szReason = "DLL_THREAD_DETACH";
break;
}
printf("my__dyn_tls_init (dwReason: %s) (ThreadID: %d)\n", szReason, GetCurrentThreadId());
return;
}
#pragma section(".CRT$XLC",long,read) // copied from "crt\sect_attribs.h"
static __declspec(allocate(".CRT$XLC")) PIMAGE_TLS_CALLBACK __xl_c = my__dyn_tls_init;
#pragma comment(linker, "/include:__tlregdtor")
DWORD CALLBACK Test1(LPVOID)
{
printf("Test1-Thread\n");
return 0;
}
int _tmain()
{
printf("main started\n");
DWORD tid;
HANDLE h = CreateThread(NULL, 0, &Test1, NULL, 0, &tid);
WaitForSingleObject(h, INFINITE);
printf("main ended\n");
}
Welches bei mir Folgendes aisgibt:
main started
my__dyn_tls_init (dwReason: DLL_THREAD_ATTACH) (ThreadID: 3896)
Test1-Thread
my__dyn_tls_init (dwReason: DLL_THREAD_DETACH) (ThreadID: 3896)
main ended
my__dyn_tls_init (dwReason: DLL_PROCESS_DETACH) (ThreadID: 3496)
Das das Process_attacxh und das erste Thread_attach nicht kommt, kängt wohl vom OS ab (lt. Kommentaren in der CRT)...
Da stellt sich mir allerdings wirklich die Frage, warum es die (statische) CRT nicht gleich "richtig" implementiert hat...
PS: Vermutlich weil es nur in den "meisten" Fällen geht, nicht aber in allen (z.B. wenn es eine DLL ist, welche statisch gegen die CRT gelinkt wurde und diese dann auch noch via LoadLibrary geladen wurde. Dann gehen AFAIK die TLS-Aufrufe nicht...) Wobei: Wenn es eine DLL ist, passt es ja sowieso, oder? Bin ganz verwirrt... nein passt nicht... ach was solls...