Použití C Run-Time

Překlady článku Překlady článku
ID článku: 94248 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Tento dokument obsahuje následující oddíly:
Část 1: 3 Forms knihovny C-prováděcí (CRT) jsou dostupné
Část 2: použití při vytváření CRT knihovny DLL
Část 3: Použití ke zjednodušení procesu sestavit NTWIN32.MAK
Oddílu 4: Byly zjištěny při použití více CRT knihovny problémy
5 Části: Knihovna typů směšování

Další informace

Část 1: 3 Forms knihovny C-prováděcí (CRT) jsou dostupné

Existují tři formulářů knihovně C Runtime poskytované Win32 SDK:
  • LIBC.LIB je staticky propojené knihovny programů jedním podprocesem.
  • LIBCMT.LIB je staticky propojené knihovny, která podporuje programy s více podprocesy.
  • CRTDLL.LIB je knihovna importu pro CRTDLL.DLL podporuje také programy s více podprocesy. CRTDLL.DLL samotný je součástí tohoto systému.
Microsoft Visual C++ 32bitové vydání obsahuje také tyto tři formuláře, však CRT v DLL názvem MSVCRT.LIB. DLL je redistributable. Jeho název závisí na verzi VC ++ (ie MSVCRT10.DLL nebo MSVCRT20.DLL). Všimněte si však, že MSVCRT10.DLL není podporován na Win32s, zatímco CRTDLL.LIB je podporována v Win32s. MSVCRT20.DLL pochází ve dvou verzích: jeden pro Windows NT a druhý pro Win32s.

Část 2: Použití při vytváření CRT knihovny DLL



Při vytváření DLL, který používá některý z knihoven C Runtime Chcete-li zajistit, aby CRT je správně inicializován, buď
  1. DllMain() musí název inicializační funkce a vstupní bod musí být zadán s linker možnost-entry:_DllMainCRTStartup@12 - nebo -

  2. vstupní bod DLL musí explicitně volat CRT_INIT() na procesu připojit a odpojit procesu
To umožňuje knihoven C Runtime správně přidělení a inicializovat data C Runtime při připojování proces nebo podproces k DLL správně vyčistit data C Runtime při procesu je odpojení z DLL a pro globální objekty C++ v DLL správně sestavit a destructed.

Všechny vzorky Win32 SDK použít první metodu. Je použít jako příklad. Také odkazovat na Win32 Programmer's Reference DllEntryPoint() a dokumentaci Visual C++ DllMain(). Pokud existuje, Všimněte si, že volání DllMainCRTStartup() CRT_INIT() a CRT_INIT() bude volat DllMain() vaše aplikace.

Pokud chcete použít druhé metody a volání CRT inicializace kód sami, namísto použití DllMainCRTStartup() a DllMain(), existují dva postupy:
  1. Pokud není žádná položka funkce který provádí inicializace kód jako vstupní bod DLL jednoduše zadat CRT_INIT(). Za předpokladu, že jste zahrnuty NTWIN32.MAK, které definuje DLLENTRY jako "@ 12", přidat čáru propojení DLL následující možnost:
    -Entry:_CRT_INIT$(DLLENTRY)
    - nebo -

  2. Pokud jste * proveďte * máte vlastní položku DLL na, proveďte v vstupní bod:

    1. Použijte tento prototyp pro CRT_INIT():
      _CRT_INIT BOOL WINAPI (HINSTANCE hinstDLL, fdwReason DWORD, LPVOID lpReserved);
      Informace o CRT_INIT() vrácené hodnoty naleznete v dokumentaci DllEntryPoint; vrácena stejné hodnoty.
    2. Na DLL_PROCESS_ATTACH a DLL_THREAD_ATTACH (viz odkaz Další informace o tyto příznaky "DllEntryPoint" v Win32 API) CRT_INIT(), nejprve volat, před libovolné funkce C Runtime se nazývají nebo jsou prováděny všechny operace s plovoucí desetinnou čárkou.
    3. Vlastní kód proces nebo podproces inicializace/ukončení volání.
    4. Na DLL_PROCESS_DETACH a DLL_THREAD_DETACH volána funkce volání CRT_INIT() poslední, po všech C Runtime a jsou dokončeny všechny operace plovoucí bodu.
    Ujistěte se, že předávají CRT_INIT() všechny parametry položka přejděte; CRT_INIT() očekává tyto parametry, takže věci nemusí fungovat spolehlivě, pokud jejich vynechán (v určitých fdwReason je nutné určit, zda je potřeba procesu inicializace nebo ukončení).

    Níže je funkci vstupního bodu skeleton ukázkové zobrazující kdy a jak provést tyto volání CRT_INIT() vstupní bod DLL:
        BOOL WINAPI DllEntryPoint(HINSTANCE hinstDLL, DWORD fdwReason,
            LPVOID lpReserved)
        {
        if (fdwReason == DLL_PROCESS_ATTACH || fdwReason == DLL_THREAD_ATTACH)
            if (!_CRT_INIT(hinstDLL, fdwReason, lpReserved))
                return(FALSE);
    
        if (fdwReason == DLL_PROCESS_DETACH || fdwReason == DLL_THREAD_DETACH)
            if (!_CRT_INIT(hinstDLL, fdwReason, lpReserved))
                return(FALSE);
        return(TRUE);
        }
    						
    Toto je poznámka * není * potřeby, pokud používáte DllMain() a - entry:_DllMainCRTStartup@12.

Část 3: Použití ke zjednodušení procesu sestavit NTWIN32.MAK

Jsou definovány v NTWIN32.MAK lze zjednodušit vaše makefiles a zajistit, že jsou správně integrovaných předcházení konfliktům makra. Společnost z tohoto důvodu Microsoft důrazně doporučuje podle pomocí NTWIN32.MAK a makra.

Kompilace, použijte:
   $(cvarsdll)          for apps/DLLs using CRT in a DLL
				
pro propojování, použít jednu z následujících:
   $(conlibsdll)        for console apps/DLLs using CRT in a DLL
   $(guilibsdll)        for GUI apps using CRT in a DLL
				

Oddílu 4: Byly zjištěny při použití více CRT knihovny problémy

Pokud aplikace, které umožňuje C Runtime volá odkazy DLL také provádí volání C Runtime, uvědomte si, pokud jsou obě propojeny s jedním z staticky propojené knihoven C Runtime (LIBC.LIB nebo LIBCMT.LIB) exe a DLL budou mít samostatné kopie všech funkcí C Runtime a globální proměnné. To znamená data C Runtime nemůže být sdílena mezi exe a DLL. Některé problémy, které mohou nastat následkem jsou:
  • Předávání ve vyrovnávací paměti datového proudu v modulu zpracovává z exe nebo DLL
  • Přidělování paměti pomocí volání C Runtime v exe nebo DLL a nové přidělování nebo uvolňování v jiných modulu
  • Kontrola nebo nastavení hodnoty proměnné globální kód chyby v exe nebo DLL a očekává ji být stejné v jiných modulu. Související problém je v modulu opačné volání perror() z kde C Runtime došlo k chybě, protože perror() používá kód chyby.
K těmto problémům vyhnout, propojení exe a DLL s CRTDLL.LIB nebo MSVCRT.LIB, což umožňuje .exe i DLL používat společnou sadu funkcí a dat obsažených v rámci CRT DLL, a C Runtime data jako například proud, popisovače lze potom sdílet exe a DLL.

5 Části: Knihovna typů směšování

Bez ohledu na to, co váš .exe je spojen s Pokud vyhnout směšování CRT datových struktur a předáním popisovačů souboru CRT nebo CRT FILE * ukazatelů jiných modulů můžete propojit DLL s CRTDLL.LIB/MSVCRT.LIB.

Směšovací knihovně typů při dodržovat následující:
  • Popisovačů souboru CRT mohou pouze provozovaný na společností CRT modul, který je vytvořil.
  • CRT FILE * ukazatelů může pouze provozovaný na společností CRT modul, který je vytvořil.
  • Paměť přidělená funkci malloc() CRT mohou pouze uvolněno nebo reallocated modulu CRT přidělené jej.
Toto znázornění zvažte následující příklad:
   - .EXE is linked with MSVCRT.LIB
   - DLL A is linked with LIBCMT.LIB
   - DLL B is linked with CRTDLL.LIB
				
Pokud exe vytvoří popisovač souboru CRT pomocí _create() nebo _open(), může být tento popisovač souboru pouze předána do _lseek() _read(), _write(), _close(), atd. v souboru .exe. Není předat tento popisovač souboru CRT buď DLL. Není předat získané z buď DLL jiných DLL nebo exe popisovač souboru CRT.

Pokud DLL A přidělí blok paměti s malloc(), může pouze DLL A volání free(), _expand() nebo realloc() pracovat, že blok. Nelze volat malloc() od DLL a pokuste se uvolnit, že blok z exe nebo DLL B.

Poznámka: Pokud všechny tři moduly byly propojeny s CRTDLL.LIB nebo všechny tři byly propojeny s MSVCRT.LIb, tato omezení by nelze použít.
Při propojování dll s LIBC.LIB Uvědomte si, že pokud je pravděpodobnost, že takové DLL volána s více podprocesy programem, DLL bude nepodporuje více podprocesů spuštěných v DLL ve stejnou dobu může způsobit hlavní problémy. Pokud je pravděpodobnost, že DLL volána s více podprocesy programy, nezapomeňte propojit ji s knihovny podporující programů s více podprocesy (LIBCMT.LIB, CRTDLL.LIB nebo MSVCRT.LIB).

Vlastnosti

ID článku: 94248 - Poslední aktualizace: 30. srpna 2004 - Revize: 1.1
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Win32 Software Development Kit (SDK) 3.1
  • Microsoft Win32 Software Development Kit (SDK) 3.5
  • Microsoft Win32 Software Development Kit (SDK) 3.51
  • Microsoft Win32 Software Development Kit (SDK) 4.0
Klíčová slova: 
kbmt KB94248 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:94248

Dejte nám zpětnou vazbu