quarta-feira, abril 04, 2007

Instânciando Dll´s com Borland C++ Builder

E diretamente da aula de Modelagem e Simulação temos essa nova dica:

Para exemplificar, utilizaremos uma dll especifica para manipulação de porta paralela no windows 2000/XP, os quais bloqueam acesso direto por endereçamento por questões de segurança.

Inclua a Dll no seu diretorio onde encontra-se o codigo fonte e seu arquivo ja compilado.

instancie a dll dentro de seu codigo fonte. isso pode ser feito como abaixo:

/* prototipos (funçao typedef) para os métodos contidas na DLL: */
/* consultar a dll utilizada para verificar os metodos ali contidos*/

#include "windows.h"

typedef short (_stdcall *inpfuncPtr)(short portaddr);
typedef void (_stdcall *oupfuncPtr)(short portaddr, short datum);


no seu metodo principal (main) declaramos as seguintes variaveis:

HINSTANCE hLib;
inpfuncPtr inp32;
oupfuncPtr oup32;
onde hLib é a variável a qual apontara para o endereço da Dll.
e inp32 e oup32 são variaveis para o tipo de dado para ser escrito via dll.

Carregue a dll

/* carregando a lib */
hLib = LoadLibrary("inpout32.dll");

if (hLib == NULL) { //se falhar volta erro
cout<<"LoadLibrary Failed";


Obtenha os endereços dos metodos contidos na dll

/* Obtendo endereço da funçao INP32 - Leitura Porta */
inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");

if (inp32 == NULL) { //se falhar retorna erro em tela
cout<<"GetProcAddress for Inp32 Failed";


   /* Obtendo endereço da funçao OUP32 - Escrita Porta */
oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");

if (oup32 == NULL) {
cout<<"GetProcAddress for Oup32 Failed";


ao final da execução deste código teremos 2 métodos criados e linkados junto a dll
pronto para ser usado em codigo normal.

Veja exemplo:


short Input (short porta) {
return (inp32)(porta);
}

void Output(short porta, short data) {
(oup32)(porta,data);
}

3 comentários:

Anônimo disse...

fazar coisas complexas ficar
simples , e coisa de genio...
um milhao de parabens..graças a deus que voce existe.

João Paulo disse...

eu ainda naõ consegui fazer isso funcionar.
minha duvida é tenho uma função em minha dll int teste(string tamanho) e irei chamar ela na criação de uma outra dll que estou projetando. como fazer isso?

Anônimo disse...

Ótimas dicas, funcionou perfeiamente!!