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中容易索引?
謝謝!語法沒有任何意義,但因爲它是這樣的...並且看着你的代碼也提醒我實際初始化結構並使用arr.result而不是返回值(不能相信我忘記了這些! )。返回值仍然是錯誤的,但這是另一個問題。謝謝! –
@RonanPaixão - 不,它沒有任何意義 - 歡迎來到一個錯誤的VBA的美妙世界。 – Comintern