首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将dll添加到项目中并使函数正常工作

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

Stack Overflow用户
提问于 2011-01-19 10:40:11
回答 5查看 514关注 0票数 0

我必须做一个项目,我得到了dll和一个头文件,其中包含该项目所需的实现函数。我被告知只需将头文件添加到项目中,但这样,如果我尝试使用头文件中引用的函数,就会出现unresolve externals错误。那么,需要做些什么才能让一切正常工作呢?Visual Studio 2010。这是我拥有的文件:http://www.ipix.lt/images/33871682.png,这是头文件:

代码语言:javascript
复制
#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启动图形用户界面,并用这些函数传递信息。怎么启动这个东西?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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函数。

代码语言:javascript
复制
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)(); }
票数 3
EN

Stack Overflow用户

发布于 2011-01-19 10:46:27

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

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

票数 0
EN

Stack Overflow用户

发布于 2011-01-19 10:49:03

你需要从dll中导出函数,同时从exe中导入函数。像这样:

代码语言:javascript
复制
#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中,无需添加预处理器即可导入函数,因为默认情况下它将导入函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4731272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档