【问题标题】:Error accessing 64bit DLL function访问 64 位 DLL 函数时出错
【发布时间】:2018-01-26 17:29:46
【问题描述】:

我使用 Microsoft Visual Studio 2015 创建了一个 64 位 DLL 文件。 Visual C --> Win32 项目。

squareMain.c的代码如下:

 long _stdcall square(long a)
 {
  return a*a;
 }

Defile.def 的代码如下:

    LIBRARY "square"
    EXPORTS
    squareforExl=square

我已经使用配置管理器设置平台和活动解决方案平台为 64 位 DLL 构建了 x64 的 DLL。

我必须通过 Excel vba7 访问这个 DLL 函数。 VBA中的函数如下:

Private Declare PtrSafe Function squareforExl Lib "C:\math.dll" (ByVal x As Long) As Long

Sub square()
    Dim b As Long
    b = 5
    Dim c As Long
    Debug.Print b
    c = squareforExl(b)
    Debug.Print "Square : " & c
 End Sub

在上面的代码中尝试访问 DLL 函数 squareforExl() 时,它显示以下错误 msgBox:

Run time Error '53':  File not Found :"C:\math.dll"

我尝试将文件放在不同的位置目录中,甚至在系统文件夹中。

我已在 32 位版本的 Office 中成功编译并执行了 32 位 DLL。 我的问题是如何在 64 位版本的 Office 中访问 64 位 dll 的 DLL 函数?

【问题讨论】:

  • 您不能在 32 位进程中调用来自 64 位 DLL 的代码,反之亦然。您将需要更改为 64 位版本的 Office,或重新编译 DLL。
  • 是的,我正在尝试在 32 位 Office 环境中执行 32 位 dll,并尝试在两台不同机器上的 64 位 Office 环境中执行 64 位 dll。 C源代码和.def源代码已添加到帖子中。
  • 既然说文件不存在,那么C:\math.dll真的存在吗?可能你没有权限阅读这个。你试过C:\\math.dll吗?
  • 我已将 C:\math.dll 用于 32 位 dll 和 32 位办公环境。 C:\\math.dll 也适用于 32 位 DLL。此外,对于这两种情况,math.dll 也已放置在 D 和 E 驱动器中。上述两个路径更改都已完成,64 位 DLL 在 64 位环境下仍然存在相同的问题。
  • “找不到文件”来自系统意味着很多。这不是“打开失败”之类的。我会把dll放在系统路径中,不带路径引用它,便宜又快...

标签: c visual-studio excel dll vba


【解决方案1】:

请检查您的 Office 安装是 64 位安装还是 32 位安装。这意味着,如果 VBA 编辑器在 VBA7 中,并不意味着 office 是 64 位的。看来,您在 64 位操作系统上安装了 32 位办公室(即 2007 年后期版本,即 VBA7)。请在 32 位创建 DLL 并在 VBA 中使用 Ptrsafe(因为它是 VBA7),错误将被取消。对于 64 位操作系统上的 64 位 Office 安装,使用 Ptrsafe 调用 64 位 DLL 不会有任何问题。我会两种用法,即(1. 64 位操作系统上的 64 位办公室。2. 32 位办公室和 64 位操作系统上的 VBA7)和工作。

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    相关资源
    最近更新 更多