Ir para conteúdo
Faça parte da equipe! (2024) ×

Trabalhando com C e C++


rap_
 Compartilhar

Posts Recomendados

LINGUANGEM C C++ (USANDO BIBLIOTECAS DE LIGAÇÃO DINÂNMICA ---DLL---)

By: RaP_

 

 

---Class View

A funcionalidade “Class View†do Visual C++ Ãĩ um interessante diferencial desse produto. A idÃĩia Ãĩ

“enxergar†um projeto de um programa C++ a partir da descriÃĤÃģo de suas classes, mais que pela

descriÃĤÃģo de seus arquivos (o que corresponde a “File Viewâ€ÂÂ).

Há inÃļmeras funcionalidades de navegaÃĤÃģo no código C++ a partir da funcionalidade do Class View.

Por exemplo: clicando-se num mÃĩtodo de uma classe, automaticamente o editor Ãĩ aberto e o cursor

posicionado na classe em questÃģo.

“C / C++ e OrientaÃĤÃģo a Objetos em Ambiente Multiplataformaâ€ÂÂ, versÃģo 5.1

__

classes

mÃĩtodos

de uma classe

--- Usando bibliotecas de ligaÃĤÃģo dinÃĢmica (DLL)

Uma biblioteca de ligaÃĤÃģo dinÃĢmica (“Dynamic Link Library - DLLâ€ÂÂ) Ãĩ uma biblioteca que será ligada

ao programa executável em tempo de execuÃĤÃģo. Para fazer uma dll, a primeira coisa a fazer Ãĩ um

projeto novo, em que se escolhe “Wind32 Dynamic-Link Libraryâ€ÂÂ, como mostrado na figura. A dll

deve ter um nome (no caso “mydllâ€ÂÂ, e pertencer a algum workspace). No wizard, escolha “An empty

DLL projectâ€ÂÂ.

Abaixo pode-se ver um exemplo de dll. Nesse exemplo, a biblioteca contÃĩm 3 funÃĤÃĵes globais. Uma Ãĩ

dllTest, outra Ãĩ plus_1, e a terceira Ãĩ plus_2. A dllTest apenas coloca uma constante string no

console. As outras duas, recebem um inteiro como parÃĢmetro e retornam um inteiro (somando 1 e 2

respectivamente). SÃģo funÃĤÃĵes simples de teste, Ãļteis para um tutorial.

“C / C++ e OrientaÃĤÃģo a Objetos em Ambiente Multiplataformaâ€ÂÂ, versÃģo 5.1

No arquivo mydll.cpp, escreve-se o corpo da dll, acrescentando-se a macro WINAPI ao protótipo da

funÃĤÃģo. As regras de compilaÃĤÃģo da dll sÃģo as mesma de qualquer arquivo cpp.

///////////////////////////////////////////////////////

// mydll.cpp

#include <iostream.h>

#include "mydll.h"

void WINAPI dllTest() {

cout << "You're inside a Dll" << endl;

}

int WINAPI plus_1(int i) {

return i+1;

}

int WINAPI plus_2(int i) {

return i+2;

}

No arquivo mydll.h, coloca-se apenas os protótipos das funÃĤÃĵes globais da dll, acrescentando-se a

mesma macro WNAPI. Uma outra macro _MYDLL_H_ controla a possibilidade de inclusÃģo mÃļltipla

do header mydll.h.

///////////////////////////////////////////////////////

// mydll.h

#if !defined(_MYDLL_H_)

#define _MYDLL_H_

#include <afxwin.h>

// place the prototypes of dll functions

void WINAPI dllTest();

int WINAPI plus_1(int i);

int WINAPI plus_2(int i);

#endif // _MYDLL_H_

AlÃĩm do cpp e do header, Ãĩ preciso que exista um arquivo texto de definiÃĤÃģo. No caso esse arquivo Ãĩ

mydll.def. O modelo abaixo mostra como fazer esse arquivo. AlÃĩm do nome e descriÃĤÃģo, Ãĩ preciso que

se faÃĤa uma lista dos identificadores a serem exportados (no caso o nome das 3 funÃĤÃĵes globais). Para

“C / C++ e OrientaÃĤÃģo a Objetos em Ambiente Multiplataformaâ€ÂÂ, versÃģo 5.1

__

criar o arquivo def, basta escolher no menu “File-New†e no tab “files†escolher o nome com

terminaÃĤÃģo *.def.

O arquivo mydll.def aparece no projeto, como se fosse um arquivo *.cpp.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; mydll.def : Declares the module parameters for the DLL.

LIBRARY "mydll"

DESCRIPTION 'MyDll Windows Dynamic Link Library'

EXPORTS

; Explicit exports can go here

dllTest @1

plus_1 @2

plus_2 @3

Para usar a dll, Ãĩ preciso fazer a seguinte seqüÃĻncia de operaÃĤÃĵes. Em primeiro lugar Ãĩ preciso carregar

a dll. Isso Ãĩ feito com a funÃĤÃģo LoadLibrary. Essa operaÃĤÃģo pode falhar (como a abertura de um

arquivo). Portanto, um programa bem feito deverá tratar a possibilidade de o carregamento da dll

falhar.

O programa deve ter variáveis tipo “ponteiro para funÃĤÃģoâ€ÂÂ, para receber as funÃĤÃĵes da dll. Para usar as

funÃĤÃĵes, a segunda coisa a fazer Ãĩ ligar os ponteiros para funÃĤÃģo locais com as funÃĤÃĵes na dll. Isso Ãĩ

feito com a funÃĤÃģo GetProcAddress. Novamente, essa operaÃĤÃģo pode falhar e um programa bem feito

“C / C++ e OrientaÃĤÃģo a Objetos em Ambiente Multiplataformaâ€ÂÂ, versÃģo 5.1

__

deve tratar a possibilidade de falha. Repare que o retorno da funÃĤÃģo GetProcAddress deve ser

maquiado (type cast) para ser compatível com a variável local tipo “ponteiro para funÃĤÃģoâ€ÂÂ.

Com os ponteiros para funÃĤÃģo carregados, basta usa-los como se fossem funÃĤÃĵes do próprio programa.

Note que como o carregamento da dll Ãĩ feito em tempo de execuÃĤÃģo, seria bastante simples que

alguma lógica escolhesse carregar uma ou outra dll equivalente. Por exemplo: a dll poderia conter

mensagens ou recursos, em que as frases seriam escritas em um determinado idioma. Assim um

software poderia ser internacionalizado apenas por escrever uma nova dll (e fazer o programa

principal encontrar essa dll, o que seria feito na instalaÃĤÃģo do programa).

Para conseguir ligar (linkar) o usedll.cpp, Ãĩ preciso acrescentar a biblioteca “nafxcwd.libâ€ÂÂ. No caso desse exemplo, foi feito um novo projeto, tipo “win32 console

applicationâ€ÂÂ, chamado usedll. Portanto, considerando que as saídas dos projetos ficam no diretório

“Debugâ€ÂÂ, ou “Releaseâ€ÂÂ, a forma de apontar a dll a partir do projeto usedll Ãĩ a string

"....mydllDebugmydll.dll". Uma dll pode ser executada sob debug tanto quanto um programa

normal, desde que tenha sido compilada para debug. TambÃĩm como um programa ou biblioteca

normal, caso nÃģo haja interesse de debug (e.g. entregando o arquivo para um cliente), Ãĩ recomendável

compilar como Release.

///////////////////////////////////////////////////////

// usedll.cpp (mydll.dll)

// use_dll.cpp

#include <iostream.h>

#include <afxwin.h>

void main() {

HINSTANCE hDll; // dll handler

hDll = LoadLibrary("....mydllDebugmydll.dll"); // load dll

// handle error while loading dll handler

if (!hDll) {

cout << "Error while loading DLL handler" << endl;

exit(1);

}

// function pointers equivalent to dll functions

void (WINAPI * c_dllTest)();

int (WINAPI *c_plus_1)(int);

int (WINAPI *c_plus_2)(int);

// link function pointers to dll functions

c_dllTest = (void (WINAPI *)())GetProcAddress(hDll, "dllTest");

c_plus_1 = (int (WINAPI *)(int))GetProcAddress(hDll, "plus_1");

c_plus_2 = (int (WINAPI *)(int))GetProcAddress(hDll, "plus_2");

// handle error while loading functions

if(!c_dllTest || !c_plus_1 || !c_plus_2) {

cout << "Error while loading functions from DLL" << endl;

exit(1);

}

// now, use the functions freely

c_dllTest();

cout << "3+1=" << c_plus_1(3) << endl;

cout << "5+2=" << c_plus_2(5) << endl;

}

Saída do programa:

You're inside a Dll

3+1=4

5+2=7

“C / C++ e OrientaÃĤÃģo a Objetos em Ambiente Multiplataformaâ€ÂÂ, versÃģo 5.1

 

__

--- DLL para Windows

Tipos de dll com Visual C para Windows - Projeto “MFC AppWizard (dll)â€ÂÂ.

1. Regular DLL with MFC static linked

2. Regular DLL using shared MFC DLL

3. MFC Extension DLL (using shared MFC DLL)

A dll tipo “regular†(caso 1. e 2.) pode em princípio ser usada em outra linguagem que nÃģo Visual C++

(como Delphi). A dll tipo “extension†somente pode ser usada para programas com Visual C++.

 

 

Desnvolvido por Rap_

[email protected]

Link para o comentário
Compartilhar em outros sites

Re.: Trabalhando com C e C++

 

TITOCOrox*, valeu cara finalmente axei pessoas nesse forum q sabem da valor as coisas!! cara eu postei uma parada aki um tutorial bank o carinha ja foi logo dizenu q era lecheer e tipow so pq num entendeu disse q eu num tinha capacidade pra fazer um tutorial e talz aff....

mais tem nda naum vlw pelo seu elogio e e isso q me motiva a ajudar pessoas!!

flw e abraÃĤo se der me add no msn!!

[email protected]

Link para o comentário
Compartilhar em outros sites

Re.: Trabalhando com C e C++

 

rap_, depois tem mando uma MP, fraga estou fazendo SI, mais a linguagem inicial que os professores estao ensinando e PASCAL, vc q programa sabe pascal nun se usa pra mais nd , agora o C e C++l, apesar de antigo se usa muito, se puder post alguns algoritimos, de programinha simples pra C, vlw amigo belo post!

Link para o comentário
Compartilhar em outros sites

Re.: Trabalhando com C e C++

 

PSAUX, man eu vo postar aki sim mais eu preciso de uma forÃĤa qru me tornar programador aki no cb! entaum eu vo ajudar v6!! me add no msn q eu te passo!! eu tenhu umas apostilhas q eu fiz aki para meu curso de programaÃĤÃģo e tmb para uns colega meu aki ai eu te passo blza?

 

guardtjf, pods crer man he mto xataum mermu mais dexa passar dessa etapa pa vc v como vai c massa estudar programaÃĤÃģo!!

Link para o comentário
Compartilhar em outros sites

Re.: Trabalhando com C e C++

 

Obrigado a todos v6 q entenderam q viram e gostaram do meu trabalho aki no CB espero q outras pessoas tbm vejam!!!

 

visitem meus outros topicos na delta zone q v6 vaum v se gostam!! espero ter ajudado a todos...

 

te mais e qualquer duvida me add no msn [email protected] q eu tiro suas duvidas blza??

te mais ai pra v6

 

FuiZ

Link para o comentário
Compartilhar em outros sites

Re.: Trabalhando com C e C++

 

O amigo to meio sem tempo pra entra no msn!!! qnd eu entrar eu te add, fraga to sem pc no trampo, to entrano poco no forum =( tipo parei de usa hacks do gb, to entrano no forum pra entra no delta zone!! ta rox o delta zone!!! 8)

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois...

Boa cara vlw, eu q estou comeÃĤando agora, ja me deu uma boa ajuda, estou na escola de programaÃĤÃģo aki, ja passei pelo algoritimo, ,portugol, e agora entrei em c++, poderiamos dar continualidade a esse topico

Podia postar uns tutoriais e alguns exemplos de programas ou algo assim.

AgredeÃĤo

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois...
Este tópico está impedido de receber novos posts.
 Compartilhar

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.