1

最近我想开始用 Visual C++ Express 2010 构建一个 .dll 数学库。

我想将 .dll 用作 BOTHExcel VBAC#应用程序的库参考。我希望它可以在两个32bit/64bit窗口中工作。.dll 也应该能够在构建后被其他 PC 使用。

  1. 从使用 Win32 项目开始我是否正确?(似乎我不能ATL / MFC在 Express 版本中使用)

  2. 我是否需要在 .dll 中为 VBA 和 C# 指定 2 组不同的接口来加载函数?(VBA 需要使用 __stdcall)

  3. 在其他 PC 中使用 .dll 的任何部署设置?(需要任何 regsvr32 cmd 进程吗?)

  4. 制作 C++ DLL 以导出类的任何初学者示例?(例如 VBA / C# 可以从这个 dll 实例化一个新类)...

因为我不确定是否可以在 C++ .dll 中使用以下 .header 文件在 VBA/C# 中实例化 ClassA 和 ClassB:

#pragma once

#ifdef DLLDIR_EX
    #define DLLDIR  __declspec(dllexport)   // export DLL information
#else
   #define DLLDIR  __declspec(dllimport)   // import DLL information
#endif 

class DLLDIR ClassA
{
public:
   void AMethod1();
   void AMethod2();
};

class DLLDIR ClassB
{
public:
   void BMethodi();
   void BMethodii();
};
4

2 回答 2

1

您不能使用 C++ 构建导出 COM 类型或 C 样式函数的 DLL 文件,并让它在 32 位和 64 位环境中工作。DLL 文件是一种 PE/COFF 映像,PE 只支持每个文件一个 ISA(与 Macintosh 可执行格式相比,它允许在同一个映像文件中有多个 ISA)。您必须重新编译两次,一次用于 x86,另一次用于 x64。此规则的唯一例外是 .NET “AnyCPU” DLL,但这是另一回事。

根据此比较表,C++ Express 2010 不包含 x64 编译器,也不包含 MFC 和 ATL 库,尽管您可以将它们作为 Windows SDK 的一部分单独下载。

针对您的问题:

  1. 就我个人而言,我会从“空项目”模板开始——我不喜欢 Win32 模板提供的所有不必要的标题和(看似)复杂的初始项目设置。然后,我将自己手动添加自己的 .c/.h/.cpp 文件并删除代码。
  2. 如果您只是导出函数而不是 COM 类型,那么您无需担心接口。只要您的函数正确导出(参见此处:http: //msdn.microsoft.com/en-us/library/ys435b3s%28v=vs.80%29.aspx),它们就可以从.NET(包括 C#和 VB.NET)和 VB6/VBA 和 C/C++。
  3. “其他电脑”?
于 2013-03-09T11:31:39.280 回答
0

关于#2,您不需要两组接口,因为 C# 也可以使用 __stdcall 调用约定。

于 2013-03-09T11:30:35.743 回答