Você está na página 1de 3

C e C++

O Microsoft Visual C++ (MSVC) prov vrias extenses ao C++ padro, o que permite que funes sejam importadas ou exportadas diretamente no cdigo. Este modelo foi adotado por outros compiladores C e C++ para Windows, incluindo a verso windows do GCC. Essas extenses usam o atributo __declspec antes de uma declarao de funo. Quando nomes externos seguem as convenes de nomes do C, eles tambm devem ser declarados como extern "C" no cdigo em C++, para prevenir o uso das convenes de nomes do C++. Alm da especificao das funes como importadas ou exportadas ao usar os atributos da __declspec, elas podem ser listadas nas sees IMPORT ou EXPORTS do arquivo DEF usado pelo projeto. Este arquivo processado pelo linker, e no pelo compilador, e portanto no especfico do C++. A compilao de DLL gerar um arquivo DLL e um LIB. O LIB usado para a ligao de uma DLL em tempo de compilao; ele no necessrio para a ligao em tempo de execuo. A no ser que sua DLL seja um COM server, o arquivo DLL deve ser colocado em um dos diretrios listados na varivel de ambiente PATH, ou no diretrio de sistema padro, ou no mesmo diretrio do aplicativo. As DLL COM servers so registradas usando o regsvr32.exe, que coloca a localizao e seu ID global nico (GUID) no registro. Os programas podem ento usar a DLL se buscarem pelo seu GUID no registro para acharem sua localizao.

Criando DLL
Os exemplos seguintes mostram os maneiras especficas de exportao de DLL. C e C++
#include <windows.h> // Exporta esta funo extern "C" __declspec(dllexport) double SomaNumeros(double a, double b); // funo de inicializao da DLL BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved) { return TRUE; } // Funo que soma dois nmeros double SomaNumeros(double a, double b) { return a + b; }

Usando funes importadas de DLL


Os exemplos a seguir mostram como usar funes especficas das linguagens para importar as funes de DLL em tempo de compilao. C e C++
#include <windows.h> #include <stdio.h> // Importa funo que soma dois nmeros extern "C" __declspec(dllimport) double SomaNumeros(double a, double b); int main(int argc, char **argv) { double resultado = SomaNumeros(1, 2); printf("O resultado : %f\n", resultado); return 0; }

Usando ligao explcita em tempo de execuo


Os exemplos a seguir mostram exemplos de como usar o carregamento em tempo de execuo e auxlios de ligao usando bindings especficas das linguagens para a API WIN32. C e C++
#include <windows.h> #include <stdio.h> // Assinatura da funo da DLL typedef double (*importFunction)(double, double); int main(int argc, char **argv) { importFunction SomaNumeros; double resultado; // Carrega arquivo DLL HINSTANCE hinstLib = LoadLibrary("Exemplo.dll"); if (hinstLib == NULL) { printf("ERRO: no foi possvel carregar a DLL\n"); return 1; } // Obtm o ponteiro da funo SomaNumeros = (importFunction)GetProcAddress(hinstLib, "SomaNumeros"); if (SomaNumeros == NULL) { printf("ERRO: no foi possvel achar a funo na DLL\n"); FreeLibrary(hinstLib); return 1; }

// Chama funo. resultado = SomaNumeros(1, 2); // Descarrega arquivo DLL FreeLibrary(hinstLib); // Mostra o resultado printf("O resultado : %f\n", resultado); return 0; }

Component Object Model


O Component Object Model (COM) estende o conceito de DLL para a programao orientada a objetos. Objetos podem ser chamados de outro processo, ou hospedados em outra mquina. Objetos COM tem GUID nicos e podem ser usados para implementar back-ends poderosos para front-ends de GUI simples como Visual Basic e ASP. Eles podem tambm ser programados em linguagens de scripting. Objetos COM so mais complexos de ser criados e usados em comparao com as DLL.

Você também pode gostar