2014-01-15 2 views
0

Я не очень хорошо разбираюсь в DLL, поэтому я создал простой пример, с которым мне хотелось бы помочь. У меня здесь простая dll.Как мне вызвать функцию из моей DLL во время ссылки во время выполнения?

// HelloDLL.cpp 

#include "stdafx.h" 

int  __declspec(dllexport) Hello(int x, int y);  

int Hello(int x, int y) 
{ 
    return (x + y); 
} 

Как бы вызвать функцию Hello(int x, int y) в отдельной программе, когда я бежал LoadLibrary()? Вот приблизительная схема того, что у меня есть до сих пор, но я не уверен, что то, что у меня есть, является правильным, и если да, то как это сделать.

// UsingHelloDLL.cpp 

#include "stdafx.h" 
#include <windows.h> 

int main(void) 
{ 
    HINSTANCE hinstLib; 

    // Get the dll 
    hinstLib = LoadLibrary(TEXT("HelloDLL.dll")); 

    // If we got the dll, then get the function 
    if (hinstLib != NULL) 
    { 
     // 
     // code to handle function call goes here. 
     // 

     // Free the dll when we're done 
     FreeLibrary(hinstLib); 
    } 
    // else print a message saying we weren't able to get the dll 
    printf("Could not load HelloDLL.dll\n"); 

    return 0; 
} 

Может ли кто-нибудь помочь мне справиться с вызовом функции? Любые особые случаи, о которых я должен знать для будущего использования DLL?

+0

'GetProcAddress()' будет то, что вы ищете; он задокументирован в [MSDN] (http://msdn.microsoft.com). –

ответ

1

После загрузки библиотеки вам нужно найти указатель на функцию. Функция Microsoft предоставляет GetProcAdderess. К несчастью, вы должны знать прототип функции. Если вы не knwo, мы все пути к COM/DCOM и т. Д. Возможно, из вашего объема.

FARPROC WINAPI GetProcAddress(_In_ HMODULE hModule, _In_ LPCSTR lpProcName); 

Таким образом, в вашем примере, что вы делаете nromally, как это:

typedef int (*THelloFunc)(int,int); //This define the function prototype 

if (hinstLib != NULL) 
{ 
    // 
    // code to handle function call goes here. 
    // 

    THelloFunc f = (THelloFunc)GetProcAddress(hinstLib ,"Hello"); 

    if (f != NULL) 
     f(1, 2); 

    // Free the dll when we're done 
    FreeLibrary(hinstLib); 
} 
+0

Большое спасибо за ваш ответ. Будет ли это означать, что мне пришлось бы typedef прототип функции для каждой функции в зависимости от того, какую dll я буду использовать? – user3192654

+0

Да. Вы должны знать прототип функции. Однако это не проблема на самом деле. Поскольку вызывающий процесс и DLL будут совместно использовать общий заголовочный файл. Его можно легко определить там. Благодарим за положительный отзыв. – user3195397

Смежные вопросы