VBA Excel DLL参数问题 – 第6章Arg

所以我有这个调用DLL代码的VBA代码。 DLL代码工作正常,VBA代码工作正常,直到我去从VBA调用DLL函数。 由于某些原因,它没有正确传递第六个参数。 我通过添加第七个参数并在第六个和第七个参数中传递相同的值进行了testing – 第七个传递正确,第六个传递相同的大(不正确)的值。 我不知道发生了什么事。

VBA:

Option Explicit ' Declare the LMM Function that's in the DLL Declare PtrSafe Function GenCudaLMMPaths Lib "C:\Path to DLL\LMMExcel.dll" Alias "GenerateCUDALMMPaths" (xTimes#, xRates#, xVols#, xRData#, ByRef ArrLen As Long, ByRef NPaths As Long) As Long ' Generate LMM Paths on Click Sub LMM_Click() Dim Times#(), Rates#(), Vols#() Dim x As Long Dim y As Long Dim rTimes As Range Dim rRates As Range Dim rVols As Range Dim cell As Range Dim sz As Long sz = 15 ' Resize ReDim Times(sz), Rates(sz), Vols(sz) ' Fill in Data Set rTimes = Sheets("Market").Range("C2:Q2") x = 1 For Each cell In rTimes Times(x) = cell.Value x = x + 1 Next Set rRates = Sheets("Market").Range("C5:Q5") x = 1 For Each cell In rRates Rates(x) = cell.Value x = x + 1 Next Set rVols = Sheets("Market").Range("C4:Q4") x = 1 For Each cell In rVols Vols(x) = cell.Value / 10000 x = x + 1 Next 'Call the Function Dim np As Long np = Sheets("LMM").Range("C2").Value Dim useCuda As Boolean If Sheets("LMM").Range("C3").Value = "GPU" Then useCuda = True Else useCuda = False End If Dim rData#() Dim rValue ReDim rData(np * sz * (sz + 3)) rValue = GenCudaLMMPaths(Times(1), Rates(1), Vols(1), rData(1), sz, np) If rValue = -1 Then 'No CUDA Card MsgBox ("Your system doesn't have a CUDA Enabled GPU") ElseIf rValue = 1 Then 'Error Occurred MsgBox ("An error occurred while trying to generate LMM paths") ElseIf rValue = 0 Then 'Success ' Need to reformat return data Dim fmtData() ReDim fmtData(np * sz, sz) Dim i, j, k For i = 0 To np - 1 For j = 0 To np - 1 For k = 0 To np - 1 fmtData(((i * sz) + j) + 1, k + 1) = rData(((i * sz * sz) + (j * sz) + k) + 1) Next k Next j Next i 'Fill in data Sheets("LMM").Range("A8:K" & (np * sz)) = fmtData Else 'Too many requested paths for this CUDA card MsgBox ("In order to prevent GPU Lock-up, you cannot request more than " & rValue & " paths.") Sheets("LMM").Range("C2").Value = rValue End If End Sub 

DLL函数声明:

 int __stdcall GenerateCUDALMMPaths(double* arrTimes, double* arrRates, double* arrVols, double* retData, int& ArrLength, int& NPaths); 

DEF文件:

 LIBRARY "CUDAFinance" EXPORTS CheckExcelArray = CheckExcelArray GenerateLMMPaths = GenerateLMMPaths GenerateCUDALMMPaths = GenerateCUDALMMPaths 

任何人有任何想法吗? 我完全失去了。

我遇到了同样的问题,并得到如下解决。

由于在六个参数函数中已经有了一个很长的variables,因此将Arrlen和NPr一起作为一个数组导入,而不添加第七个参数:

1)在VBA中:

声明一个两元素数组:

昏暗NArrLenNPaths(1)只要

然后,分配值:

NArrLenNPaths(0)包含ArrLen和NArrLenNPaths(1)NPaths值。

保持函数在VBA中的释放,但是在调用它时,把NArrLenNPaths(0)作为第6个参数。 不要提出第七个理由。 C ++将按如下方式检索这两个值。

2)在C ++中使用一个指针:

将第六个参数更改为

int * NArrLenNPaths

然后通过检索值

int NArrLen = NArrLenNPaths [0];

int NPaths = NArrLenNPaths [1];