C++ Excel或VBA的奇怪行为

C++ Excel或VBA的奇怪行为,c++,excel,vba,function,C++,Excel,Vba,Function,我正在用C/C++为VBA创建一个.dll库。它将包含通过RS232串行端口进行通信的功能,数据将在Excel中处理。一切正常,但我对在Excel下工作的VBA的奇怪行为感到困惑。我有两个功能。一个用于写入端口1以进行读取。当我从VBA向其中一个发送端口号(如3)时,无论是哪一个端口号,在函数接收到端口号后将其打印出来,它会显示正确的十进制值3。但是,当我将完全相同的变量(由数字3组成)发送到第二个变量时,函数接收51,即3个字符的十进制值。所以,首先VBA发送整数,然后它以某种方式更改,并发送

我正在用C/C++为VBA创建一个.dll库。它将包含通过RS232串行端口进行通信的功能,数据将在Excel中处理。一切正常,但我对在Excel下工作的VBA的奇怪行为感到困惑。我有两个功能。一个用于写入端口1以进行读取。当我从VBA向其中一个发送端口号(如3)时,无论是哪一个端口号,在函数接收到端口号后将其打印出来,它会显示正确的十进制值3。但是,当我将完全相同的变量(由数字3组成)发送到第二个变量时,函数接收51,即3个字符的十进制值。所以,首先VBA发送整数,然后它以某种方式更改,并发送3个字符的十进制值。在我的函数中打印收到的变量之前,没有可以更改值的代码

这里是我的函数的简化代码,只是为了说明

int __stdcall PortRead(short int & Port){
   printf("%d   %c\n",Port,Port);
   return 0;
}

int __stdcall PortWrite(short int & Port, BSTR & Message){
   printf("%d   %c\n",Port,Port);
   return 0;
}
以下是VBA代码:

Declare Function PortRead Lib "rs232_r.dll" (ByRef x As Integer) As Integer
Declare Function PortWrite Lib "rs232_w.dll" (ByRef x As Integer, ByRef y As String) As Integer
Dim Message As String
Dim PortNumber As Integer

Sub Example()
PortNumber = 3
Message = ":trac:data?"
aa = PortWrite(PortNumber, Message)
Debug.Print aa
xx = PortRead(PortNumber)
Debug.Print xx
End Sub
正如我所说的,当我向两个函数发送一个变量时,传递的值将不同,但当我像下一个示例一样更改它时,两个函数将接收相同的正确值

Declare Function PortRead Lib "rs232_r.dll" (ByRef x As Integer) As Integer
Declare Function PortWrite Lib "rs232_w.dll" (ByRef x As Integer, ByRef y As String) As Integer
Dim Message As String
Dim PortNumber1 As Integer
Dim PortNumber2 As Integer
Dim Number As Integer

Sub Example()
Number = 3
PortNumber1 = Number
PortNumber2 = Number
Message = ":trac:data?"
aa = PortWrite(PortNumber1, Message)
Debug.Print aa
xx = PortRead(PortNumber2)
Debug.Print xx
End Sub

我道歉,如果这个问题已经被问过,或者这是一个幼儿园程序员的问题,但我很好奇。谢谢。

在VBA中尝试将ByRef更改为ByVal,因此我发现了一个问题。正如您所建议的,我仔细查看了发送给函数ByRef的参数。经过几次实验,我发现了我的错误。我通过引用向函数发送了一个数字,这意味着我只发送了内存地址,而不是值。然后,我的第一个函数进行了一些计算,因为它转换为char并创建了string,并保存了一个新的更改值,因为计算到了以前的内存地址。所以,当我也通过引用将变量发送到第二个函数时,保存在内存地址上的值已经被第一个函数更改了。所以我自己重写变量的值。我应该向微软道歉,因为我在解决这个问题时对微软的产品说了一些粗鲁的话谢谢你,伙计们发布的代码映射了integer=int和integer=short int。它是哪一个?您是在编译32位cpp还是64位cpp


Excel将修复栈,如果您的声明无效,Excel不会崩溃,因此您不应依赖于崩溃Excel来查找无效声明。

< P>当您从VBA ByReF调用C++函数时,您可能期望在C++函数中接收引用,如

short int & Port

但VBA中的ByRef是C++中的ByPointer。< /P>返回值类型声明是错误的。它是长的,不是整数。不太可能是问题的原因。对于参数也要使用Long,用ByVal而不是ByRef传递。文本portnum中描述的问题已更改,与代码函数中说明的问题不返回零不同。如果你的意思是PurnNm已经改变了,请纠正代码显示调试打印PothNoM.如果来自Cybasuu的答案已经帮助了你,那么请考虑接受它而不是复制它。