filipegiovany Postado Abril 26, 2007 Denunciar Share Postado Abril 26, 2007 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)--> DLL2Só 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();#endifQualquer ajuda será válidaValeu!!! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 filipegiovany Postado Abril 27, 2007 Autor Denunciar Share Postado Abril 27, 2007 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!!! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Julierme Araújo Postado Dezembro 4, 2007 Denunciar Share Postado Dezembro 4, 2007 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Julierme Araújo Postado Dezembro 8, 2007 Denunciar Share Postado Dezembro 8, 2007 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_Hextern "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????????? Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
filipegiovany
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
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.