2016-11-16 46 views
0

我有一個C DLL,它定義一個結構和功能,需要一個指向它的指針:如何構建一個Type以傳遞給一個DLL函數,該函數需要一個指向帶有數組的內部結構的指針?

頭:

typedef struct { 
    double arr[10]; 
    double anotherParam; 
    double result; 
} CStruct_t; 

int __stdcall CFunction(CStruct_t * c_struct); 

源:

int __stdcall CFunction(CStruct_t * c_struct) { 
    double sum = 0.0; 
    for (int i = 0; i < 10; ++i) { 
     sum += c_struct->arr[i]; 
    } 
    c_struct->result = sum * c_struct->anotherParam; 
} 

我可以適當在C中使用類似的DLL:

CStruct_t my_struct = {{0,1,2,3,4,5,6,7,8,9}, 2, 0}; 
CFunction(&my_struct); 
printf("Result = %f ", my_struct.result); 

但是,我想在Excel中使用它。因此,我在VBA嘗試這樣做:

Private Declare Function CFunction Lib "cstruct.dll" (ByRef c_struct As CStruct_t) As Long 

Type CStruct_t 
    arr(10) As Double 
    anotherParam As Double 
    result As Double 
End Type 

Sub TryCStruct() 
    Dim prev_path As String 
    prev_path = CurDir 
    ChDir ThisWorkbook.Path 
    Dim cs As CStruct_t 
    For i = LBound(cs.arr) To UBound(cs.arr) 
     cs.arr(i) = i 
    Next 
    cs.anotherParam = 2 
    MsgBox "Retval =" & CFunction(cs) 
    MsgBox "Result = " & cs.result 
    ChDir prev_path 
End Sub 

但是,儘管工作時,它會返回不正確的結果(42988244,而不是90)。我認爲這是因爲VBA數組是SAFEARRAYs而不是像C這樣的固定大小的數組,但this page讓我認爲固定大小的數組也應該在內存中固定。

無論如何,我見過將指針傳遞給數組中的數據的示例,但我找不到使用混合類型的任何內容。

是否有任何方法來正確分配VBA中的內存並將結構指針傳遞給DLL,或者我必須以某種方式管理它在C中的所有或將每個數組元素聲明爲結構的成員,並忘記在VBA中容易索引?

回答

2

的VBA聲明應該是:

Type CStruct_t 
    arr(9) As Double 
    anotherParam As Double 
    result As Double 
End Type 

在VBA數組聲明的數量是數組的上限(基0),元件的像在C.數在VBA,arr(10) As Double相當於double arr[11];中C.

強制性演示代碼:

Sub Bounds() 
    Dim foo As CStruct_t, i As Long 
    For i = LBound(foo.arr) To UBound(foo.arr) 
     Debug.Print i 
    Next 
End Sub 
+0

謝謝!語法沒有任何意義,但因爲它是這樣的...並且看着你的代碼也提醒我實際初始化結構並使用arr.result而不是返回值(不能相信我忘記了這些! )。返回值仍然是錯誤的,但這是另一個問題。謝謝! –

+1

@RonanPaixão - 不,它沒有任何意義 - 歡迎來到一個錯誤的VBA的美妙世界。 – Comintern

相關問題