Jump to content

Utilizar DLL criada em C, em outros projetos C/C++


Endrew_mano
Go to solution Solved by Endrew_mano,

Recommended Posts


Criei uma .dll em C e está funcionando muito bem, porém não estou conseguindo utilizá-la em outros projetos,
alguém tem um código de exemplo em C ou C++ que possa compartilhar?

Estou chamando a dll da seguinte forma:

#include <windows.h>
#include <stdio.h>
#include "dll.h"
int main ( ) {
    HINSTANCE hinst;
    if ( ! ( hinst = LoadLibrary ( "minha.dll" ) ) ) {
    MessageBox ( 0, "erro", "", 0 );
        return 0;
    }
    soma ( 12, 8 );//Esta função deve ser chamada de dentro da dll
    //src\main.o(.text+0x40):main.cpp: undefined reference to `_imp___Z4somaii'
    FreeLibrary ( hinst );
    return 0;
}

O erro apresentado está comentado no código

Link to comment
Share on other sites

Agora adaptei um certo código que baixei da net, porém a tela fica toda preta,

não exibe erros e nem muito menos imprime os valores da função soma que está dentro da dll.

#include <stdio.h>
#include <conio.h>
#include <windows.h>
typedef void ( WINAPI*cfunc ) ( );
cfunc FuncaoTemp;
int main ( ) {
    HINSTANCE hLib = LoadLibrary ( "minha.dll" );
    if ( !hLib ) {
        printf ( "error" );
        getche ( );
        return 0;
    }
    FuncaoTemp = ( cfunc ) GetProcAddress ( ( HMODULE ) hLib, "soma" );
    FuncaoTemp ( );
    FreeLibrary ( ( HMODULE ) hLib );
    getch ( );
}
Link to comment
Share on other sites

dois grandes problemas :

- a função no dll tem como assinatura : recebe dois inteiros e retorna um inteiro, tendo como nome o identificador "soma", no entanto, o teu novo tipo de dados que define um ponteiro para a função a ser carregada não retorna nada assim como não tem nenhuma parâmetro

- a chamada da função soma deveria ser chamada com dois argumentos, no entanto, mesmo que tenhas feito corte e costura cega de um exemplo da net, não percebo qual a razão de ignorares esse ponto, afinal foste tu que criaste o dll.

typedef int (*dllSoma) (int, int);

// ...

dllSoma = GetProcAddress (/* your arguments */);

int result = dllSoma (2, 5);
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Cheguei agora pouco por aqui, e mais que depressa baseado no que você
me mostrou a respeito dos dois erros que estava cometendo, então comecei
a modificar meus arquivos que compõe a criação da dll, sem parâmetros, e sem retorno,

tudo para facilitar, e o arquivo dll.h agora ficou assim:

#ifdef BUILDING_DLL
#define ARQDLL __declspec ( dllexport )
#else
#define ARQDLL __declspec ( dllimport )
#endif

ARQDLL __declspec( dllexport ) void menos ( );

E o meu código de chamada agora é este abaixo funcionando normalmente:

#include <windows.h>
#include <iostream>
#include <conio.h>
using namespace std;
int main() {
    HINSTANCE hDll;
    hDll = LoadLibrary ( "minha.dll" );
    if ( ! hDll ) {
        cout << "Não foi possível carregar a dll" << endl;
        exit(1);
    }
    void ( WINAPI * carg_dll ) ( );
    carg_dll = ( void ( WINAPI * ) ( ) ) GetProcAddress ( hDll, "menos" );
    if ( ! carg_dll ) {
        cout << "Não foi possível carregar as funções da DLL" << endl;
        getche();
        exit ( 1 );
    }
    carg_dll ( );
}

Meu próximo passo agora é me aprofundar em ponteiro para função com argumentos,
coisa que já estudei más não me recordava de quase nada, por isto me
causou tantas dúvidas.
Muito obrigado pela ajuda, e volto em breve para mostrar o código como
era desejado no início.

Link to comment
Share on other sites

O que eu quis dizer é o seguinte:
Modifiquei meus arquivos e criei uma função nova com o nome de menos();
e sem argumentos, compilei e criei uma nova dll.

Só pra ter certeza dos erros que você me mostrou.

E agora consegui fazer subir a dll e imprimir os resultados da nova função que criei num novo projeto.

Se não acredita te mostro imagens, agora, concentro minhas atenções ao início de tudo, para conseguir imprimir aquelas duas funções com argumentos, onde soma();é uma delas.

Link to comment
Share on other sites

Não quero esgotar sua paciência, más analise isto por favor e me diga onde estou errando:

#include <windows.h>
#include <iostream>
#include <conio.h>
using namespace std;
int main ( ) {
    HINSTANCE hDll;
    hDll = LoadLibrary ( "minha.dll" );
    if ( ! hDll ) {
        cout << "Não foi possível carregar a dll" << endl;
        getche();
        exit ( 1 );
    }
    int ( WINAPI *func_1 ) ( int x, int y );
    int ( WINAPI *func_2 ) ( int x, int y );
    func_1 = ( int ( WINAPI * ) ( int x, int y ) ) GetProcAddress ( hDll, "soma" );
    func_2 = ( int ( WINAPI * ) ( int x, int y ) ) GetProcAddress ( hDll, "sub" );

    if ( !func_1 || !func_2 ) {
        cout << "Não foi possível carregar as funções da DLL" << endl;
        getche();
        exit(1);
    }

   int x = 0, y = 0;
    func_1 ( x, y );
    func_2 ( x, y );
}
Link to comment
Share on other sites

25 minutes ago, Endrew_mano said:

Por aqui só uso o eclipse, más já fiz isto colocando um getch();

a tela ficou parada sem mostrar nada.

Vou aproveitar e testar no Visual studio e no CLion

sim ...  esperado é que a janela fique à espera de entrada de dados ... é o que o getch faz

no entanto, continuas a fornecer o mínimo da informação necessária, e neste caso, insuficiente ... como posso saber o que a função do dll faz e se deverá mesmo apresentar alguma coisa.

não percebo como as pessoas pensam que uma pessoa do outro lado do mundo saber de cor o que se passa nos seus computadores

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.