0

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

主文件

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 中的一些设置才能使用这些功能有人可以帮我吗?如何使用导出的函数?

非常感谢提前

4

1 回答 1

0

我认为您对正在构建的 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);
于 2013-01-10T14:02:02.890 回答