Decidi colocar esse tópico como "Pinned" para uma busca mais rápida! (esse assunto é muito procurado, pelo menos ao meu ver)
Já vi muitas dúvidas em C/C++, mas, umas das que me chamam mais a atenção, são essas:
1. Como crio uma DLL em C/C++
2. Como chamo uma DLL em C/C++
A pouco tempo, descobri como fazer ambas tarefas e decidi compartilhar o conhecimento com a galera do fórum:
Criar DLL
Uma tarefa simples! Na verdade, isso ensinará a criar uma interface de uso entre a função e o arquivo (EXE ou DLL). Um exemplo de DLL:
__declspec(dllexport) int Add (int x, int y)
{
return x + y;
}
extern "C" __declspec(dllexport) int Multiply (int x, int y)
{
return x * y;
}
Pronto! Compile como DLL!
O uso de extern "C" serve para informar ao compilador C++ deixar a função com nomenclatura da linguagem C, explicando melhor: um compilador C não modifica o nome da função, mas um compilador C++ sim. Por exemplo:
No Dev-C++ 4.9.9.2, a função 'Add', sem uso de extern "C", ficou com o seguinte nome: '_Z3Addii'. Caso use extern "C", ficará o seguinte: 'Add'.
Bom, não sei informar o comportamento dos compiladores C/C++... :lol:
Mas vejam bem, eu disse, logo acima, interface entre função e arquivo (EXE e DLL), ou seja, isso será válido:
__declspec(dllexport) int Add (int x, int y)
{
return x + y;
}
extern "C" __declspec(dllexport) int Multiply (int x, int y)
{
return x * y;
}
int main()
{
printf("Teste");
.
.
.
return 0;
}
Resultado: um programa comum que também poderá ser chamado como se fosse uma DLL. Um exemplo em VB6 (jogue o executável ou DLL dentro da pasta 'system32' do seu computador)
Public Declare Function Multiply Lib "MeuProg.exe" (x As Long, y As Long) As Long
Public Declare Function Add Lib "MeuProg.exe" Alias "_Z3Addii" (x As Long, y As Long) As Long
'Lembre que 'Add' foi compilado por um compilador C++, sem uso de extern "C", ou seja, o nome verdadeiro da função Add é _Z3Addii
Well.. a chave de tudo é palavra-chave '__declspec' com o atributo 'dllexport'
Chamar DLL
extern "C" __declspec(dllimport) int __stdcall MessageBeep (int sound);
Quase as mesmas regras...
1. extern "C" indica o nome 'Alias', falso, digamos, pois 'MessageBeep' terá um outro nome no momento da compilação por um compialdor C++
2. A chave de tudo é a palavra-chave '__declspec' com o atributo 'dllimport'
3. Retorno da função juntamente com a palavra-chave '__stdcall', que indica uma chamada a um procediemnto Windows 32 bits.
4. Nome da função (no caso, use extern "C" para facilitar a nomenclatura) e seus parâmetros...
Você pode está perguntando: tudo bem! Mas onde eu especifico a DLL dessa função? Geralmente, o usuário indica para o compilador qual biblioteca (DLL, LIB, etc...) deve usar durante a compilação.. pelo menos é assim o esuqema do Dev-C++, pelo que percibi...
Espero que tenha ajudado vocês.. principalmente os novatos com essa dúvida "sarneta".
Meu compilador, usado para os testes, foi o Dev-C++ 4.9.9.2... apesar que aprendi essas técnicas no site da Microsoft, onde falam sobre a referência do Visual C++ 6... esses truques deram certos por causa da enorme padronização que a linguagem C/C++ tem sofrido, pelo menos ao meu ver.
Pergunta
Denis Bittencourt Muniz
Olá galera! (que saudades do fórum)
Decidi colocar esse tópico como "Pinned" para uma busca mais rápida! (esse assunto é muito procurado, pelo menos ao meu ver)
Já vi muitas dúvidas em C/C++, mas, umas das que me chamam mais a atenção, são essas:
1. Como crio uma DLL em C/C++
2. Como chamo uma DLL em C/C++
A pouco tempo, descobri como fazer ambas tarefas e decidi compartilhar o conhecimento com a galera do fórum:
- Criar DLL
Uma tarefa simples! Na verdade, isso ensinará a criar uma interface de uso entre a função e o arquivo (EXE ou DLL). Um exemplo de DLL: Pronto! Compile como DLL! O uso de extern "C" serve para informar ao compilador C++ deixar a função com nomenclatura da linguagem C, explicando melhor: um compilador C não modifica o nome da função, mas um compilador C++ sim. Por exemplo: No Dev-C++ 4.9.9.2, a função 'Add', sem uso de extern "C", ficou com o seguinte nome: '_Z3Addii'. Caso use extern "C", ficará o seguinte: 'Add'. Bom, não sei informar o comportamento dos compiladores C/C++... :lol: Mas vejam bem, eu disse, logo acima, interface entre função e arquivo (EXE e DLL), ou seja, isso será válido: Resultado: um programa comum que também poderá ser chamado como se fosse uma DLL. Um exemplo em VB6 (jogue o executável ou DLL dentro da pasta 'system32' do seu computador) Well.. a chave de tudo é palavra-chave '__declspec' com o atributo 'dllexport'Quase as mesmas regras...
1. extern "C" indica o nome 'Alias', falso, digamos, pois 'MessageBeep' terá um outro nome no momento da compilação por um compialdor C++
2. A chave de tudo é a palavra-chave '__declspec' com o atributo 'dllimport'
3. Retorno da função juntamente com a palavra-chave '__stdcall', que indica uma chamada a um procediemnto Windows 32 bits.
4. Nome da função (no caso, use extern "C" para facilitar a nomenclatura) e seus parâmetros...
Você pode está perguntando: tudo bem! Mas onde eu especifico a DLL dessa função? Geralmente, o usuário indica para o compilador qual biblioteca (DLL, LIB, etc...) deve usar durante a compilação.. pelo menos é assim o esuqema do Dev-C++, pelo que percibi...
Espero que tenha ajudado vocês.. principalmente os novatos com essa dúvida "sarneta".
Meu compilador, usado para os testes, foi o Dev-C++ 4.9.9.2... apesar que aprendi essas técnicas no site da Microsoft, onde falam sobre a referência do Visual C++ 6... esses truques deram certos por causa da enorme padronização que a linguagem C/C++ tem sofrido, pelo menos ao meu ver.
Até a próxima galera!
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados