我必须做一个项目,我得到了dll和一个头文件,其中包含该项目所需的实现函数。我被告知只需将头文件添加到项目中,但这样,如果我尝试使用头文件中引用的函数,就会出现unresolve externals错误。那么,需要做些什么才能让一切正常工作呢?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启动图形用户界面,并用这些函数传递信息。怎么启动这个东西?
发布于 2011-01-19 11:12:06
您没有要链接的.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-file后,必须对头文件中的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)(); }发布于 2011-01-19 10:46:27
有一个窗口调用将DLL加载到您的图像中。您可以将其添加到Visual Studio中的编译设置中,也可以动态加载它。
最简单的事情可能是在编译时做;谷歌"Visual Studio链接选项“。
发布于 2011-01-19 10:49:03
你需要从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(); 在动态链接库中,我建议添加一个宏,并在预处理程序中添加XYZLIBRARY_EXPORT
它将导出您所有的函数。
在EXE中,无需添加预处理器即可导入函数,因为默认情况下它将导入函数。
https://stackoverflow.com/questions/4731272
复制相似问题