pętla while w dll

0

otóż mam pewien problem, chciałem przerzucić mój kod z aplikacji konsolowej do dll, problem polega na tym że po wstrzyknięciu, aplikacja której wstrzyknąłem dll się zacina, jak mogę temu zaradzić?

 
#include <windows.h>
#include <gdiplus.h>

const int SX = GetSystemMetrics(SM_CXSCREEN);
const int SY = GetSystemMetrics(SM_CYSCREEN);

const int SCREEN_X = (SX/2);
const int SCREEN_Y = (SY/2);

int glowna(void);

BOOL WINAPI
DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) 
{
	if(fdwReason==DLL_PROCESS_ATTACH) 
    {
                                                                   
		//MessageBox(0,"oppkan.dll loaded.","Attention",0);  
		Sleep(150);
		glowna();                                                 
    }
	return 0;
}

int glowna(void)
{
	// pixel detect and shooting
	register HDC hdc = GetDC(0);
	register COLORREF lcolor;
	register INPUT ip;
	DWORD shotbot = 0;
	ip.type = INPUT_MOUSE;
	ip.mi.dx = 0;
	ip.mi.dy = 0;
	ip.mi.dwExtraInfo = 0;
	ip.mi.dwFlags = MOUSEEVENTF_MIDDLEDOWN;
	while(1)
	{
		if(GetAsyncKeyState(0xA4) && GetAsyncKeyState(0x53))
		{
			if(shotbot == 1)
			{
				shotbot = 0;
				PlaySound((LPCSTR)SND_ALIAS_SYSTEMASTERISK, NULL, SND_ALIAS_ID);
			}
			else
			{
				shotbot = 1;
				PlaySound((LPCSTR)SND_ALIAS_SYSTEMEXCLAMATION, NULL, SND_ALIAS_ID);
			}
		}
		if(shotbot == 1)
		{
			Sleep(1);
			lcolor = GetPixel(hdc,SCREEN_X,SCREEN_Y);
			if(lcolor == RGB(255, 0, 0))
			{
				Sleep(50);
				ip.mi.dx = 0;
				ip.mi.dy = 0;
				ip.mi.dwFlags = MOUSEEVENTF_MIDDLEDOWN;
				SendInput(1, &ip, sizeof(INPUT));
				Sleep(50);
				ip.mi.dx = 0;
				ip.mi.dy = 0;
				ip.mi.dwFlags = MOUSEEVENTF_MIDDLEUP;
				SendInput(1, &ip, sizeof(INPUT));
			}
		}
	}
}
0

Musi być osobny wątek lub tworzysz okienko, i wysyłasz do niego timera 50 ms, w timerze wykonujesz część przed sleep i znowu ustawiasz timera.

0

a jak ten wątek stworzyć?

0

ale co ten wątek mi dokładnie da

0

Procedura DllMain się skończy aplikacja pójdzie dalej, zaś twój kod będzie sobie działać w wątku.

0

czytałem na pewnej stronie iż wątek w funkcji DllMain jest niebezpieczny, czy to prawda? ;o

0

stworzyłem ten wątek i w funkcji wątku wywołałem moją funkcję, już się nic nie zacina ale gdy naciskam alt + s wywala błąd i dostaje krasza, co jest nie tak?

 
#include <windows.h>
#include <gdiplus.h>

const int SX = GetSystemMetrics(SM_CXSCREEN);
const int SY = GetSystemMetrics(SM_CYSCREEN);

const int SCREEN_X = (SX/2);
const int SCREEN_Y = (SY/2);

int glowna(void);

DWORD WINAPI ThreadFunction(PVOID pvParam)
{
	glowna();
	return 0;
}

BOOL WINAPI
DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) 
{
	if(fdwReason==DLL_PROCESS_ATTACH) 
    {
                                                                   
		//MessageBox(0,"oppkan.dll loaded.","Attention",0);  
		DWORD IdWatku;
		CreateThread(0, 0, ThreadFunction, 0, 0, &IdWatku);

    }
	return 0;
}

int glowna(void)
{
	// pixel detect and shooting
	register HDC hdc = GetDC(0);
	register COLORREF lcolor;
	register INPUT ip;
	DWORD shotbot = 0;
	ip.type = INPUT_MOUSE;
	ip.mi.dx = 0;
	ip.mi.dy = 0;
	ip.mi.dwExtraInfo = 0;
	ip.mi.dwFlags = MOUSEEVENTF_MIDDLEDOWN;
	while(1)
	{
		if(GetAsyncKeyState(0xA4) && GetAsyncKeyState(0x53))
		{
			if(shotbot == 1)
			{
				shotbot = 0;
				PlaySound((LPCSTR)SND_ALIAS_SYSTEMASTERISK, NULL, SND_ALIAS_ID);
			}
			else
			{
				shotbot = 1;
				PlaySound((LPCSTR)SND_ALIAS_SYSTEMEXCLAMATION, NULL, SND_ALIAS_ID);
			}
		}
		if(shotbot == 1)
		{
			Sleep(1);
			lcolor = GetPixel(hdc,SCREEN_X,SCREEN_Y);
			if(lcolor == RGB(255, 0, 0))
			{
				Sleep(50);
				ip.mi.dx = 0;
				ip.mi.dy = 0;
				ip.mi.dwFlags = MOUSEEVENTF_MIDDLEDOWN;
				SendInput(1, &ip, sizeof(INPUT));
				Sleep(50);
				ip.mi.dx = 0;
				ip.mi.dy = 0;
				ip.mi.dwFlags = MOUSEEVENTF_MIDDLEUP;
				SendInput(1, &ip, sizeof(INPUT));
			}
		}
	}
}
0

PlaySound - spróbuj wywalić.

0

A czy ta DLL będzie wstrzykiwana do jakiegoś konkretnego programu? Jeśli tak, to może będzie się dało wykorzystać APC do synchronizacji z głównym wątkiem aplikacji (coby ten problematyczny PlaySound odpalić, jeśli to w ogóle o niego chodzi).

0

po usunięciu PlaySound i po wstrzyknięciu jest błąd "unexception handler" i mi pokazuje żeby wybrać jakiś debugger, nie wiem co robić

0

ta dll będzie wstrzykiwana do gry

0

pomoże ktoś?

0

dobra, poczytałem trochę w necie o tym i znalazłem przyczynę, return powinien był zwracać true, dlatego nie działało

1 użytkowników online, w tym zalogowanych: 0, gości: 1