Создание DLL в C ++ для импорта C ++ DLL в VS 2005

Я пытаюсь связать C ++ DLL в новую C ++ DLL, которую я создам,

Я шаг за шагом следовал приведенному ниже уроку и многим другим, но что-то не так, функция «GetProcAddress» возвращает NULL »http://www.dreamincode.net/forums/topic/118076-dlls-explicit-linking/»

Это прототип функции, которую я пытаюсь вызвать из DLL:

int RemoveAllDataFile (неподписанный int id);

функция возвращает 1, поэтому библиотека DLL успешно загружена.

typedef int (*funcRemoveAllDataFile) (int);

int load_dll_ARbnet(int x)
{
/* Retrieve DLL handle.*/
HINSTANCE hDLL = LoadLibrary("ArbNet2Remote.dll");
if (hDLL == NULL)
{
return 0;
}
else
{
}
/*Get the function address*/
funcRemoveAllDataFile RemoveAllDataFile = (funcRemoveAllDataFile)GetProcAddress(hDLL, "RemoveAllDataFile");
if (RemoveAllDataFile)
{
return 2;
}
else
{
return 1;
}

}

0

Решение

Посмотрите на фактический экспорт DLL, например, с помощью инструмента отчетности, такого как TDUMP или аналогичного. Функция, которую вы ищете, не экспортируется как "RemoveAllDataFile" как вы ожидаете. Это на самом деле экспортируется как "_RemoveAllDataFile" вместо этого, или даже что-то вроде "_RemoveAllDataFile@4",

Если вы компилируете оригинальную DLL и хотите экспортировать функцию как "RemoveAllDataFile", вам придется обернуть объявление экспортированной функции с extern "C" удалить любое искажение имени C ++ из экспортированного имени. В зависимости от вашего компилятора C ++ вам также может понадобиться .def файл для удаления начального подчеркивания, наложенного __cdecl Соглашение о вызовах. При использовании связывания C некоторые компиляторы C ++ экспортируют __cdecl функции с основным подчеркиванием (например, Borland), а некоторые нет (например, Microsoft).

Но если вы не перекомпилируете исходную DLL, то у вас нет выбора, кроме как просмотреть экспорт DLL и изменить свой GetProcAddress() позвоните, чтобы использовать правильное имя, которое на самом деле экспортируется.

0

Другие решения

Функция, которую вы экспортируете из другой DLL, должна быть объявлена extern "C" если используется источник C ++. Если должен быть экспортирован либо с .def файл или использование __declspec(dllexport):

Вот типичный DLL-файл заголовка, который работает с .c или же .cpp и оба соглашения о вызовах:

#ifdef MYAPI_EXPORTS
#define MYAPI __declspec(dllexport)
#else
#define MYAPI __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C" {
#endif

MYAPI int __cdecl   func1(int x);
MYAPI int __stdcall func2(int x);

#ifdef __cplusplus
}
#endif

Источник DLL:

#define MYAPI_EXPORTS
#include "x.h"int func1(int x)
{
return x*2;
}

int __stdcall func2(int x)
{
return x*3;
}

И использование:

#include <windows.h>
#include <stdio.h>

typedef int (__cdecl   *FUNC1)(int);
typedef int (__stdcall *FUNC2)(int);
int main()
{

HINSTANCE hDLL = LoadLibrary("x");
FUNC1 func1 = (FUNC1)GetProcAddress(hDLL, "func1");
#ifdef _WIN64
FUNC2 func2 = (FUNC2)GetProcAddress(hDLL, "func2");
#else
FUNC2 func2 = (FUNC2)GetProcAddress(hDLL, "_func2@4");
#endif
printf("%d %d\n",func1(5),func2(5));
}

Название украшения можно узнать с помощью dumpbin /exports <dll>, Обратите внимание, что x64 и x86 отличаются. Ниже для x86:

   ordinal hint RVA      name

2    0 00001010 _func2@4
1    1 00001000 func1
1

По вопросам рекламы [email protected]