2013-01-09 158 views
0

我从我的项目做了一个DLL和使用的extern “C” 像下面的代码导出功能:在Visual Studio 2010(的Visual C++)使用函数从DLL

的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中更改一些设置以使用功能 任何人都可以帮助我解决这个问题吗? 如何使用我的导出功能?

提前

回答

0

太多的感谢,我认为你是困惑,你正在建设什么类型的dll。

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

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

要使用这种类型的DLL,您必须声明函数类型和参数,调用Load库和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);