I am trying to invert matrix in VBA Excel 32bit by using Lapack DGETRF/DGETRI function from mkl_rt.dll, which placed in "compilers_and_libraries_2020.1.216\windows\redist\ia32_win\mkl" folder.
1. The issue is the Excel always quietly quits when the call is made.
2. I have just used the default mkl_rt.dll after install the MKL 2020 on my machine.
3. I follow this link and put all the dll together, but it still does not work:
4. I read some comments that I need to use STDCALL, however, I cannot find the method to use this function.
Private Declare Function dgetrf Lib "*path\mkl_rt.dll" _ (ByVal N As Integer, _ ByVal M As Integer, _ ByRef A As Double, _ ByRef LDA As Integer, _ ByRef IPIV As Integer, _ ByRef INFO As Integer) Private Declare Function dgetri Lib "*path\mkl_rt.dll" _ (ByVal N As Integer, _ ByRef A As Double, _ ByRef LDA As Integer, _ ByRef IPIV As Integer, _ ByRef WORK As Double, _ ByRef LWORK As Integer, _ ByRef INFO1 As Integer)
The using Subject
Public Sub NewMatrixSolver(ByVal Matrix1 As Matrix) Dim M, N, LDA, As Integer Dim INFO,INFO1 As Integer Dim A() As Double Dim IPIV() As Integer Dim i As Long Dim j As Long '' copy value from matrix1 to A array ReDim A(1 To MRows, 1 To MCols) As Double For i = 1 To MRows For j = 1 To MCols A(i, j) = Matrix1.GetValue(i, j) '' in-house function - tested Next Next ReDim IPIV(1 To MRows) As Integer For i = 1 To MRows IPIV(i) = 0 Next ''CALL recursive LU algorithm M = MRows N = MCols LDA = MRows INFO = 0 Call dgetrf(M, N, A(1, 1), LDA, IPIV(1), INFO) If INFO <> 0 Then MsgBox ("Error: Unable to invert matrix.") Stop End If ''CALL inverse of a matrix using the LU factorization LWORK = MRows INFO1 = 0 Call dgetri(N, A(1, 1), LDA, IPIV(1), WORK, LWORK, INFO1) If INFO1 <> 0 Then MsgBox ("Error: Unable to invert matrix.") Stop End If '' Use inverted Matrix A end sub
Please let me know if you guys need more information.
PS: I used to post this question in the post below when using dll built from Netlib and I will update the post after solving this issue.
Thank you for reading.
I have an update about this issue:
After changing all ByVal into ByRef in both DGETRF/DGETR declaring, the 64bit DLL can work correctly with Excel 64bit.
However, when I'm moving on 32bit DLL and 32bit Excel, the "Bad DLL calling convention (Error 49)" appears. I used the build DLL by Intel mkl_2020 which is mkl_rt.dll, could anyone give instruction on how to fix this error?
Thank you a lot for reading