我必须做一个项目,我得到了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并使用这些函数传递信息。如何开始这件事?
答案 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)验证函数名称。