Chamando funções num DLL de C ++
-
22-08-2019 - |
Pergunta
Eu tenho uma solução no VS 2008 com 2 projectos na mesma. Um deles é um DLL escrito em C ++ e o outro é um aplicativo de console simples C ++ criado a partir de um projeto em branco. Gostaria sei como chamar as funções na DLL a partir da aplicação.
Suponha que eu estou começando com um projeto em branco C ++ e que eu quero chamar uma função chamada int IsolatedFunction(int someParam)
Como posso chamá-lo?
Solução
Existem muitas maneiras de fazer isso, mas eu acho que uma das opções mais fácil é ligar o aplicativo para a DLL em tempo de ligação e, em seguida, usar um arquivo de definição para definir os símbolos a serem exportados do a DLL.
Aviso: A abordagem arquivo de definição funciona bests para undecorated nomes de símbolo. Se você quiser exportar símbolos decorados, então provavelmente é melhor NÃO USE a abordagem arquivo de definição.
Aqui está um exemplo simples de como isso é feito.
Passo 1:. Definir a função no export.h arquivo
int WINAPI IsolatedFunction(const char *title, const char *test);
Passo 2:. Definir a função no export.cpp arquivo
#include <windows.h>
int WINAPI IsolatedFunction(const char *title, const char *test)
{
MessageBox(0, title, test, MB_OK);
return 1;
}
Passo 3:. Definir a função como uma exportação no export.def arquivo defintion
EXPORTS IsolatedFunction @1
Passo 4: Crie um projeto DLL e adicionar o export.cpp e export.def arquivos para este projeto. Construir este projecto irá criar um export.dll e um export.lib arquivo.
Os dois passos seguintes apontam para a DLL em tempo de ligação. Se você não quiser definir os pontos de entrada em tempo de link, ignore os próximos dois passos e usar o LoadLibrary e GetProcAddress para carregar o ponto de entrada de função em tempo de execução.
Passo 5: Criar um projeto Teste de aplicativo para usar o dll, adicionando o export.lib arquivo para o projeto. Copie o export.dll arquivo para ths mesmo local que o Test consola executável.
#include "stdafx.h"
// get the function prototype of the imported function
#include "../export/export.h"
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// call the imported function found in the dll
int result = IsolatedFunction("hello", "world");
return 0;
}
Outras dicas
Também é possível exportar funções de dll e importação a partir do exe, é mais complicado no início, mas no final é muito mais fácil do que chamar LoadLibrary / GetProcAddress. Consulte MSDN .
Ao criar o projeto com o VS bruxo há uma caixa de seleção na dll que lhe permitem exportar funções.
Em seguida, no aplicativo de exe você só tem que # incluir um cabeçalho da dll com as definições apropriadas, e adicionar o projeto DLL como uma dependência para a aplicação exe.
Marque esta outra pergunta se você deseja investigar mais este ponto Exportando funções de uma DLL com dllexport .
Você pode ir a rota LoadLibrary / GetProcAddress (como Harper mencionado na sua resposta, a ligação do aqui para o dinâmica em tempo de execução vinculação amostra MSDN novamente) ou você pode vincular seu aplicativo de console para o lib produzido a partir do projeto de DLL e incluir o arquivo hea.h com a declaração de a sua função (tal como descrito no dinâmica em tempo de carga ligando amostra MSDN )
Em ambos os casos, você precisa ter certeza de suas exportações DLL a função que deseja chamar corretamente. A maneira mais fácil de fazer isso é usando __declspec (dllexport) na declaração de função (como mostra a criação de uma simples biblioteca de vínculo dinâmico MSDN amostra ), mas você pode fazê-lo também através do ficheiro.def correspondente em seu projeto DLL.
Para obter mais informações sobre o tema da DLLs, você deve percorrer a MSDN Sobre tópico bibliotecas de vínculo dinâmico .
A seguir estão os 5 passos necessários:
- declarar o ponteiro de função
- Coloque a biblioteca
- Obter o endereço do procedimento
- atribuí-la a ponteiro de função
- chamar a função usando ponteiro de função
Você pode encontrar o passo a passo tela ++ IDE VC tiro em http: //www.softwareandfinance. com / Visual_CPP / DLLDynamicBinding.html
Aqui está o trecho de código:
int main()
{
/***
__declspec(dllimport) bool GetWelcomeMessage(char *buf, int len); // used for static binding
***/
typedef bool (*GW)(char *buf, int len);
HMODULE hModule = LoadLibrary(TEXT("TestServer.DLL"));
GW GetWelcomeMessage = (GW) GetProcAddress(hModule, "GetWelcomeMessage");
char buf[128];
if(GetWelcomeMessage(buf, 128) == true)
std::cout << buf;
return 0;
}
Supondo que você está falando dinâmica de tempo de execução de carga de DLLs, você está procurando LoadLibrary e GetProAddress. Há um exemplo na MSDN .
Quando a DLL foi criado um lib importação é geralmente criado automaticamente e você deve usá-la ligada no seu programa, juntamente com arquivos de cabeçalho de chamá-lo, mas se não, então você pode ligar manualmente as funções do Windows como LoadLibrary e GetProcAddress para fazê-lo funcionar.