DllEntryPoint oraz DllMain

0

Witam nie jest to typowe pytanie ani przypadek

Mam dllke która działa nie mam za to jej kodu
Chcę napisać swoją dllke która umiejscowiona w tym samym miejscu co tamta zostanie załadowana i wykona się DllMain

I teraz następuje ta ciekawsza część

Kod mojej dllki

 #define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <cstdio>

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
	/*if( fdwReason != 1 ){
		return true;
	}*/
	
	FILE * pointer = fopen( "test.txt" , "wt" );
	
	fputs( "Test" , pointer );
	
	fclose( pointer );
	
	return true;
}

bardzo proste kompiluje się bez problemu ale dllka nie jest ładowana ( a może jest ? ) ale jednak funkcja DllMain się nie wykonuje

Zdekompilowałem obie dllki. Co zauważyłem ?

Działająca dllka nie posiada funkcji DllEntryPoint ( kompletnie nic nie ma ) jest tylko DllMain
BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)

Moja dllka posiada funkcje DllEntryPoint , DllMain też jest ale taka
signed int __stdcall sub_63AC13E0(int a1, int a2, int a3)
funkcja jest uruchamiana przez DllEntryPoint

moje pytanie jest jak uzyskać taki efekt jak jest w działąjacej dllce ?

Mój kompilator to MinGW GCC 4.7.2 32-bit ustawiony na tryb Release system 64 bitowy windows 7 SP1

2

Hey,

DllEntryPoint to funkcja dodawana przez MinGW, która robi jakieś tam inicjalizacje związane z CRT zanim nie wywoła Twojego DllMain - tak więc dopóki ta funkcja faktycznie wywołuje Twoje DllMain, to nie masz czym się przejmować i nie tu leży problem.

Natomiast jeśli nie wyexportowałeś odpowiednio DllMain, to DllEntryPoint nie wywoła DllMain (ale z tego co piszesz, to sprawdziłeś i jest wywoływane DllMain, wiec jest dobrze).

W związku z tym powstaje pytanie czy Twoje DLLka jest w ogóle ładowana.
Najlepiej użyj Process Monitor (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) i sprawdź czy ten proces w ogóle otwiera plik Twojej DLLki.
Daj znać co tam znajdziesz.

0

Proszę dllka jest ładowana
Untitled2.png

2

Jeśli mógłbyś pokazać też kilka wpisów niżej, czy "test.txt" nie jest czasem tworzony (ale w innym miejscu niż się spodziewasz).

0

@Edit
Zrobione rozwiązanie to extern "C" + __declspec(dllexport)
troche to dziwne ponieważ przed napisaniem tematu testowałem takie rozwiązanie widać pomyliłem się w jakimś momencie lub może jakiś cache ;)

Oczywiście dziękuje za pomoc :)

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