【问题标题】:use a function from dll in visual studio 2010(visual c++)在 Visual Studio 2010(Visual C++)中使用来自 dll 的函数
【发布时间】:2012-12-23 16:47:53
【问题描述】:

我从我的项目中创建了一个 dll,并使用 extern "C" 导出了一个函数,如下面的代码:

main.cpp

extern "C" __declspec(dllexport) void __cdecl  VectorOfMarker(char*     InAdd,vector<NewMarker>& VectorMarkers)
 {
    DetectSeg d;
    d.VectorOfMarker(InAdd,VectorMarkers);
 }

我构建了项目并成功创建了 .dll 和 .lib 文件。 然后我创建了一个新的 Visual c++ 项目并尝试使用这个 dll 和其中提到的函数。 虽然我将 .dll 和 .lib 文件复制到同一个目录,但我不能使用 extern "C" 将我的函数导入到第二个项目。我认为我需要更改 Visual Studio 2010 中的一些设置才能使用这些功能 任何人都可以帮助我吗? 如何使用导出的函数?

提前非常感谢

【问题讨论】:

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


    【解决方案1】:

    我认为您对正在构建的 dll 类型感到困惑。

    有两种类型的动态链接隐式和显式 . 要隐式动态链接 dll,您需要创建导出一些函数和/或变量的 dll。这将创建一个 DLL 模块和 .lib 导入库。使用这种类型的 dll 的模块,必须有带有函数原型的头文件,并且必须与 .lib 导入库链接。 所以你在编译时链接。由于导出是使用 __declspec(dllexport) 和 __declspec(dlleimport) 完成的,并且导出的函数名称被修饰(损坏)。它们看起来像 ?ExportedTest@@YAXPAD@Z。

    另一种类型是显式链接,这很可能是您正在做的事情。 通常这种类型的 DLL 函数使用 .def 文件导出以生成未修饰的函数名称。这也可以通过使用 extern "C" 修饰符来告诉 C++ 编译器将函数编译为 C 风格来实现,因此导出的函数没有修饰并且使用 _(下划线)。

    要使用这种类型的 DLL,你必须声明函数类型和参数,调用 Load library,并调用 GetProcAddress 来获取函数指针。然后你就可以拨打如下电话了:

    typedef void (*DLLVectorOfMarker)(char*, vector<int>&);
    
    HMODULE hMod = LoadLibrary(_T("ExportTest.dll")); // your lib name goes here
    
    DLLVectorOfMarker pfnVectorOfMarker = (DLLVectorOfMarker)GetProcAddress(hMod, "VectorOfMarker");
    
    
    vector <int> VectorMarkers;
    
    pfnVectorOfMarker("some string", VectorMarkers);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 2013-01-02
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多