Ir para conteúdo
Fórum Script Brasil
  • 0

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


filipegiovany

Pergunta

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!!!

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

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!!!

Link para o comentário
Compartilhar em outros sites

  • 0

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?

Link para o comentário
Compartilhar em outros sites

  • 0

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?

????????

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...