Visual studio 2010 在visual studio 2010(visual c+;+;)中使用dll中的函数

Visual studio 2010 在visual studio 2010(visual c+;+;)中使用dll中的函数,visual-studio-2010,visual-c++,dll,Visual Studio 2010,Visual C++,Dll,我从我的项目中创建了一个dll,并使用extern“C”导出一个函数,如下代码所示: main.cpp extern "C" __declspec(dllexport) void __cdecl VectorOfMarker(char* InAdd,vector<NewMarker>& VectorMarkers) { DetectSeg d; d.VectorOfMarker(InAdd,VectorMarkers); } extern“C”

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

main.cpp

extern "C" __declspec(dllexport) void __cdecl  VectorOfMarker(char*     InAdd,vector<NewMarker>& VectorMarkers)
 {
    DetectSeg d;
    d.VectorOfMarker(InAdd,VectorMarkers);
 }
extern“C”\uuuu declspec(dllexport)void\uuuu cdecl向量机
{
检测G d;
d、 矢量标记器(InAdd,矢量标记器);
}
我成功地构建了项目并创建了.dll和.lib文件。 然后我创建了一个新的VisualC++项目,并尝试使用这个DLL和上面提到的函数。 虽然我将.dll和.lib文件复制到了同一个目录中,但我不能使用extern“C”将我的函数导入到第二个项目中。我认为我需要在VisualStudio2010中更改一些设置以使用这些函数 有人能帮我吗? 如何使用导出的函数


太多的提前感谢了

我想您对正在构建的dll类型感到困惑

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

另一种类型是显式链接,这很可能就是您正在做的事情。 通常,对于这种类型的DLL,使用.def文件导出函数,以生成未修饰的函数名。这也可以通过使用外部“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);
typedef void(*DLLVectorOfMarker)(char*,vector&);
HMODULE hMod=LoadLibrary(_T(“ExportTest.dll”);//你的名字在这里
dLvectorOfMarker PvVectorOfMarker=(dLvectorOfMarker)GetProcAddress(hMod,“向量Marker”);
矢量标记器;
PfInvectorOfMarker(“一些字符串”,矢量标记);