gpt4 book ai didi

c++ - 带有 C++ DLL 的 Excel-VBA 有时会崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:42:09 25 4
gpt4 key购买 nike

我制作了非常简单的 c++ dll,只有一个函数:

int DLL_EXPORT __stdcall foo(double *source){return 0;}

我正在尝试这样使用它:

Option Explicit

Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPtr
Private Declare PtrSafe Function FreeLibrary Lib "kernel32" (ByVal hLibModule As LongPtr) As Long

Private Declare PtrSafe Function foo Lib "MyLibrary.dll" (ByRef arr As Double) As Long

Sub test_foo(n As Long)
Dim i As Long
Dim library_address As LongPtr
Dim library_path As String
library_path = "global_path\MyLibrary.dll"
library_address = LoadLibrary(library_path)

Dim arr() As Double
ReDim arr(1 To n) As Double

For i = 1 To n
arr(i) = CDbl(Cells(i, 1).Value)
Next

foo arr(1)

Do Until FreeLibrary(library_address) = 0
Loop

End Sub

它通常可以正常工作,但有时会崩溃(Excel 死机)。

Faulting application name: EXCEL.EXE, version: 16.0.8625.2139, time stamp: 0x5a162a41
Faulting module name: MyLibrary.dll_unloaded, version: 0.0.0.0, time stamp: 0x000000e2
Exception code: 0xc0000005
Fault offset: 0x00001230
Faulting process id: 0x1828

我已经在 Windows 10 上的 Excel 2016 和 Windows 8 上的 Excel 2013 上进行了测试请告诉我哪里出了问题?您有任何在数组上工作的 C++ DLL 的非崩溃用法示例吗?

解决方法:替换

Do Until FreeLibrary(library_address) = 0
Loop

FreeLibrary library_address

我已经把它放在循环中了,因为有时 FreeLibrary 不起作用,但我不在乎了。相关问题here

最佳答案

VBA 中的整数是从 -32768 到 32767。在 C++ 中它更大,相当于 VBA Long。因此,尝试这样声明:

Private Declare PtrSafe Function foo Lib "MyLibrary.dll"(ByRef arr As Double) As Long


让我展示一下我到目前为止所做的,这对我有用(如果这是您想要的方式)。无论如何,我已经改变了一些东西,最好使用一些文本比较器来查看一下)。


int __stdcall SimpleSlowMath(double *source)
{
return 0;
}

*.def 看起来像这样:

LIBRARY "SomeLibrary"
EXPORTS
SimpleSlowMath

VBA:

Option Explicit

Public Const myPathDll = "C:\Users\your-own-path\Debug\vityata051217.dll"

Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" _
(ByVal lpLibFileName As String) As Long
Private Declare PtrSafe Function FreeLibrary Lib "kernel32" _
(ByVal hLibModule As LongPtr) As Long
Private Declare PtrSafe Function SimpleSlowMath Lib "vityata051217.dll" _
(ByRef arr() As Double) As Long

Sub Try(n As Long)

Dim i As Long
Dim library_address As Long
Dim library_path As String
library_path = myPathDll
library_address = LoadLibrary(library_path)

Dim arr() As Double
ReDim arr(1 To n) As Double

For i = 1 To n
arr(i) = CDbl(Cells(i, 1).Value)
Next

Debug.Print SimpleSlowMath(arr)

End Sub

Public Sub TestMe()
Dim n As Long
For n = 1 To 50
Try n
Debug.Print n
Next n
End Sub

如您所见,不同之处在于我在这里用 () 声明数组 - ByRef arr() As Double,但还有一些其他的。试一试,对我来说它适用于 2000 个样本。

关于c++ - 带有 C++ DLL 的 Excel-VBA 有时会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47575675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com