2015-10-16 114 views
0

我嘗試從VB到C++傳遞一個雙精度數組(並希望最終以相反的方式)。從VB到C++傳遞double數組dll

我已經看了幾頁,這似乎表明,看起來有點像一個方法如下(但更多的參數傳遞在mydll.cpp到myfun): 在C++(mydll.cpp)

extern __declspec(dllexport) int __stdcall myfun(LPSAFEARRAY FAR arrayCppIn) 
{ 
    double *pArray; 
    pArray = (double*)((*arrayCppIn)->pvData); 
    double testvar = pArray[0] 
} 

這與VB代碼(vbtestcppdll)在一起:

Public Declare Function myfun Lib "mydll.dll" (ByRef arrVBout() As Double) As Integer 

Dim result As Integer 
Dim testarr = New Double {1.1, 2.5, 6} 
result = myfun(testarr) 

在調試模式(MSVS2013),只要我達到德double testvar = pArray[0]我得到「型 'System.AxxessViolationException' 未處理的異常在vbtestcppdll occurded。 exe「 再下來它說「這通常表明內存已損壞」。 PLSAFEARRAY的cDims,cbElements,cElements似乎都是腐敗的。

標量(整數和雙精度)都按照他們的要求進行。

任何人有任何想法?

(我得到了幫助: http://www.flipcode.com/archives/Interfacing_Visual_Basic_And_C.shtml

+0

粒子陣列=(雙*)((* arrayCppIn ) - > pvData); 你真的想要雙重間接到arrayCppIn或應該是pArray =(double *)((* arrayCppIn).pvData);或者pArray =(double *)(arrayCppIn-> pvData);我沒有任何類型文件在我面前,但這是一個猜測。您可能可以使用此行的調試器來確定您期望看到的內容。 – Sammy

+0

不應該是'pArray =(double *)(arrayCppIn-> pvData);'。你的例子甚至不應該是可編譯的。 –

+0

不需要,它需要所有的* s,否則它不會編譯。 AFAIU LPSAFEARRAY是一個指向SAFEARRAY –

回答

0

由於@Hans帕桑特的評論,答案是在VB中聲明功能

Public Declare Function myfun Lib "mydll.dll" (<MarshalAs(UnmanagedType.SafeArray)> ByRef arrVBout() As Double) As Integer