Sign in to follow this  
filipegiovany

Criando Uma Dll Para Chamar Outra Dll No Dev-c++

Recommended Posts

Galera,

sou iniciante na linguagem C e estou tentando criar uma DLL pra chamar outra DDL a partir de um programa.

Explicando melhor:

Tenho um programa "Program1" que vai chamar a DLL1 que deverá chamar a DLL2.

Program (Instanciar e chamar DLL1) --> DLL1 (Instanciar e chamar DLL2)--> DLL2

Só que ao tentar usar uma função da DLL2 a partir da DLL1 da erro na compilação:

C:\Dev-Cpp\mydll.cpp "too many arguments to function"

Detalhe se eu tirar todos os parâmetros da função, funciona perfeitamente.

Código Exemplo:

*****Programa Principal*******

#include <stdio.h>

#include <conio.h>

#include <windows.h>

typedef void (WINAPI*cfunc)();

cfunc FuncaoTemp;

int main() {

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

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

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

int op1 = 10;

int op2 = 5;

int resultado = 0;

FuncaoTemp(op1,op2,&resultado);

printf("Valor Operando 1: %d \n",op1);

printf("Valor Operando 2: %d \n",op2);

printf("Valor Resultado: %d \n",resultado);

FreeLibrary((HMODULE)hLib);

getch();

}

****DLL-1*******

#include "mydll.h"

#include "stdio.h"

#include <conio.h>

#include <windows.h>

typedef void (WINAPI *cfunc1)();

cfunc1 FuncaoTemp2;

extern "C" __declspec(dllexport) void OperandoInteiroPorReferencia(int op1, int op2,int *res) {

HINSTANCE hLib1=LoadLibrary("Project3.dll");

if (!hLib1) {

printf("error");

FreeLibrary((HMODULE)hLib1);

getch();

}

FuncaoTemp2=(cfunc1)GetProcAddress((HMODULE)hLib1, "funcao1Fornecedor");

FuncaoTemp2(op1); //AQUI DA O ERRO DE COMPILAÇÃO, "too many arguments to function"

/*

SE EU RETIRAR O COMENTARIO DESTE BLOCO E COMENTAR O DE CIMA FUNCIONARÁ PERFEITAMENTE

PORQUE A FUNCAO DESTE BLOCO ESTA DECLARADA SEM PARAMETROS

FuncaoTemp2=(cfunc1)GetProcAddress((HMODULE)hLib1, "funcao2Fornecedor");

FuncaoTemp2(op1);

*/

FreeLibrary((HMODULE)hLib1);

getch();

}

***.H da DLL-1***

#ifndef _MYDLL_H_

#define _MYDLL_H_

#include <stdio.h>

extern "C" __declspec(dllexport) void OperandoInteiroPorReferencia(int param1, int op2,int *res);

#endif

***DLL-2*****

#include "dll.h"

#include "stdio.h"

extern "C" __declspec(dllexport) void funcao1Fornecedor(int op1, int op2,int *res) {

printf("Funcao 1 Executada no Fornecedor \n");

//Operação com "int" retornando a referencia resultado

*res = op1 + op2;

printf("Valor Operando 1 na DLL : %d \n",op1);

printf("Valor Operando 2 ma DLL: %d \n",op2);

printf("Valor Res ma DLL: %d \n",*res);

}

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

printf("Funcao 2 Executada no Fornecedor \n");

}

***.H da DLL-2 ****

#ifndef _DLL_H_

#define _DLL_H_

#include <stdio.h>

extern "C" __declspec(dllexport) void funcao1Fornecedor(int param1, int op2,int *res);

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

#endif

Qualquer ajuda será válida

Valeu!!!

Share this post


Link to post
Share on other sites

A dúvida é a seguinte:

Como faço pra chamar uma DLL a partir de outra DLL passando parâmetros por referência?

Conforme descrito acima, neste protótipo, somento consigo chamar uma função de uma DLL a partir de outra DLL para funções sem parâmetros.

Esquisito, porque eu consigo chamar funções de qualquer tipo da DLL se for de um programa (main).

qualquer ajuda é válida!!!

Share this post


Link to post
Share on other sites

Cara eu tenho uma dúvida!

Percebi que todo seu código usa das bibliotecas .h padrão do Dev. Ex: #include <stdio.h>. Ou outras #include <stdlib.h>, #include <conio.h>.

Foi dai que surgiu um dúvida!

Vi que você é mais experiente em fazer dll's do que eu!

E se a pessoa precisar fazer um DLL com uma biblioteca .h que NÃO seja padrão do Dev C++?

Tipo, a Dev C++ tem uma coleção enorme de bibliotecas .h . Mas vou precisar fazer uma DLL com um código que usa uma biblioteca .h que n faz parte dessa coleção do DEV. Como faço nesse caso?

Share this post


Link to post
Share on other sites

Ops me expressei errado! Terminei misturando mil coisas onde quero a solução de somente uma!

Reformulado a pergunta...

Já consegui fazer Dll's com arquivos de cabeçalho(headers) .h que fazem parte do pacote do DEV.

Mas tenho um projeto para entregar onde tenho que fazer uma DLL de um programa que usa um arquivo de cabeçalho que NÃO faz parte do pacote do Dev.

Como faço nesse caso?

------- teste.h ----------

#define funcion_H

#ifdef funcion_H

extern "C" __declspec(dllexport) void metodonativo(int numero);

extern "C" __declspec(dllexport) void metodonativotexto(char* texto);

#endif

------- teste.cpp --------

#include <stdio.h>

extern "C" __declspec(dllexport) void metodonativo(int numero){

printf("O numero foi: %d \n",numero);

}

extern "C" __declspec(dllexport) void metodonativotexto(char* texto){

printf("A string foi: %s \n",texto);

}

No exemplo acima fica tranquilo criar um DLL já que os arquivos de cabeçalhos usados fazem parte do pacote padrão do DEV (#include <stdio.h>).

Aprendi que para criar uma DLL é necessário criar os métodos que iram compor essa DLL salvando-os no formato .cpp . E criar um arquivo de cabeçalho contendo o protótipo desses métodos.

Só que eu tenho métodos criados que possuem códigos que estão atrelados a arquivos de cabeçalho que não fazem parte do pacote do DEV.

E ai? Como fazer o DEV enxergar uma Header que não faz parte do seu pacote para assim criar uma DLL?

Cara eu tenho uma dúvida!

Percebi que todo seu código usa das bibliotecas .h padrão do Dev. Ex: #include <stdio.h>. Ou outras #include <stdlib.h>, #include <conio.h>.

Foi dai que surgiu um dúvida!

Vi que você é mais experiente em fazer dll's do que eu!

E se a pessoa precisar fazer um DLL com uma biblioteca .h que NÃO seja padrão do Dev C++?

Tipo, a Dev C++ tem uma coleção enorme de bibliotecas .h . Mas vou precisar fazer uma DLL com um código que usa uma biblioteca .h que n faz parte dessa coleção do DEV. Como faço nesse caso?

????????

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this