Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



DllMain, HINSTANCE

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: DllMain, HINSTANCE

Autor: LuP

10:46:56 30.11.2009

Děkuji za odpovědi, závěr bych udělal následující:

1) Definovat vlastní DllMain není na škodu, protože skutečným entry pointem je _DllMainCRTStartup, která provádí důležité inicializace. Pokud se DllMain nedefinuje, VS použije vlastní (prázdnou) definici.

2) Dostat se k HINSTANCE .dll lze:

2a) použitím jména .dll a GetModuleHandle() s rizikem (vlastností), že pokud se změní jméno .dll, musí se změnit rovněž parametr při volání,

2b) nebo kódem o tři příspěvky výše.

LuP

Citovat příspěvek

 

Re: DllMain, HINSTANCE

Autor: JiriValerian

10:39:05 30.11.2009

[color=#008000]LuP Napsal:
-------------------------------------------------------
> ... _DllMainCRTStartup je ponechán jako entry
> point.
>
> Sice jsem (tenkrát) nechal VS vygenerovat projekt
> pro .dll, ale prázdný, takže ani nevznikla
> DllMain, kterou zde uvedl pan JV a které nic
> nedělá.
>
> Čili asi (moje vlastní) DllMain by nebyla na
> škodu.
>[/color]

Ano minimálně k účelu uložení handle knihovny do globální proměnné jak jsme uvedl v příkladu.

Citovat příspěvek

 

Re: DllMain, HINSTANCE

Autor: LuP

10:33:59 30.11.2009

... _DllMainCRTStartup je ponechán jako entry point.

Sice jsem (tenkrát) nechal VS vygenerovat projekt pro .dll, ale prázdný, takže ani nevznikla DllMain, kterou zde uvedl pan JV a které nic nedělá.

Čili asi (moje vlastní) DllMain by nebyla na škodu.

Citovat příspěvek

 

Re[2]: DllMain, HINSTANCE

Autor: LadislavZezula

10:33:26 30.11.2009

> Ta předpokládá, že .dll se bude jmenovat pořád stejně; tomu jsem se
> chtěl vyhnout, raději jsem chtěl používat nějakou proměnnou, kterou by .dll "nabízela".

Muze to byt budto promenna, ale muze to byt i funkce,
treba ta, kterou jsi sam navrhoval (GetThisDllModuleHandle).

Pokud bys ale mel tzv. resource-only DLLku (tj. ze by obsahovala pouze
resources), tak bych spis navrhoval nacist si ji pomoci LoadLibrary
a vysledny HMODULE ulozit do globalni promenne.

L.



Příspěvek zaslán emailem

Citovat příspěvek

 

Re: DllMain, HINSTANCE

Autor: JiriValerian

10:30:18 30.11.2009

[color=#008000]LuP Napsal:
-------------------------------------------------------
> Nicméně - hypoteticky - existovala by nějaké cesta
> přes nějakou proměnnou nebo funkci s HINSTANCE,
> kterou by přímo nabízela .dll v rámci
> exportovaných symbolů?[/color]

Samozřejmě.

[size=14px][code]HINSTANCE Global_hInst [color=#800000]=[/color] NULL[color=#800000];[/color]

[color=#0000FF]__declspec[/color][color=#800000]([/color][color=#0000FF]dllexport[/color][color=#800000])[/color] HINSTANCE WINAPI GetHInstThisDll [color=#800000]([/color][color=#0000FF]void[/color][color=#800000])[/color]
[color=#800000]{[/color]
[color=#0000FF]return[/color] Global_hInst[color=#800000];[/color]
[color=#800000]}[/color][color=#800000];[/color]


BOOL APIENTRY DllMain[color=#800000]([/color] HMODULE hModule[color=#800000],[/color]
DWORD ul_reason_for_call[color=#800000],[/color]
LPVOID lpReserved [color=#800000])[/color]
[color=#800000]{[/color]
[color=#0000FF]switch[/color] [color=#800000]([/color]ul_reason_for_call[color=#800000])[/color]
[color=#800000]{[/color]
[color=#0000FF]case[/color] DLL_PROCESS_ATTACH[color=#800000]:[/color]
Global_hInst [color=#800000]=[/color] [color=#800000]([/color]HINSTANCE[color=#800000])[/color]hModule[color=#800000];[/color]
[color=#0000FF]case[/color] DLL_THREAD_ATTACH[color=#800000]:[/color]
[color=#0000FF]case[/color] DLL_THREAD_DETACH[color=#800000]:[/color]
[color=#0000FF]case[/color] DLL_PROCESS_DETACH[color=#800000]:[/color]
[color=#0000FF]break[/color][color=#800000];[/color]
[color=#800000]}[/color]
[color=#0000FF]return[/color] TRUE[color=#800000];[/color]
[color=#800000]}[/color][/code][/size]

Citovat příspěvek

 

Re: Re[2]: DllMain, HINSTANCE

Autor: JiriValerian

10:26:30 30.11.2009

[color=#008000]LadislavZezula Napsal:
-------------------------------------------------------
> Pod pojmem "DllMain visual studia" jsem myslel
> DllMain, ktery je
> v CRT knihovne a tedy (jak spravne pises)
> _DllMainCRTStartup.
> Omlouvam se za nepresnost. Jinak to plati.
>
> L.
>[/color]

Tazatel se nepřesně vyjádřil a měl by to objasnit doplněním, zda si skutečně explicitně
pro linker vyměnil vstupní bod [b]_DllMainCRTStartup[/b] anebo zda si jen napsal
pouze vlastní [b]DllMain[/b] v projektu což je v tomto ohledu zásadní informace.

Citovat příspěvek

 

Re[2]: DllMain, HINSTANCE

Autor: LadislavZezula

10:21:16 30.11.2009

> To je hluboký omyl. DllMain nic takového nedělá. DllMain není ani
> skutečným vstupním bodem. Vstupním bodem, který se linkuje k DLL v

Pod pojmem "DllMain visual studia" jsem myslel DllMain, ktery je
v CRT knihovne a tedy (jak spravne pises) _DllMainCRTStartup.
Omlouvam se za nepresnost. Jinak to plati.

L.



Příspěvek zaslán emailem

Citovat příspěvek

 

Re: DllMain, HINSTANCE

Autor: LuP

10:20:39 30.11.2009

Ta předpokládá, že .dll se bude jmenovat pořád stejně; tomu jsem se chtěl vyhnout, raději jsem chtěl používat nějakou proměnnou, kterou by .dll "nabízela".

Postup podle JV problém řeší, příp. změnit jméno .dll v GetModuleHandle() je trivka (jen se na to nesmí zapomenout; i když pravděpodobnost změny jména .dll je dost malá).

Nicméně - hypoteticky - existovala by nějaké cesta přes nějakou proměnnou nebo funkci s HINSTANCE, kterou by přímo nabízela .dll v rámci exportovaných symbolů?

Citovat příspěvek

 

Re: DllMain, HINSTANCE

Autor: JiriValerian

10:14:07 30.11.2009

[color=#008000]LadislavZezula Napsal:
-------------------------------------------------------
> DllMain visual studia vicemene pouze inicializuje
> CRT knihovnu, a to predpokladam ve tvem DllMainu
> nedelas :-).
>
> L.
>[/color]

To je hluboký omyl. [b]DllMain[/b] nic takového nedělá. [b]DllMain[/b] není ani skutečným vstupním bodem. Vstupním bodem, který se linkuje k DLL v rámci [b]CRT knihovny jazyka[/b] je interní funkce [b]_DllMainCRTStartup[/b], která se stará o inicializaci CRT knihovny a také volá [b]DllMain[/b], a to ať už je to [b]DllMain[/b] vytvořený třeba ze šablony projektu nebo [b]DllMain[/b] ukrytý v MFC knihovně nebo vlastní napsaný [b]DllMain[/b]. Ve všech případech je funkce [b]DllMain[/b] volána z [b]_DllMainCRTStartup[/b]. Pouze ve výjimečných případech kdy explicitně linkeru definujete vlastní vstupní bod, se [b]_DllMainCRTStartup[/b] nezavolá. To ovšem nebude podle popisu případ tazatele ;).

Citovat příspěvek

 

Re: DllMain, HINSTANCE

Autor: JiriValerian

10:05:10 30.11.2009

[color=#008000]LuP Napsal:
-------------------------------------------------------
> Zdravím v konferenci,
>
> (VS2008)
>
> mám .dll, která nevytváří okno. Původně jsem v ní
> neměl DllMain; kompilátor zřejmě DllMain dotvořil
> sám (resp. připojil nějaké .obj, jak jsem odvodil
> z nápovědy).
>
> 2) Jaké je nebezpečí, že moje DllMain (když už ji
> tedy musím vytvořit) neudělá "všechnu práci", co
> dělá DllMain Visual Studia?
>[/color]

Pokud si nechám ve [b]Visual C++ 2008[/b] vygenerovat projekt typu [b]Win32 DLL[/b],
tak se sice vytvoří v rámci šablony projektu funkce [b]DllMain[/b], ale ta nic nedělá
a vypadá viz níže. Takže pokud jste si ji nahradil svojí vlastní tak se nic neděje.

[size=14px][code]BOOL APIENTRY DllMain[color=#800000]([/color] HMODULE hModule[color=#800000],[/color]
DWORD ul_reason_for_call[color=#800000],[/color]
LPVOID lpReserved [color=#800000])[/color]
[color=#800000]{[/color]
[color=#0000FF]switch[/color] [color=#800000]([/color]ul_reason_for_call[color=#800000])[/color]
[color=#800000]{[/color]
[color=#0000FF]case[/color] DLL_PROCESS_ATTACH[color=#800000]:[/color]
[color=#0000FF]case[/color] DLL_THREAD_ATTACH[color=#800000]:[/color]
[color=#0000FF]case[/color] DLL_THREAD_DETACH[color=#800000]:[/color]
[color=#0000FF]case[/color] DLL_PROCESS_DETACH[color=#800000]:[/color]
[color=#0000FF]break[/color][color=#800000];[/color]
[color=#800000]}[/color]
[color=#0000FF]return[/color] TRUE[color=#800000];[/color]
[color=#800000]}[/color][/code][/size]

Citovat příspěvek

 

Re[2]: DllMain, HINSTANCE

Autor: LadislavZezula

10:02:11 30.11.2009

> ... Když zavolám v .exe GetModuleHandle, tak vrátí HANDLE toho
> .exe. Tam (samozřejmě) žádný resource dialogu není. Jak tedy získám
> z .exe HMODULE té přilinkované .dll?

GetModuleHandle(_T("NameOfYourDll.dll"));

L.



Příspěvek zaslán emailem

Citovat příspěvek

 

Re: DllMain, HINSTANCE

Autor: JiriValerian

9:59:11 30.11.2009

[color=#008000]LuP Napsal:
-------------------------------------------------------
> ... Když zavolám v .exe GetModuleHandle, tak vrátí
> HANDLE toho .exe.[/color]

Když dáte funkci [b]GetModuleHandle[/b] jako parametr název té vaší DLL knihovny
tak vrátí handle té knihovny a ne exáče.

Je to popsáno v dokumentaci MSDN viz odkaz.

[b]GetModuleHandle Function[/b]
http://msdn.microsoft.com/en-us/library/ms683199(VS.85).aspx

Citovat příspěvek

 

Re: DllMain, HINSTANCE

Autor: LuP

9:53:09 30.11.2009

... Když zavolám v .exe GetModuleHandle, tak vrátí HANDLE toho .exe. Tam (samozřejmě) žádný resource dialogu není. Jak tedy získám z .exe HMODULE té přilinkované .dll?

Nebo v .dll definovat fci - třeba

__declspec(dllexport) GetThisDllModuleHandle() { return GetModuleHandle(NULL); }

A ta by vracela HMODULE té .dll? A tu použít místo globální HINSTANCE ukládané pomocí DllMain?

LuP

Citovat příspěvek

 

Re: DllMain, HINSTANCE

Autor: LadislavZezula

9:30:03 30.11.2009

> 1) Existuje jiná lepší metoda, jak zjistit HINSTANCE té .dll z .exe
> pro okamžik, kdy budu z .exe potřebovat sáhnout do resourců té .dll?

GetModuleHandle

> 2) Jaké je nebezpečí, že moje DllMain (když už ji tedy musím
> vytvořit) neudělá "všechnu práci", co dělá DllMain Visual Studia?

DllMain visual studia vicemene pouze inicializuje CRT knihovnu,
a to predpokladam ve tvem DllMainu nedelas :-).

L.



Příspěvek zaslán emailem

Citovat příspěvek

 

DllMain, HINSTANCE

Autor: LuP

9:18:29 30.11.2009

Zdravím v konferenci,

(VS2008)

mám .dll, která nevytváří okno. Původně jsem v ní neměl DllMain; kompilátor zřejmě DllMain dotvořil sám (resp. připojil nějaké .obj, jak jsem odvodil z nápovědy).

Nicméně DllMain jsem musel vytvořit, protože v té .dll je definováno resource nějakého dialogu, a když jsem jej potřeboval zobrazit (v kódu .exe, který to .dll používá), potřeboval jsem předat HINSTANCE té .dll (při volání CreateDialog). A v DllMain si HINSTANCE ukládám do nějaké globální proměnné.

Dodávám, že .dll nepřipojuji v .exe pomocí LoadLibrary (takže nezískám HMODULE/HINSTANCE té .dll) - jde o .dll, kterou loader připojuje k .exe okamžitě při spouštění .exe.

Dotazy jsou dva:

1) Existuje jiná lepší metoda, jak zjistit HINSTANCE té .dll z .exe pro okamžik, kdy budu z .exe potřebovat sáhnout do resourců té .dll?

Tj. jinak, než za účelem uložení HINSTANCE .dll vytvořit DllMain?

2) Jaké je nebezpečí, že moje DllMain (když už ji tedy musím vytvořit) neudělá "všechnu práci", co dělá DllMain Visual Studia?

Zatím jsem chtěl, aby se "standardní" DllMain Visual Studia normálně použila (protože nevím, co všechno může provádět - co všechno třeba inicializuje, vyplňuje apod., pouze vím, že stávájící .dll - bez mojí DllMain - fungovaly k obecné spokojenosti).

Děkuji předem za odpověď.

LuP

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: