1. Inicie seu primeiro projeto de DLL
1.File-> Fechar tudo-> arquivo-> novo [dll >
Código : |
// gerar código automaticamente como segue Projeto da biblioteca2; // Isso não faz sentido. usos Sysutils, Classes; {$ R *.res} Começar fim. |
2. Adicione um func para entrar:
Código : |
Projeto da biblioteca2; usos Sysutils, Classes; Função mymax (x, y: inteiro): inteiro; Começar Se x> y então Resultados: = x outro Resultados: = y; fim ; // Lembre-se: o nome da biblioteca não importa, mas o caso da DLL-FUNC está relacionado. // escrever mymax no nome dll-func é diferente do mymax. Se estiver escrito errado, imediatamente // O resultado é que você pede que o AP que use essa DLL não possa ser aberto. // O caso superior e inferior dos parâmetros está ok. Nem precisa ter o mesmo nome. Se o protótipo for (x, y: inteiro) // Escreva como (a, b: inteiro) no tempo, tudo bem. // Lembre -se: adicione outro stdcall. O livro diz que se você estiver escrevendo DLLs usando Delphi, e espero não apenas // Se Delphi-AP também espera usar BCB/VC-AP, etc., é melhor adicionar um stdcall; // Padrão de parâmetro: Delphi tem muitos padrões variáveis, que obviamente não são como DLL //, a língua nativa do Windows/DLL deve ser C. Então, se quisermos passar e sair dos parâmetros da DLL, nós // Use o máximo possível de acordo com as regras. Se você escrever esses dois, o último será muito problema. Se você não está familiarizado com C // Se estiver bem. Falaremos sobre isso mais tarde. {$ R *.res} Começar fim. |
3. Envie essas funções compartilháveis para fora da DLL e deixe o mundo exterior (é o seu Delphi-AP): Guangan.
Portanto, seu AP não pode usá -los, você precisa adicionar exportações.
Código : |
{$ R *.res} exportações Mymax; Começar fim. |
4. Ok, você pode pressionar Ctrl-F9 para compilar. Não pressione F9 neste momento. A DLL não é exe┌ que não pode ser executada separadamente. Se a DLL tiver um erro neste momento, corrija -o. Pressione Ctrl-F9 novamente. O aviso pode estar lá neste momento, não importa, apenas estude e dê uma olhada. Pressione Ctrl-F9 novamente e depois "feito, compilado". Haverá um *.dll no mesmo diretório. Parabéns, a tarefa é realizada.
2. Realize um teste: Abra um novo aplicativo:
1. Adicione um Tbutton
Código : |
ShowMessage (inttostr (mymax (30,50))); |
2. Diga a exe para ir lá para pegar uma func
Código : |
// Adicionar à forma, interface, var Função mymax (x, y: número inteiro): inteiro; // mytestdll.dll escreve o nome do projeto DLL para você antes // Não importa se o nome da DLL é superior e inferior. Mas lembre -se de adicionar extensão .dll. Em Win95 ou NT, // Não há necessidade de adicionar extensão, mas esses dois OSS podem ser cada vez menores. Você precisa adicionar extensão. |
Ok, é simples.
O exemplo acima é muito simples? Amigos familiarizados com Delphi podem ver que o código acima é basicamente o mesmo que escrever um programa geral Delphi, exceto que existe um parâmetro stdcall adicional após a função Testdll e a função TestDLL é declarada usando a instrução EXPORTS. Basta compilar o código acima e você pode obter uma biblioteca de link dinâmica chamada delphi.dll. Agora, vamos ver o que precisa de atenção. 1. Todas as funções ou procedimentos gravados na DLL devem ser adicionados aos parâmetros de chamada StdCall. No ambiente Delphi 1 ou Delphi 2, o parâmetro de chamada está longe. Após o Delphi 3, esse parâmetro foi alterado para StdCall, com o objetivo de usar a tecnologia padrão de transferência de parâmetros Win32 em vez dos parâmetros de registro otimizados. Esqueceu -se de usar o parâmetro stdcall é um erro comum. O motivo é que o parâmetro de registro é o parâmetro padrão do Delphi.
2. As funções e procedimentos escritos devem ser declarados como funções externas usando a declaração de exportação.
Como você pode ver, a função TestDLL é declarada como uma função externa. Isso permite que a função seja vista externamente. (Se não houver opção de visualização rápida, você poderá instalá -la em um CD do Windows.) A função TestDll aparece na barra de tabela de exportação. Outra boa razão é que, se não declararmos dessa maneira, as funções que escrevemos não serão chamadas, o que é algo que ninguém quer ver.
3. Quando parâmetros e variáveis de tipo de sequência longa são usados, o Sharemem deve ser referenciado.
O tipo de string em Delphi é muito poderoso. (Sim, você lê certo, são de fato dois megabytes.) Neste momento, se você insistir em usar um parâmetro de tipo de string, variável ou mesmo informações de gravação, você deve consultar a unidade Sharemem e deve ser a primeira referência . É a primeira unidade referenciada após a instrução USESS. Conforme mostrado no exemplo a seguir:
usos
Sharemem,
Sysutils,
Classes;
Outro ponto é que a mesma coisa deve ser feita no seu arquivo de projeto (*.dpr) em vez do arquivo da unidade (*.PAs). Se você não fizer isso, provavelmente pagará um acidente. A maneira de evitar o uso do tipo String é declarar parâmetros, variáveis, etc. do tipo de string como PChar ou ShortString (como: S: String [10]) Tipo. O mesmo problema ocorre quando você usa matrizes dinâmicas, a solução é descrita acima.
Capítulo 3: Chamada estática para DLL Top em Delphi
Chamar uma DLL é mais fácil do que escrever uma DLL. Primeiro, apresentarei o método de chamada estática para você. Da mesma forma, vamos primeiro dar um exemplo de chamadas estáticas.
unidade de unidade1;
interface
usos
Janelas, mensagens, sysutils, aulas, gráficos,
Controles, formulários, diálogos, stdctrls;
tipo
Tform1 = classe (tform)
Edit1: TEDIT;
Button1: tbutton;
Procedimento Button1Click (remetente: Tobject);
Privado
{Declarações privadas}
público
{Declarações públicas}
fim;
var
Form1: TForm1;
Implementação
{$ R *.dfm}
// O código a seguir nesta linha é o código que realmente escrevemos
função testdll (i: inteiro): inteiro; stdcall;
'Delphi.dll' externo;
procedimento TForm1.Button1Click (remetente: TOBJECT);
Começar
Edit1.text: = inttostr (testdll (1));
fim;
fim.
No exemplo acima, colocamos uma caixa de edição (editar) e um botão no formulário e escrevemos muito pouco código para testar o Delphi.dll que acabamos de escrever. Você pode ver que o único trabalho que fazemos é colocar a descrição parte da função TestDLL na implementação e especificar o local do Delphi.dll com a instrução externa. (Neste exemplo, o programa de chamadas e Delphi.dll estão no mesmo diretório.) É emocionante que a função TestDLL que escrevemos foi rapidamente reconhecida por Delphi. Você pode fazer um experimento como este: digite "testdll (", e em breve Delphi usará a barra de prontuária voador para solicitar quais parâmetros você deve inserir, tão simples quanto usar outras funções definidas em Delphi. Notas incluem
Próximo:
1. Use StdCall para chamar parâmetros.
Como mencionado acima, ao se referir a funções e procedimentos na DLL, você também deve usar o parâmetro stdcall, pelo mesmo motivo mencionado acima.
2. Use a instrução externa para especificar o caminho e o nome do arquivo DLL chamado.
Como você pode ver, especificamos o nome do arquivo DLL a ser chamado na instrução externa. Não há caminho de gravação porque o arquivo DLL e o programa principal que o chamam estão no mesmo diretório. Se o arquivo DLL estiver em c:/, podemos escrever a declaração de referência acima como 'c: /delphi.dll' externa. Observe que o sufixo do arquivo.dll deve ser escrito.
3. As variáveis globais não podem ser chamadas da DLL.
Se declararmos algum tipo de variável global na DLL, como: var s: byte. Dessa forma, as variáveis globais S podem ser usadas normalmente na DLL, mas S não pode ser usado pelo programa de chamada e S não pode ser aprovado como uma variável global para o programa de chamada. No entanto, as variáveis declaradas no programa de chamada podem ser passadas como parâmetros para a DLL.
4. A DLL chamada deve existir.
Isso é importante. Ao usar um método de chamada estática, é necessário que o arquivo DLL seja chamado, a função ou procedimento a ser chamado etc. deve existir. Se o caminho especificado e o nome do arquivo não existirem ou o caminho e o nome do arquivo especificados estiverem incorretos, o sistema solicitará "um erro ocorreu ao iniciar o programa" ou "não encontrado *.dll Arquivo" ao executar o programa principal.
CAPÍTULO 4 DLL DINAMENTicamente chamando Top em Delphi
A chamada DLLs dinamicamente é relativamente complicada, mas muito flexível. Para ilustrar completamente o problema, desta vez damos um exemplo de chamar uma DLL escrita em C ++. Primeiro, compila o seguinte programa de origem DLL em C ++.
#include
extern "c" _declspec (dllexport)
int winapi testc (int i)
{
retornar i;
}
Após a compilação, um arquivo DLL é gerado. Por uma questão de conveniência, ainda nos referimos ao programa de chamada acima, mas substituímos a instrução original no processo Button1Click pelo código a seguir.
procedimento TForm1.Button1Click (remetente: TOBJECT);
tipo
Tintfunc = função (i: inteiro): inteiro; stdcall;
var
TH: THANDLE;
Tf: tintfunc;
TP: TFARPROC;
Começar
Th: = loadlibrary ('cpp.dll');
Se th> 0 então
tentar
Tp: = getProcaddress (th, pchar ('testc'));
Se tp <> nil
Então comece
Tf: = tintfunc (tp);
Edit1.text: = inttostr (tf (1));
fim
outro
ShowMessage ('função testc não encontrada');
Finalmente
Freelibrary (Th);
fim
outro
ShowMessage ('cpp.dll não encontrado');
fim;
Como você já viu, essa técnica de chamada dinâmica é muito complicada, mas desde que você modifique os parâmetros, como modificar o nome da DLL no loadlibrary ('cpp.dll') para ser 'delphi.dll', você pode alterar dinamicamente o chamado dll.
1. Defina o tipo de função ou procedimento a ser chamado.
No código acima, definimos um tipo TINTFUNC, que corresponde à função TESTC que vamos ligar. O mesmo trabalho de definição deve ser feito em outras chamadas. E também adicione os parâmetros de chamada StdCall.
2. Libere a DLL chamada.
Chamamos uma DLL dinamicamente com a LOADLIBRARY, mas lembre -se de que você deve liberar manualmente a DLL com a Freelibrary após o uso; caso contrário, a DLL pegará memória até você sair do Windows ou desligar.
Agora, vamos avaliar as vantagens e desvantagens dos dois métodos de chamada de DLL. O método estático é simples de implementar, fácil de dominar e geralmente um pouco mais rápido e é mais seguro e confiável; Para executar até que a DLL seja lançada apenas no final do programa, e apenas sistemas baseados em compiladores, como a Delphi, podem usar esse método. Métodos dinâmicos resolvem melhor as deficiências nos métodos estáticos e podem acessar facilmente funções e procedimentos nas DLLs e até mesmo funções ou procedimentos adicionados em algumas versões antigas de DLLs; Função ou procedimento precisa definir muitos tipos complexos e métodos de chamada. Para iniciantes, o autor recomenda que você use métodos estáticos e, em seguida, use métodos de chamada dinâmica após a proficiência.
Capítulo 5 Dicas práticas para usar o TOP DLL
1. Habilidades de escrita.
1. Para garantir a correção da DLL, você pode primeiro escrevê -lo como parte de um aplicativo comum, depurar -o corretamente e separá -lo do programa principal e compilá -lo em DLL.
2. Para garantir a universalidade da DLL, você deve impedir que os nomes dos controles visuais apareçam na DLL que você escreveu, como: Nome Edit1 em Edit1.text; algum registro.
3. Para facilitar a depuração, cada função e processo devem ser o mais curta e concisa possível e devem ser acompanhados por anotações específicas e detalhadas.
4. Try-Finally deve ser usado para lidar com possíveis erros e exceções.
5. Referência o mínimo de unidades possível para reduzir o tamanho da DLL, especialmente não se refere a unidades visuais, como unidades de diálogo. Por exemplo, em geral, não podemos fazer referência a unidades de classes, o que pode reduzir a DLL compilada em cerca de 16kb.
2. Habilidades de chamadas.
1. Ao usar métodos estáticos, você pode renomear a função ou procedimento chamado. No exemplo da DLL escrito em C ++ mencionado acima, se a instrução "C" externa for removida, o C ++ compilará alguns nomes de funções estranhos e a função TESTC original será nomeada @testc $ s e outros nomes estranhos ridículos. Usa a tecnologia de mangueira de nome C ++. Este nome de função é ilegal em Delphi, podemos resolver esse problema como este:
Reescrever a função de referência como
função testc (i: número inteiro): número inteiro; stdcall;
'cpp.dll' externo; nome '@testc $ s';
A função do nome é renomear.
2. Você pode colocar as DLLs que escrevemos no diretório do Windows ou no diretório Windows/System. Fazer isso pode escrever apenas o nome da DLL sem escrever o caminho na declaração externa ou na instrução de biblioteca de carga. Mas é um pouco inapropriado fazer isso. Coloque as DLLs em que você escreveu no diretório do sistema!
3. Habilidades de depuração.
1. Sabemos que a DLL não pode ser executada e depurada passo a passo ao escrever. Existe uma maneira de fazer isso, ou seja, configurar um programa de host no menu Run | Parâmetros. Adicione o nome do programa host à barra de aplicativos host da página local para executar depuração passo a passo, observação e corrida do ponto de interrupção.
2. Adicione informações da versão DLL. As observações de abertura mencionaram que as informações da versão são muito importantes para o DLLs. Vale a pena adicionar um pouco de espaço. Infelizmente, não é possível usar a opção de versão no menu de opções do projeto | Conforme mostrado no exemplo a seguir:
Biblioteca Delphi;
usos
Sysutils,
Classes;
{$ R *.res}
// Observe que a linha de código acima deve ser adicionada nesta posição
função testdll (i: inteiro): inteiro; stdcall;
Começar
Resultados: = i;
fim;
exportações
Testdll;
Começar
fim.
3. Para evitar duplicar os nomes com outras DLLs, é melhor usar uma mistura de caracteres, números e sublinhados ao nomear as DLLs que você escreve. Por exemplo: jl_try16.dll.
4. Se você já compilou algumas DLLs em Delphi 1 ou Delphi 2, a DLL que você compilou é de 16 bits. Basta recompilar o código-fonte no novo ambiente Delphi 3 ou Delphi 4 e você pode obter uma DLL de 32 bits.
[Após a nota]: Além dos métodos mais usados para usar DLLs introduzidos acima, as DLLs também podem ser usadas como portadores de recursos. Por exemplo, alteração de ícones no Windows é o recurso na DLL usada. Além disso, ter dominado a tecnologia de design de DLL tem muitos benefícios para usar a programação mais avançada de OLE, COM e ActiveX.