C++ 从VBA传递参数的开关盒-参数不兼容
这是我遇到的一种奇怪的行为。 我为用户提供了一个Visual Basic界面C++ 从VBA传递参数的开关盒-参数不兼容,c++,vba,if-statement,dll,switch-statement,C++,Vba,If Statement,Dll,Switch Statement,这是我遇到的一种奇怪的行为。 我为用户提供了一个Visual Basic界面 Declare PtrSafe Sub getPEC _ Lib "C:\Users\...somePath...\OPunit0011PUMP.dll" _ (ByVal typeOfPump As Integer, _ ByVal outflow As Double, _ ByRef pec As Double, _ ByRef RV As Integer) 用户通过泵的整数类型指定泵。我将这个参数作为ByVal
Declare PtrSafe Sub getPEC _
Lib "C:\Users\...somePath...\OPunit0011PUMP.dll" _
(ByVal typeOfPump As Integer, _
ByVal outflow As Double, _
ByRef pec As Double, _
ByRef RV As Integer)
用户通过泵的整数类型指定泵。我将这个参数作为ByVal typeOfPump传递到我的C++ DLL中。
这里,根据泵的类型,使用开关盒初始化一些预先声明的参数a,…g
extern "C"
{
double PEC_backUp;
void __stdcall getPEC(int typeOfPump, double outflow, double &PEC, int &RV)
{
//polynomal trendline for different pumps
//y = a x^6 + b x^5 + c x^4 + d x^3 + e x^2 + f x^1 + g x^0
if (typeOfPump < 1)
{
RV = -1;
return;
}
double a, b, c, d, e, f, g;
#pragma region switch case
switch (typeOfPump)
{
//150 bar
case 1:
a = 1.1186E-08;
b = -1.49172E-05;
//...
break;
case 2:
//...
}
尽管事实上typeOfPump被分配给NINE,这显然比一大,但我的函数getPEC此时不会返回。另一方面,如果我写
if (typeOfPump < 1)
{
RV = -1;
return;
}
并获得正确的值。然而,pec的价值仍有一些变化
SCD编辑:我有64位,Excel是32位,我用x86编译。
我在另一台64位的计算机上写了一个类似的程序,Excel 64位,用x64编译。成功了
在C++环境中,VC++中的< <强> >值> <强>>9 < /强>导致C++中的<强> -65526</>强,在C++环境中给定整数为第三字节。假设整数的16位变量范围为−32768到32767。将32767加倍并减去9通常会导致65525如果您不确定代码为什么不起作用,请打印出您确定的值,并查看它们是否与您认为的值相同。特别是当混合使用32位和64位代码时。有各种各样的编译器选项,它们在使用时会影响数据格式
将代码编写为独立的exe,确保其正常工作;尽可能简单地使用握手编写dll,确保其正常工作,然后将exe设置为dll。您试图在一个步骤中完成太多的工作。一般来说,如果您不确定代码为什么不工作,请打印出您确定的值,并查看它们是否与您认为的值相同。特别是当混合使用32位和64位代码时。有各种各样的编译器选项,它们在使用时会影响数据格式
将代码编写为独立的exe,确保其正常工作;尽可能简单地使用握手编写dll,确保其正常工作,然后将exe设置为dll。您试图在一步中完成太多的工作。我认为这是一个VBA问题,而不是VB.net:
PtrSafe
是一个VBA关键字,用于标记可以从64位Excel安全调用的函数。查看32/64位兼容性。正确,OP还进行了一次编辑,删除了我的注释。VBAInteger
为16位。您是否已在dll中打印出泵的类型并查看了其值?很抱歉,回复太晚。如果输入值为9,则我的MessageBox打印:-65526。在我的示例中,DLL中的整数变量包含4个字节(使用sizeof运算符)。我还读取了VBA的整数有32位,所以分别有4个字节(比较:),或者我在某个点上被误导了。无论如何,我如何防止这个错误?我认为这是一个VBA问题,而不是VB.net:PtrSafe
是一个VBA关键字,用于标记可以从64位Excel安全调用的函数。查看32/64位兼容性。正确,OP还进行了一次编辑,删除了我的注释。VBAInteger
为16位。您是否已在dll中打印出泵的类型并查看了其值?很抱歉,回复太晚。如果输入值为9,则我的MessageBox打印:-65526。在我的示例中,DLL中的整数变量包含4个字节(使用sizeof运算符)。我还读取了VBA的整数有32位,所以分别有4个字节(比较:),或者我在某个点上被误导了。无论如何,我如何防止此错误?这并没有提供问题的答案,您应该将其发布在评论部分。这并没有提供问题的答案,您应该将其发布在评论部分。
if (typeOfPump < 1)
{
RV = -1;
return;
}
RV = typeOfPump * (int)outflow;