Добавление DLL в проект и заставить работать функции - PullRequest
0 голосов
/ 19 января 2011

Мне нужно сделать один проект, и мне дали dll и файл заголовка с реализованными функциями, необходимыми для проекта. Мне сказали просто добавить файл заголовка в проект, но таким образом я получаю неразрешенную внешнюю ошибку, если я пытаюсь использовать функции, указанные в заголовке. Итак, что нужно сделать, чтобы все заработало? Visual Studio 2010. Вот файлы, которые у меня есть: http://www.ipix.lt/images/33871682.png И это заголовочный файл:

#ifndef __BIM482_RADAR__
#define __BIM482_RADAR__

int BIM482OpenRadar();
int BIM482AddPlane(double x, double y);
int BIM482SetPlaneColor(int planeidx, int coloridx);
int BIM482SetPlanePos(int planeidx, double x, double y);
void BIM482UpdateRadar();

#endif // __BIM482_RADAR__

Мне нужно запустить графический интерфейс с OpenRadar и передать информацию с этими функциями. Как начать эту вещь?

Ответы [ 5 ]

3 голосов
/ 19 января 2011

У вас нет .lib-файла для ссылки.

Может быть, это может вам помочь

http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/

или это:

http://support.microsoft.com/default.aspx?scid=kb;en-us;131313

или это:

http://www.asawicki.info/news_1420_generating_lib_file_for_dll_library.html

, когда вы сгенерировали lib-файл, вы должны использовать __declspec(dllimport) для ваших функций в заголовкеfile.

Альтернативой всему вышесказанному является использование LoadLibrary (...) в вашем источнике и запись функции-оболочки для этих функций в dll и вызов этих функций dll через GetProcAddress (...).

struct
{
   HMODULE hDll;

   int   (*BIM482OpenRadar)     (); 
   int   (*BIM482AddPlane)      (double x, double y); 
   int   (*BIM482SetPlaneColor) (int planeidx, int coloridx); 
   int   (*BIM482SetPlanePos)   (int planeidx, double x, double y); 
   void  (*BIM482UpdateRadar)   (); 
} dll_funcs = {0};

bool ExitRadar( LPCTSTR szDllPath )
{
   if (dll_funcs.hDll)
      FreeLibrary( dll_funcs.hDll );

   return true;
}

bool InitRadar( LPCTSTR szDllPath )
{
   if (dll_funcs.hDll)
      return true;
   dll_funcs.hDll = LoadLibrary( szDllPath );
   if (!dll_funcs.hDll)
      return false;

   dll_funcs.BIM482OpenRadar     = (int(*)())GetProcAddress( dll_funcs.hDll ,("BIM482OpenRadar") );
   dll_funcs.BIM482AddPlane      = (int(*)(double,double))GetProcAddress( dll_funcs.hDll ,("BIM482AddPlane") );
   dll_funcs.BIM482SetPlaneColor = (int(*)(int,int))GetProcAddress( dll_funcs.hDll ,("BIM482SetPlaneColor") );
   dll_funcs.BIM482SetPlanePos   = (int(*)(int,double,double))GetProcAddress( dll_funcs.hDll ,("BIM482SetPlanePos") );
   dll_funcs.BIM482UpdateRadar   = (void(*)())GetProcAddress( dll_funcs.hDll ,("BIM482UpdateRadar") ); 
   return true;
}

int   BIM482OpenRadar     () 
{ return (*dll_funcs.BIM482OpenRadar)(); }; 

int   BIM482AddPlane      (double x, double y)
{ return (*dll_funcs.BIM482AddPlane)( x ,y ); }

int   BIM482SetPlaneColor (int planeidx, int coloridx )
{ return (*dll_funcs.BIM482SetPlaneColor)( planeidx ,coloridx ); }

int   BIM482SetPlanePos   (int planeidx, double x, double y) 
{ return (*dll_funcs.BIM482SetPlanePos)( planeidx ,x ,y ); }

void  BIM482UpdateRadar   ()
{ return (*dll_funcs.BIM482UpdateRadar)(); }
0 голосов
/ 19 января 2011

Вы можете использовать Windows API LoadLibrary для загрузки библиотеки DLL во время выполнения, а затем GetProcAddress для получения адреса функции.Получив адрес функции, вы должны объявить сигнатуру метода, чтобы компилятор знал, как вызвать данную функцию.

Ниже приведен пример кода для того, как «связать» функцию с Dll:

HINSTANCE m_hExtDll = LoadLibrary( "SDL.dll" )
if (m_hExtDll)
{
    FARPROC m_pfnOpenRadar = GetProcAddress(m_hExtDll, "BIM482OpenRadar")
    if (m_pfnOpenRadar)
    {
        typedef int (*OPENRADARFUNC)();
        OPENRADARFUNC fnOpenRadar = (OPENRADARFUNC)m_pfnOpenRadar;

        int iRetCode = fnOpenRadar();
    }
}

Обратите внимание, что экспортируемые функции могут быть искажены, и вы можете проверить имя функции с помощью сторонней утилиты, такой как Dependency Walker .

0 голосов
/ 19 января 2011

Вам нужно будет экспортировать функцию из dll, а импортировать функцию из вашего exe.Например:

#if defined(XYZLIBRARY_EXPORT) // inside DLL 
#define XYZAPI   __declspec(dllexport) 
#else // outside DLL 
#define XYZAPI   __declspec(dllimport) 
#endif  // XYZLIBRARY_EXPORT 

int XYZAPI BIM482OpenRadar(); 
int XYZAPI BIM482AddPlane(double x, double y); 
int XYZAPI BIM482SetPlaneColor(int planeidx, int coloridx); 
int XYZAPI BIM482SetPlanePos(int planeidx, double x, double y); 
void XYZAPI BIM482UpdateRadar();  

В DLL я предлагаю добавить макрос и добавить XYZLIBRARY_EXPORT в препроцессор

Это экспортирует все ваши функции.

В EXE, импортируйте функцию без добавления препроцессора, так как она будет импортировать функцию по умолчанию.

0 голосов
/ 19 января 2011

Помимо включения заголовочных файлов, вам необходимо связать вашу программу с соответствующими библиотеками. Из вашего скриншота вы, похоже, имеете .a файлы, которые действительно являются библиотеками, но, к сожалению, они предназначены для использования с набором инструментов GCC и не будут работать с Visual Studio. Вам нужно либо получить .lib файлы, если вы должны использовать Visual Studio, либо иным образом переключиться на порт GCC, такой как MinGW .

0 голосов
/ 19 января 2011

Существует вызов Windows, который загружает DLL в ваше изображение.Вы можете добавить его в настройку компиляции в Visual Studio или загрузить его динамически.

Возможно, проще всего это сделать во время компиляции;Google "Параметры настройки Visual Studio".

...