//CHAMADA DINAMICA A DLL -> INPOUT32.DLL

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>	//Necessário para: LoadLibrary(), GetProcAddress() e HINSTANCE.

//Declaração dos ponteiros para função.
typedef short _stdcall (*PtrInp)(short EndPorta);
typedef void _stdcall (*PtrOut)(short EndPorta, short valor);

int main(int argc, char *argv[])
{
    HINSTANCE hLib;	//Instância para a DLL inpout32.dll.
    PtrInp inportB;	//Instância para a função Imp32().
    PtrOut outportB;	//Instância para a função Out32().

    hLib = LoadLibrary("inpout32.dll");		//Carrega a DLL na memória.

    if(hLib == NULL)	//Verifica se houve erro.
    {
            printf("Erro. O arquivo inpout32.dll não foi encontrado.\n");
            printf("Eh necessario que o arquivo .dll esteja na mesma pasta deste programa!!\n"); 
            getch();
            return -1;
    }

    inportB = (PtrInp) GetProcAddress(hLib, "Inp32");	//Obtém o endereço da função Inp32 contida na DLL.

    if(inportB == NULL)		//Verifica se houve erro.
    {
            printf("Erro. A função Inp32 não foi encontrada.\n");
            getch();
            return -1;
    }

    outportB = (PtrOut) GetProcAddress(hLib, "Out32");	//Obtém o endereço da função Out32 contida na DLL.

    if(outportB == NULL)	//Verifica se houve erro.
    {
            printf("Erro. A função Out32 não foi encontrada.\n");
            getch();
            return -1;
    }
    FreeLibrary(hLib);		//Libera memória alocada pela DLL. Deve ser executado no fim do programa.   
}
