Jump to content
Fórum Script Brasil
  • 0

Criar/rodar Dll - Dev-c++


Rafael Pacheco

Question

Criando uma DLL no DEV-C++:

Primeiramente, crie um projeto do tipo DLL, e escolha o tipo de arquivo CPP, salve o projeto em uma pasta, com o nome mydll.dev

(aqui está um problema, arquivos .c não funcionam com o comando extern, que veremos a seguir, porem, voce pode criar um CPP e fazer as funções em C sem nenhum problema)

Remova do projeto os 2 arquivos que são criados com o projeto

Criação do Header: Vamos chamar de mydll.h, e adicione ao projeto (menu Project/New file ou Add to Project)

(preste atenção nos nomes que voce vai dar aos seus arquivos)

nesse header vão os prototipos das funções que serão implementadas no mydll.cpp

exemplo do codigo:

mydll.h

#ifndef _MYDLL_H_
#define _MYDLL_H_

#include <stdio.h>

extern "C" __declspec(dllexport) void MinhaFuncao();

#endif

explicações:

#ifndef _MYDLL_H_

#define _MYDLL_H_

- eles representam o nome do header, exemplo: _TESTE_H_ para um header teste.h

#include <stdio.h>

- include da lib stdio.h, que será usada na mydll.cpp

extern "C" __declspec(dllexport) void MinhaFuncao();

- protitipo da função MinhaFuncao() que será implementada na mydll.cpp

-- extern "C" (se eu não me engano) mantem o nome da função intacta apos a compilação (teste sem esse extern "C" no final do tutorial, e verá que o executavel da erro)

-- __declspec(dllexport) não lembro pra que que serve

-- void MinhaFuncao(); tipo e nome da função;

obs: pra cada função que você deseja ter acesso na dll, deve ser colocada desse jeito, nesse tutorial será usada apenas uma função.

obs: se sua dll tiver classes (C++) e forem utilizadas por outra aplicação, também devem ser declaradas, procure por outros tutoriais de dll que alguns tem exemplos com classes nos prototipos

Fim do arquivo header, agora vamos criar o mydll.cpp, que contém as funções implementadas

crie ou adicione um mydll.cpp no projeto, e veja o codigo de exemplo

mydll.cpp

#include "mydll.h"

extern "C" __declspec(dllexport) void MinhaFuncao() {

... comandos1

... comandos2 ...

}

explicações:

#include "mydll.h"

- inclui o header da dll

extern "C" __declspec(dllexport) void MinhaFuncao()....

- declaração da função e sua implementação

Pronto, sua DLL está pronta, agora clique no menu Execute/Compile ou Ctrl+F9, e sua dll será criada na sua pasta do projeto, com o nome do arquivo do projeto (mydll.dll)

A parte de criação da dll está concluida, vamos fazer a aplicação e rodar ela? vamos!!! :lol:

Feche seu projeto, e crie um novo de acordo com sua necessidade, (console application, gtk+ application.... etc)

no exemplo será utilizado Console Application, segue o codigo:

main.c (repare que agora não tem problema em ser um arquivo .c ou .cpp)

#include <stdio.h>

#include <conio.h>

#include <windows.h>

typedef void (WINAPI*cfunc)();

cfunc FuncaoTemp;

int main() {

HINSTANCE hLib=LoadLibrary("mydll.dll");

if (!hLib) { printf("error"); return 0; }

FuncaoTemp=(cfunc)GetProcAddress((HMODULE)hLib, "MinhaFuncao");

FuncaoTemp();

FreeLibrary((HMODULE)hLib);

getch();

}

explicações:

#include...

- alguns includes necessarios para sua aplicação, e a lib windows.h, que irá acessar a dll criada

typedef void (WINAPI*cfunc)();

- define o tipo cfunc

cfunc FuncaoTemp;

- cria a variavel FuncaoTemp do tipo cfunc, ela irá receber a função que voce criou na dll (MinhaFuncao), como se ela aprendesse o que a MinhaFuncao faz...

HINSTANCE hLib=LoadLibrary("mydll.dll");

- carrega a dll na variavel hLib, retorna NULL em caso de erro (nesse caso, mydll.dll está no mesmo diretorio da aplicação main.c)

FuncaoTemp=(cfunc)GetProcAddress((HMODULE)hLib, "MinhaFuncao");

- atribui à FuncaoTemp a função MinhaFuncao da dll

FuncaoTemp();

- executa a função

FreeLibrary((HMODULE)hLib);

- libera da memoria a dll

compile, e pronto

você agora pode alterar os comandos da dll e acessa-la na aplicação, sem a necessidade de recompilar a aplicação

com isso sua aplicação carrega dinamicamente uma dll

espero que tenha ajudado, qualquer duvida, pergunte B)

Edited by Rafael Pacheco
Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0

só uma duvida, chamada e a criação de dll´s (run-time e load-time...) é um padrão para todos os compiladores (a exemplo turbo c++) ou seu funcionamento se dá somente alguns deles (visualc++, devc++,...)????

Edited by darkfox
Link to comment
Share on other sites

  • 0

Um bom tutorial!

-- extern "C" (se eu não me engano) mantem o nome da função intacta apos a compilação (teste sem esse extern "C" no final do tutorial, e verá que o executavel da erro)
Compiladores C, após fazerem a compilação, mantêm os nomes das funções intactas. Porém, compiladores C++ não (isso é preciso, para fazer adaptação de funcionamento na estrutura interna do compilador, eu acho). Ah! Isso é chamado de convenções de linkedição. Atualmente, os valores aceitos por "extern" são:

-> "C" : nomenclatura de funções C

-> "C++" : nomenclatura de funções C++

Lembrando que: os dizeres, presente aqui, são válidos apenas para C++. Em C, até onde eu saiba, a palavra-chave "extern" server apenas para referenciar variáveis/funções externas (globais) a um determinado escopo.

-- __declspec(dllexport) não lembro pra que que serve

Indica para o compilador tornar visível essa função/classe, ou seja, cria uma interface, onde, uma DLL ou um programa, possa usá-lo posteriormente. Se eu não me engano, isso até acaba com o problema da chata utilização de lib (.a) ou código-objeto (.o) para reaproveitação de código.

só uma duvida, chamada e a criação de dll´s (run-time e load-time...) é um padrão para todos os compiladores (a exemplo turbo c++) ou seu funcionamento se dá somente alguns deles (visualc++, devc++,...)????
Na verdade, o Rafael usou um recurso interessante: carregamento dinâmico, feito através de algumas funções da API do Windows (inclusive, muitas dessas funções, estão na declaradas biblioteca Windows.h). Isso fará o seguinte: carregará a DLL na memória, usará a função requerida e descarregará a DLL da memória. Muito interessante, pois, caso você mande seu compilador fazer uma referência para a DLL requerida, no momento da compilação, isso fará com que seu programa carregue a DLL, antes do iniciamento dele mesmo, e, só descarregará a DLL, após o término do seu programa, ou seja, olha a melhoria de performance obtida, apesar do aumento da complexidade e a perda de portabilidade de código-fonte para outras plataformas como, Linux, por exemplo (no caso, você teria que descobrir alguma função da API do Linux para o equivalente feito).

Falows!

P.S: Rafael, me desculpe, por não te respondido sua pergunta, no meu artigo sobre DLL's. Não tive tempo, só respondi hoje, pois estive afastado do fórum.

Compiladores C, após fazerem a compilação, mantêm os nomes das funções intactas. Porém, compiladores C++ não (isso é preciso, para fazer adaptação de funcionamento na estrutura interna do compilador, eu acho). Ah! Isso é chamado de convenções de linkedição.

http://en.wikipedia.org/wiki/Name_mangling

Uma explicação melhor sobre o que eu disse (em inglês). Resumindo, é uma técnica usada para obtenção de nomes únicos para identificadores. Essa técnica é usada em linguagens modernas, principalmente, se suportam O.O . Por exemplo:

class A
{
void A() { return; }
void A(int a) { return; }
};

Como o compilador vai distinguir um método de outro? Pois, temos nomes (identificadores) iguais! Se eu não me engano (li muito pouco, pois além de não saber muito inglês, to "pingando" de sono), na codificação feita, ele guardará outros dados como, por exemplo, o número de parâmetros.

Falows! Espero que leiam!

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.


  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.9k
×
×
  • Create New...