【发布时间】:2017-11-30 14:21:16
【问题描述】:
我用一个函数制作了非常简单的 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
【问题讨论】:
-
"但有时它会崩溃(Excel 死掉)。"请更具体。
-
我不能更具体... Excel 尝试“解决问题”,放弃并重新打开。它随机崩溃。有时在第二次运行后,有时在第 200 次运行后。