DllEntryPoint powinien inaczej wyglądać. Masz tam parametr reason, który może przybrać wartości DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH i DLL_PROCESS_DETACH. Jak łatwo się domyśleć, ta funkcja może być wywoływana wielokrotnie, na pewno dwa razy - przy ładowaniu i zwolnieniu biblioteki.
Druga sprawa: jeśli mnie pamięć nie myli, w DllEntryPoint nie powinno się wywoływać funkcji niekernelowych, ergo - tworzenie okien odpada. W DLL_PROCESS_ATTACH stwórz wątek, który robi to, co teraz robi twój dll-entry, a w DLL_PROCESS_DETACH daj sygnał do zamknięcia okna i czekaj aż wątek się skończy (WaitForSingleObject).
To tyle...