1

我有一个编译成 EXE 的 VC++ win 32 应用程序。但是现在我想将它转换为 dll 以便我可以将其加载到另一个应用程序中。我尝试将 Visual Studio 属性从 .EXE 更改为 .DLL ,它成功地转换了它,但是当我使用 GetProcAddress 时它总是返回 NULL 。我不确定我在做什么是对还是错。

基本上这是我想要实现的:

  1. 我想链接项目 1 和项目 2
  2. 项目2应该能够调用项目1的功能(这是一个exe currenlty)

编辑 大家好,感谢您的意见。我告诉了你们所说的。即使这样,我的 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)
{
....
..
}
4

1 回答 1

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" { ... }. 这将使导出的名称与代码中使用的名称相同。

参考: http: //msdn.microsoft.com/en-us/library/a90k134d (v=vs.80).aspx

于 2011-03-27T09:35:07.397 回答