Endrew_mano Posted December 17, 2016 at 03:37 PM Report Share #601330 Posted December 17, 2016 at 03:37 PM 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 More sharing options...
HappyHippyHippo Posted December 18, 2016 at 09:08 AM Report Share #601339 Posted December 18, 2016 at 09:08 AM amostra todo o header dll.h IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Endrew_mano Posted December 18, 2016 at 10:34 AM Author Report Share #601341 Posted December 18, 2016 at 10:34 AM Aqui está o arquivo dll.h: #ifdef BUILDING_DLL #define ARQDLL __declspec ( dllexport ) #else #define ARQDLL __declspec ( dllimport ) #endif ARQDLL int soma ( int a, int b ); ARQDLL int sub ( int a, int b ); Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 18, 2016 at 08:05 PM Report Share #601350 Posted December 18, 2016 at 08:05 PM o carregar a biblioteca dll não quer dizer que os métodos estejam disponíveis automagicamente ... deverás chamar a função GetProcAddress para obter a referência do método pretendido carregado da biblioteca, para assim o poder chamar. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Endrew_mano Posted December 18, 2016 at 08:46 PM Author Report Share #601352 Posted December 18, 2016 at 08:46 PM 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 More sharing options...
HappyHippyHippo Posted December 19, 2016 at 12:03 AM Report Share #601355 Posted December 19, 2016 at 12:03 AM programar não +e um corte e costura de algo a net a ver se cola. final qual é a assinatura da função na dll ? qual a assinatura da função que estás a chamar ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Endrew_mano Posted December 19, 2016 at 12:32 AM Author Report Share #601356 Posted December 19, 2016 at 12:32 AM Não sei nada disto!! Se poder me ajudar te agradeço, se não poder, vou procurar ajuda noutro lugar. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 19, 2016 at 07:15 AM Report Share #601357 Posted December 19, 2016 at 07:15 AM 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 Portugol Plus Link to comment Share on other sites More sharing options...
Endrew_mano Posted December 19, 2016 at 08:12 PM Author Report Share #601392 Posted December 19, 2016 at 08:12 PM 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 More sharing options...
HappyHippyHippo Posted December 19, 2016 at 09:22 PM Report Share #601396 Posted December 19, 2016 at 09:22 PM peço desculpa mas não percebi o que disseste ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Endrew_mano Posted December 19, 2016 at 09:37 PM Author Report Share #601397 Posted December 19, 2016 at 09:37 PM 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 More sharing options...
HappyHippyHippo Posted December 19, 2016 at 09:42 PM Report Share #601398 Posted December 19, 2016 at 09:42 PM eu não sou São Tiago ... deixa lá as imagens para ti para fazer a soma basta (caso o teu dll for o original) : typedef int (*DllSoma) (int, int); // ... DllSoma soma = GetProcAddress (/* your arguments */); int result = soma(2, 5); IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Endrew_mano Posted December 19, 2016 at 09:52 PM Author Report Share #601399 Posted December 19, 2016 at 09:52 PM Só corrija esta duas linhas com argumentos para mim: void ( WINAPI * carg_dll ) ( ); carg_dll = ( void ( WINAPI * ) ( ) ) GetProcAddress ( hDll, "menos" ); Como ficaria com dois argumentos inteiros? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 19, 2016 at 09:56 PM Report Share #601400 Posted December 19, 2016 at 09:56 PM como está descrito no último tópico IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Endrew_mano Posted December 19, 2016 at 10:19 PM Author Report Share #601401 Posted December 19, 2016 at 10:19 PM 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 More sharing options...
HappyHippyHippo Posted December 19, 2016 at 10:42 PM Report Share #601404 Posted December 19, 2016 at 10:42 PM qual o erro que te dá ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Endrew_mano Posted December 19, 2016 at 10:53 PM Author Report Share #601405 Posted December 19, 2016 at 10:53 PM Nenhum erro! Abre e fecha o .exe rapidamente, não consigo visualizar nada! Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 19, 2016 at 11:19 PM Report Share #601406 Posted December 19, 2016 at 11:19 PM já experimentaste colocar a instrução : system("PAUSE") antes do return da função main ? é que o Visual Studio tem o hábito de fechar logo a consola .... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Endrew_mano Posted December 19, 2016 at 11:40 PM Author Report Share #601411 Posted December 19, 2016 at 11:40 PM (edited) 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 Edited December 19, 2016 at 11:52 PM by Endrew_mano Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 20, 2016 at 12:07 AM Report Share #601413 Posted December 20, 2016 at 12:07 AM 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 Portugol Plus Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now