将dll添加到项目中并使函数正常工作

时间:2011-01-19 02:40:11

标签: c++ visual-studio-2010 dll sdl

我必须做一个项目,我得到了dll和一个头文件,其中包含项目所需的已实现功能。我被告知只是将头文件添加到项目,但这样我得到unresolve外部错误,如果我尝试使用标头中引用的函数。那么需要做些什么来使一切运转起来呢? 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启动gui并使用这些函数传递信息。如何开始这件事?

5 个答案:

答案 0 :(得分:3)

您没有要链接的.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文件时,必须在头文件中的yuor函数上使用__declspec(dllimport)

上述所有方法的替代方法是在源代码中使用LoadLibrary(...)并在dll中为这些函数编写包装函数,并通过GetProcAddress(...)调用这些dll函数。

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

答案 1 :(得分:0)

有一个Windows调用将DLL加载到您的图像中。您可以将其添加到Visual Studio中的编译设置中,也可以动态加载它。

最简单的事情可能是在编译时这样做;谷歌“Visual Studio链接选项”。

答案 2 :(得分:0)

您需要从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中,导入该功能,而不添加预处理器,因为它将默认导入该功能。

答案 3 :(得分:0)

除了包含头文件外,还需要将程序与相应的库链接。从您的屏幕截图中,您似乎有.a个文件,这些文件确实是库,但遗憾的是它们与GCC工具链一起使用,不适用于Visual Studio。如果必须使用Visual Studio,则需要获取.lib文件,或者切换到MinGW等GCC端口。

答案 4 :(得分:0)

您可以使用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)验证函数名称。