DLL - DLLMain – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

DLL - DLLMain – C / C++ – Fórum – Programujte.comDLL - DLLMain – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Kapa
~ Anonymní uživatel
4 příspěvky
6. 5. 2014   #1
-
0
-

 Ahoj,

vytvářím DLL knihovnu v C, kterou mám pak přilinkovanou v C#  aplikaci. Podle popisu MSDN jsem myslel, že chápu jak funguje DLLMain, ale když jsem si nechal stavy vypsat do consoly, tak mi to nedává moc smysl. Tak například když zavolám funkci z knihovny, tak výpis z consoly vypadá následovně:

DLL_PROCESS_ATTACH
DLL_THREAD_ATTACH
DLL_THREAD_DETACH
DLL_PROCESS_DETACH
pokracuje vypis jiz ze samotne funkce

Jak to, že funkce se vykonána, až po  DLL_PROCESS_DETACH?

Proč i během vykonávání funkce dochází  k DLL_PROCESS_ATTACH a  DLL_PROCESS_DETACH?

diky

Nahlásit jako SPAM
IP: 109.80.156.–
Reklama
Reklama
hlucheucho+10
Posthunter
6. 5. 2014   #2
-
0
-

Odvozuji "selským" rozumem: Při volání každé funkce jsou jí přiděleny nějaké systémové prostředky. Před jejím návratem jsou vráceny a pak je vrácena návratová hodnota.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Kapa
~ Anonymní uživatel
4 příspěvky
6. 5. 2014   #3
-
0
-

Jsem to nepopsal asi moc dobře včera: 

DLL:
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
			printf("DLL_PROCESS_ATTACH \n");
		case DLL_THREAD_ATTACH:
			printf("DLL_THREAD_ATTACH \n");
		case DLL_THREAD_DETACH:
			printf("DLL_THREAD_DETACH \n");
		case DLL_PROCESS_DETACH:
			printf("DLL_PROCESS_DETACH \n");
			break;
	}
	return TRUE;
}

DWORD DIO_Initialize()
{
	printf("From DLL \n");
	return 1;
}

C#:
Console.Write("Ret val 1: " + DIO_Initialize() + "\n");
Thread.Sleep(500);
Console.Write("Ret val 2: " + DIO_Initialize() + "\n");

Vypis z console:
DLL_PROCESS_ATTACH
DLL_THREAD_ATTACH
DLL_THREAD_DETACH
DLL_PROCESS_DETACH
From DLL
Ret val 1: 1
From DLL
Ret val 2: 1
DLL_PROCESS_DETACH

Pokud do funkce  DIO_Initialize vložím smyčku s výpisem do console (+ sleep 2s), tak dojde k zavolani DllMain i behem vykonavani funkce. Můj selský rozum mi říká, že to nedává smysl, respektive si nedokazu predstavit cokoliv vykonavat v DllMain pri takoveto podivne posloupnosti volani.

DLL_PROCESS_ATTACH
DLL_THREAD_ATTACH
DLL_THREAD_DETACH
DLL_PROCESS_DETACH
From DLL
From DLL
From DLL
From DLL
From DLL
From DLL
From DLL
From DLL
From DLL
From DLL
Ret val 1: 1
From DLL
From DLL
From DLL
From DLL
From DLL
DLL_THREAD_ATTACH
DLL_THREAD_DETACH
DLL_PROCESS_DETACH
DLL_THREAD_ATTACH
DLL_THREAD_DETACH
DLL_PROCESS_DETACH
DLL_THREAD_ATTACH
DLL_THREAD_DETACH
DLL_PROCESS_DETACH
From DLL
From DLL
From DLL
From DLL
From DLL
Ret val 2: 1
DLL_PROCESS_DETACH
Nahlásit jako SPAM
IP: 109.80.156.–
Radek Chalupa
~ Redaktor
0
Super člen
6. 5. 2014   #4
-
0
-

#3 Kapa
V tom switchi ty chybí breaky:-) takže ti samozřejmě vždy vypíše všechny 4 case..

Radek Chalupa 
- vývoj software na zakázku 
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC) 
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 89.177.51.–
hlucheucho+10
Posthunter
6. 5. 2014   #5
-
0
-

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682596(v=vs.85).aspx

popis jak se to chová. Možná by se to dalo podle struktury tvého příkazu switch i rozluštit z výpisu, který si sem dal.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Kapa
~ Anonymní uživatel
4 příspěvky
6. 5. 2014   #6
-
0
-

  , máte pravdu, vůbec jsem nevšiml, že je tam nemám..., diky 

Nahlásit jako SPAM
IP: 109.80.156.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 260 hostů

Podobná vlákna

DLL a c++ — založil Míra

Dll — založil paking

Dll — založil Tomass

C# a dll — založil Grungy

Použití dll v C — založil etrix

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý