开发者

Adding dll's to the project and making functions work

I have to do one project and I was given dll and a header file with implemented functions needed for the project. I was told just to add the header file to the project but this way i get unresolve externals error if i try to use functions referenced in header. So what needs to be done开发者_StackOverflow to make everything work? Visual Studio 2010. Here are the files i have: http://www.ipix.lt/images/33871682.png And this is header file:

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

I need to initiate gui with OpenRadar and pass information with those functions. How to start this thing?


You don't have a .lib-file to link against.

Maybe this can help you

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

or this:

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

or this:

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

when you have generated the lib-file ,you must use __declspec(dllimport) on yuor functions in the header file.

An alternative to all of the above is to use LoadLibrary(...) in your source and write wrapper function for those function in the dll and call those dll funcions via 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)(); }


There is a windows call that loads a DLL into your image. You can either add it to the compile setup in Visual Studio, or load it dynamically.

The easiest thing is probably to do it at compile time; google "Visual Studio llinking options".


You'll need to export the function from dll, while import the function from your exe. Like:

#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();  

In DLL, i suggest to add a macro, and add XYZLIBRARY_EXPORT in pre-processor

It will export all of your function.

In EXE, import the function, without adding pre-processor, as it will import the function by default.


In addition to including header files, you need to link your program with the corresponding libraries. From your screenshot, you seem to have .a files, which are indeed libraries, but unfortunately they are meant for use with the GCC toolchain and will not work with Visual Studio. You either need to get .lib files if you must use Visual Studio, or otherwise switch to a GCC port such as MinGW.


You may use windows API LoadLibrary to load the dll during runtime, followed by GetProcAddress to retrieve function address. With the function address is retrieved, you need to declare the method signature so that compiler know how to call given function.

Below is a sample code for how to "link" to function in 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();
    }
}

Do note that functions exported are subject to name mangling and you can verify the function name using third-party utility like Dependency Walker.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜