我在C / C ++中为VBA创建了一个.dll库。它将包含通过RS232串口进行通信的功能,数据将在Excel中处理。一切正常,但我对在Excel下工作的VBA的奇怪行为感到困惑。我有2个功能。一个用于写入端口1进行读取。当我发送端口号时,例如3从VBA到其中一个,无论是哪一个并且在它被函数接收之后就完全打印它显示3的十进制值是正确的。但是当我将包含数字3的完全相同的变量发送到第二个时,函数接收51什么是“3”字符的十进制值。所以在第一个VBA发送整数然后它以某种方式改变并发送十进制值“3”char。在我的函数中打印接收变量之前没有代码可以改变值。
这是我演示的函数的简化代码。
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
正如我所说,当我将一个变量发送到2个函数时,传递的值会有所不同,但是当我像下一个例子那样更改它时,两个函数都会收到相同的正确值。
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
如果已经问过这个问题,或者对于幼儿园的程序员是否有疑问,我道歉,但我很好奇。感谢。
答案 0 :(得分:2)
在VBA中尝试将ByRef
更改为ByVal
答案 1 :(得分:0)
发布的代码映射“integer = int”和“integer = short int”。这是什么? (你编译的是32位cpp还是64位cpp?)。
如果您的声明无效,Excel将修复堆栈,并且Excel不会崩溃,因此您不应该依赖于崩溃Excel来查找无效声明。
答案 2 :(得分:0)
当您从VBA ByRef调用C ++函数时,您可能希望在C ++函数中接收引用,例如
short int & Port
但VBA中的ByRef在C ++中意为“ByPointer”。
答案 3 :(得分:-2)
所以我发现了一个问题。正如你所建议的那样,我仔细研究了发送到函数ByRef的参数。经过几次实验,我发现了自己的错误我通过引用发送了一个数字,这意味着我只发送了内存的地址而不是值。然后我的第一个函数进行了一些计算,因为转换为char并创建字符串并保存了一个新的更改值,因为计算到以前的内存地址。因此,当我通过引用将变量发送到第二个函数时,保存在内存地址上的值已经被我的第一个函数更改了。所以我自己重写了变量的值。我应该向微软道歉,因为我在解决这个问题的过程中对我的产品所说的粗话。 :)谢谢伙伴