Jump to content
Fórum Script Brasil
  • 0

Dll's em C/C++


Denis Bittencourt Muniz

Question

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:

  1. 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'
  1. 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.

Até a próxima galera!

Link to comment
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Guest
This topic is now closed to further replies.


  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.9k
×
×
  • Create New...