Schehaider_Aymen Ответов: 4

использование DLL без импорта библиотеки LIB


Всем привет,

У меня есть приложение, написанное на VC++ 2005, и я создаю DLL (экспорт одной функции)

Код в моей библиотеке DLL выглядит следующим образом :

#include <stdio.h>
#include <atlstr.h>


extern "C"
{
	__declspec(dllexport) void DisplayHelloFromDLL()
	{
		CString str;
		printf ("Hello from DLL !\n");
	}
}


Проблема в том, что я хочу импортировать функцию из своей библиотеки DLL без импорта сгенерированной библиотеки LIB, и я не знаю, как это сделать в VC2005.

Пожалуйста, кто-нибудь, помогите мне или дайте подсказку. Тнх

4 Ответов

Рейтинг:
34

Jochen Arndt

Это делается путем загрузки библиотеки, получения адресов необходимых функций и их вызова (см. Также GetProcAddress [^] в MSDN):

typedef VOID (CALLBACK* LPFN_DHFDLL)();
HINSTANCE hInst = ::LoadLibrary(_T("MyLib.dll"));
if (NULL != hInst)
{
    LPFN_DHFDLL pDisplayHello = 
        (LPFN_DHFDLL)::GetProcAddress(hInst, "DisplayHelloFromDLL");
    if (pDisplayHello)
        pDisplayHello();
    ::FreeLibrary(hInst);
}


Рейтинг:
26

Lakamraju Raghuram

Привет,
Проверить это.

Когда вы говорите, что не используете import lib, я предполагаю, что вы его не генерируете. Таким образом, нет необходимости использовать __declspec(dllexport) для экспорта функции, скорее вы можете использовать def-файл:

DefFile.def
================
Библиотека "MyDLL"
ПОСТАВЛЯЕМЫЙ
DisplayHelloFromDLL
================

Теперь перейдем к доступу к этому. Все, что нам нужно сделать, это сопоставить этот "MyDLL" с нашим адресным пространством exe. Для этого мы можем использовать 'LoadLibrary'. Проверить это:

#include <windows.h>

// Declaring Function pointer for DisplayHelloFromDLL
typedef void ( WINAPIV* LPFN_DISPLAYHELLO ) ( ); 

void main()
{
    // Loading DLL
    HINSTANCE hMyDLL = LoadLibraryA("Dll_New.dll");

    // Getting address of the DLL exported function
    LPFN_DISPLAYHELLO fnDisplayName = (LPFN_DISPLAYHELLO)GetProcAddress(
		                                   hMyDLL,
					      "DisplayHelloFromDLL" );
                                                          

    // Actual function call
    fnDisplayName();

   // Releasing DLL 
   FreeLibrary( hMyDLL );
}


Member 11738586

Как вызвать функцию, которая принимает аргументы?

cmsOpenProfileFromFile () - это функция, которая принимает два аргумента.
Когда я строю приведенный ниже код, я получаю следующую ошибку:
ошибка C2197:'LPFN_OPFDLL' : слишком много аргументов для вызова

typedef void (WINAPIV* LPFN_OPFDLL) ();
HINSTANCE hMyDll = ::LoadLibraryA("libcms2.dll");
LPFN_OPFDLL funOne =(LPFN_OPFDLL)GetProcAddress(hMyDll, "cmsOpenProfileFromFile");
funOne("AppleRGB.icc", "r");
Метод freelibrary(hMyDll);

Jochen Arndt

Вам следовало бы поднять свой собственный вопрос, а не задавать его на посту трехлетней давности.

Однако вы должны указать типы параметров в typedef:
typedef void (WINAPIV* LPFN_OPFDLL) (LPCSTR, LPCSTR);

Рейтинг:
2

Schehaider_Aymen

Спасибо вам обоим. это было именно то, что я искал. Я нашел много учебников, но большинство из них используют сгенерированную библиотеку Lib, и я нашел, что она не подходит, потому что каждый раз, когда я меняю DLL, я должен перекомпилировать проекты, используя эту DLL.

спасибо еще раз. Ты сэкономил мне кучу времени.


Рейтинг:
0

Member 12566773

#include <windows.h>

// Declaring Function pointer for DisplayHelloFromDLL
typedef void ( WINAPIV* LPFN_DISPLAYHELLO ) ( ); 

void main()
{
    // Loading DLL
    HINSTANCE hMyDLL = LoadLibraryA("Dll_New.dll");

    // Getting address of the DLL exported function
    LPFN_DISPLAYHELLO fnDisplayName = (LPFN_DISPLAYHELLO)GetProcAddress(
		                                   hMyDLL,
					      "DisplayHelloFromDLL" );
                                                          

    // Actual function call
    fnDisplayName();

   // Releasing DLL 
   FreeLibrary( hMyDLL );
}


CHill60

Необъяснимый дамп кода - это не решение этого 7-летнего вопроса! Более того, простое копирование кода из решения 2 является плагиатом и не допускается на этом сайте. Пожалуйста, не делайте этого снова