我有一个VC ++ win 32应用程序,它编译成一个EXE。但现在我想将它转换为dll,以便我可以在另一个应用程序中加载它。我尝试将.EXE中的Visual Studio属性更改为成功转换它的.DLL但是我使用GetProcAddress它总是返回NULL。我不确定我在做什么是对还是错。
基本上这就是我想要实现的目标:
修改 嗨,大家好,感谢您的意见。我告诉您们的意见。即便如此,我的GetProcAddress返回零。我做错了什么。显示我的dll加载代码如下。
HINSTANCE LoadMe = LoadLibrary( _T("D:\\VC++Project\\CVAList\\CVAList\\ExportTest.dll"));
if (LoadMe != 0)
printf("LoadMe library loaded!\n");
else
printf("LoadMe library failed to load!\n");
EntryPointfuncPtr LibMainEntryPoint;
LibMainEntryPoint = (EntryPointfuncPtr)GetProcAddress(LoadMe,"PrintFloatsVal");
LibMainEntryPoint (a1 ,a,b,c,d ); // 4 double
编辑 DLL导出代码
#define DllExport __declspec( dllexport )
DllExport void PrintFloatsVal ( int amount, double &d1 ,double &d2 , double &d3 ,double &d4)
{
....
..
}
答案 0 :(得分:2)
您需要使用__declspec dllexport
关键字导出您要访问的功能。
因此,如果将清单常量'BUILDING_MY_DLL'添加到项目中,则声明所关注函数的头文件可以在DLL项目和使用该DLL的任何代码中使用:
#ifdef BUILDING_MY_DLL
#define MY_DLL_EXPORT __declspec dllexport
#else
#define MY_DLL_EXPORT __declspec dllimport
#endif
装饰你想要导出的功能:
MY_DLL_EXPORT BOOL Func1(int a);
如果你想要访问的函数是用C ++实现的,它将被装饰,出于函数重载和其他目的的目的,它最好像任何其他函数一样直接访问。如果您希望使用GetProcAddress()
,那么最好通过使用extern "C" { ... }
包围函数来为其提供C-linkage。这将使导出的名称与代码中使用的名称相同。
参考:http://msdn.microsoft.com/en-us/library/a90k134d(v=vs.80).aspx