C ++代码:
typedef struct {
int bd_number; // number of boardset
int bd_copies; // how many copies
int bd_reserve; // only allocate if needed
} bd_t,*bd_p;
typedef struct boardset_info {
int bs_copies;
int bs_demand;
int bs_allocated;
int bs_ontable_avail;
int bs_ontable_needed;
pstatus bs_status;
int bs_played_sofar;
} bsi_t, *bsi_p;
FC_ERRORCODE dropin_boards(bd_p boards) {
int bs;
bs_info = (bsi_p) calloc(total_boardsets+1, sizeof(bsi_t));//total_boardsets=8
for (bs = 1; bs <= total_boardsets; bs++)
bs_info[bs].bs_status = PS_OUTPLAY;
while (boards->bd_number) { //boards-<bd_number is betweeen 1 and 8
if (boards->bd_number < 0 || boards->bd_number > total_boardsets)
{
debprint("***Error dropin_boards***\n");
debprint("boardsetnumber=%d\n",boards->bd_number);
return FC_ERR_PARAM;
}
//code does not reach this point
}
致电代码:
<StructLayout(LayoutKind.Sequential)>
Public Structure Flex_BoardSetInfo
Public SetNumber As Integer
Public Copies As Integer
Public IsReserve As Integer
End Structure
<DllImport("FlexCalc2.dll", CallingConvention:=CallingConvention.StdCall)>
Public Shared Function FlexCalcBoards(ByRef boards() As Flex_BoardSetInfo) As Flex_ErrorCode
End Function
Dim boardsets() = GetBoardSetInfo() // creates an arry of 8 BoardsetInfo Elements
_result = FlexCalcWrapper.FlexCalcBoards(boardsets)
在调试文件的最后一行记录了bd_p-&gt; board_number = 517237496! boardnumber初始化为1到8,我可以在代码传递给C ++ dll之前检查是否已正确完成。 我该如何解决这个问题?
编辑: 从VB6我们使用hack来使这个C ++方法工作:
Declare Function FlexCalcBoards Lib "FlexCalc2.dll" (firstBoard As BoardsetInfo)
ret=FlexCalcBoards(Boards(0))
所以,我们传递了数组的第一个元素而不是数组本身! (不呢?)幸运的是,Net不会因为这个伎俩而堕落......
答案 0 :(得分:2)
用ByVal替换ByRef。数组已经被编组为指针。
使用ByRef只匹配C侧的bd_t**
。
答案 1 :(得分:0)
嗯,答案和评论似乎表明没有任何错误,所以....
我发现了三件事:
1.即使在重建整个解决方案并将新的FlexCalc2.dll复制并粘贴到测试项目后,也不会替换位于Bin文件夹中的旧版本的副本。
2.我是C ++的新手,但是当方法只接收到指向它的指针时,你似乎无法使用LBound迭代数组到UBound。显示的方法使用了一种很好的方式来实现一种for each
,但是这里它不起作用,因为bd_p->boardnumber
返回一个非常高的数字(内存地址?),但bd_p[index].boardnumber
返回正确的数字在1-8范围内。我只是将数组的长度作为一个额外的参数发送到函数,我已经设置好了。 (把它称为穷人对我所关心的所有选择;-))
3. Hans Passant说得对,当C ++中的方法签名是theReturnValue theMethod(theStruct * theArray)
时,你必须传递数组ByVal
(在VB6中,这会产生语法错误,这是不可能的)。由于*
已在结构的typedef
中声明,因此传递指向数组的指针的事实并不是很明显。