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?

Foi útil?

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.

Passo 6:. Chamar o IsolatedFunction função a partir da aplicação do teste, como mostrado abaixo

#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:

  1. declarar o ponteiro de função
  2. Coloque a biblioteca
  3. Obter o endereço do procedimento
  4. atribuí-la a ponteiro de função
  5. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top