Článek nápad Mark E. Mech
Článek, jak uložit DLL do exe souboru programu Delphi jako prostředek, vysvětluje, jak dodávat DLL s spustitelným souborem aplikace Delphi jako prostředek.
Knihovny dynamických odkazů obsahují sdílený kód nebo prostředky, poskytují více aplikacím možnost sdílet jednu kopii rutiny (nebo zdroje), kterou mají společné.
Použitím soubory zdrojů (.RES), můžete do spustitelného souboru Delphi vložit (a používat) zvukové soubory, videoklipy, animace a obecně jakýkoli druh binárních souborů.
Načítání DLL z paměti
pokud lze DLL uloženou v RES použít bez předchozího uložení na souborový systém (pevný disk)
V souladu s článkem Načítání DLL z paměti od Joachima Baucha, je to možné.
Zde se Joachim dívá na problém: Výchozí funkce rozhraní API systému Windows pro načtení externích knihoven do programu (LoadLibrary, LoadLibraryEx) fungují pouze se soubory v souborovém systému. Je proto nemožné načíst DLL z paměti. Někdy však budete potřebovat přesně tuto funkci (např. Nechcete distribuovat mnoho souborů nebo nechcete rozkládat těžší). Obvyklá zástupná řešení pro tyto problémy jsou nejprve zapsat DLL do dočasného souboru a odtud ji importovat. Po ukončení programu bude dočasný soubor odstraněn.
Kód v uvedeném článku je C ++, dalším krokem bylo převedení na Delphi. Naštěstí to již udělal Martin Offenwanger (autor knihy DSPlayer).
Paměťový modul od Martina Offenwangera je rozšířená Delphi (a také Lazarus) kompatibilní verze C ++ Joachima Baucha Paměťový modul 0.0.1. Balíček zip obsahuje kompletní zdrojový kód Delphi MemoyModule (BTMemoryModule.pas). Kromě toho je zde Delphi a vzorek, který demonstruje, jak je používat.
Načítání DLL z prostředků z paměti
Pokud je demonstrační DLL uložena jako prostředek pomocí souboru RC:
DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
začít
-li 0 <> FindResource (hInstance, 'DemoDLL', RT_RCDATA) pak
začít
rs: = TResourceStream. Vytvořit (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Vytvořit;
Snaž se
slečna. LoadFromStream (rs);
slečna. Pozice: = 0;
m_DllDataSize: = ms. Velikost;
mp_DllData: = GetMemory (m_DllDataSize);
slečna. Číst (mp_DllData ^, m_DllDataSize);
Konečně
slečna. Volný, uvolnit;
rs. Volný, uvolnit;
konec;
konec;
konec;
var
btMM: PBTMemoryModule;
začít
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
Snaž se
pokud btMM = nulapak Přerušit;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
pokud @m_TestCallstd = nula, pak přeruší;
m_TestCallstd ('Toto je volání paměti Dll!');
až na
Showmessage ('Při načítání dll došlo k chybě:' + BTMemoryGetLastError);
konec;
-li Přiřazeno (btMM) pak BTMemoryFreeLibrary (btMM);
konec;
- Have / Create DLL
- Uložte DLL do souboru RES
- Mít Implementace BTMemoryModule.
- Popadněte DLL ze zdroje a načtěte jej přímo do paměti.
- K provedení procedury z knihovny DLL v paměti použijte metody BTMemoryModule.
BTMemoryLoadLibary v Delphi 2009, 2010,...
Před nějakou dobou jsem našel podobnou verzi souboru BTMemoryModule.pas a provedl jsem změny, takže to funguje (alespoň) s Delphi 2006, 2007 a 2009. Moje aktualizované BTMemoryModule.pas a ukázkový projekt jsou na BTMemoryLoadLibary pro Delphi> = 2009"