Carregar uma DLL de um recurso diretamente da memória

Ideia do artigo por Mark E. Musgo

O artigo como armazenar uma DLL dentro de um arquivo exe do programa Delphi como um recurso explica como enviar uma DLL com o arquivo executável do aplicativo Delphi como um recurso.

Bibliotecas de links dinâmicos contenham código ou recursos compartilháveis, eles fornecem a capacidade de vários aplicativos compartilharem uma única cópia de uma rotina (ou recurso) que eles têm em comum.

Usando arquivos de recurso (.RES), você pode incorporar (e usar) arquivos de som, videoclipes, animações e, geralmente, qualquer tipo de arquivo binário em um executável em Delphi.

Carregando DLLs da memória

se uma DLL armazenada em um RES puder ser usada sem primeiro salvá-la no sistema de arquivos (disco rígido)

De acordo com o artigo Carregando uma DLL da memória por Joachim Bauch, isso é possível.

Veja como Joachim olha para o problema: A API padrão do Windows funciona para carregar bibliotecas externas em um programa (LoadLibrary, LoadLibraryEx) só funciona com arquivos no sistema de arquivos. Portanto, é impossível carregar uma DLL da memória. Mas, às vezes, você precisa exatamente dessa funcionalidade (por exemplo, não deseja distribuir muitos arquivos ou dificulta a desmontagem). As soluções comuns para esses problemas são gravar a DLL em um arquivo temporário primeiro e importá-la de lá. Quando o programa termina, o arquivo temporário é excluído.

instagram viewer

O código no artigo mencionado é C ++, o próximo passo foi convertê-lo para Delphi. Felizmente, isso já foi feito por Martin Offenwanger (o autor de DSPlayer).

Módulo de memória de Martin Offenwanger é uma versão compatível com Delphi (e também com Lazarus) do C ++ de Joachim Bauch Módulo de memória 0.0.1. O pacote zip inclui o código fonte Delphi completo do MemoyModule (BTMemoryModule.pas). Além disso, há um Delphi e uma amostra incluídos para demonstrar como usá-lo.

Carregando DLLs de recursos da memória

Se uma DLL de demonstração estiver armazenada como um recurso usando o arquivo RC:

DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
início
E se 0 <> FindResource (hInstance, 'DemoDLL', RT_RCDATA) então
início
rs: = TResourceStream. Criar (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Crio;
experimentar
Senhora. LoadFromStream (rs);
Senhora. Posição: = 0;
m_DllDataSize: = ms. Tamanho;
mp_DllData: = GetMemory (m_DllDataSize);
Senhora. Leia (mp_DllData ^, m_DllDataSize);
finalmente
Senhora. Livre;
rs. Livre;
fim;
fim;
fim;
var
btMM: PBTMemoryModule;
início
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
experimentar
se btMM = nadaentão Abortar;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
if @m_TestCallstd = nil então Abort;
m_TestCallstd ('Esta é uma chamada de memória DLL!');
exceto
Showmessage ('Ocorreu um erro ao carregar a dll:' + BTMemoryGetLastError);
fim;
E se Atribuído (btMM) então BTMemoryFreeLibrary (btMM);
fim;
  1. Ter / criar uma DLL
  2. Armazene a DLL em um arquivo RES
  3. Ter Implementação do BTMemoryModule.
  4. Pegue a DLL do recurso e carregue-a diretamente na memória.
  5. Use os métodos BTMemoryModule para executar o procedimento da DLL na memória.

BTMemoryLoadLibary em Delphi 2009, 2010,...

"O BTMemoryModule.pas vinculado não funciona com o Delphi 2009 (e eu assumiria o Delphi 2010 também).
Encontrei uma versão semelhante do arquivo BTMemoryModule.pas há um tempo atrás e fiz alterações para que funcionem com (pelo menos) o Delphi 2006, 2007 e 2009. Meu BTMemoryModule.pas atualizado e um projeto de amostra estão em BTMemoryLoadLibary para Delphi> = 2009"
instagram story viewer