目标:
在VBA(目前在VB环境下调试)环境下实现一段C++程序的功能。情景:
计算机连接一USB接收塔,等待外部传入信号。软件环境:
C++程序源代码。EXCEL XP, VB 6, VC++ 6, MSDN。USB接收塔驱动。
==================================================================问题:指针类型如何转入VB? 我把不解的地方在下面的代码上标出来了。C++代码:int unpackRcxMessage(BYTE* pbyMessage, int nBytes, BYTE* pbyCommand)
//////////////////////////////////
//此处*是指直接读取变量的值?VB中如何表达?ByVal pbyMessage As Byte,
//ByVal nBytes As Long, ByVal pbyCommand As Byte?
//////////////////////////////////
{
int m = 0;
int n = 0;
int sum = 0; // Make sure it has the right header format: 0x55 0xFF 0x00
if ((pbyMessage[n++] != 0x55) || (pbyMessage[n++] != 0xFF) || (pbyMessage[n++] != 0x00))
{return 0;}
//////////////////////////////////
//此处pbyMessage[n++],如何在VB中表达?
//////////////////////////////////
// Verify that every 2nd byte is a 1's complement of the byte before it,
// and calculate the checksum:
while (n < (nBytes-2))
{
// Every other byte should be a complement:
if (pbyMessage[n] != (0xFF & (~pbyMessage[n+1])))
//////////////////////////////////
//此处(0xFF & (~pbyMessage[n+1]))如何转换?
//////////////////////////////////
{return 0;}
//////////////////////////////////
//return 0;是否等同于functionname=0 exit function?有没有更简单的方法?
//////////////////////////////////
pbyCommand[m++] = pbyMessage[n];
sum += pbyMessage[n]; n += 2;
}
...
}
int main(int argc, char* argv[])
{
BYTE byBuffer[256];
BYTE byCommand[128];
DWORD dwBytes = 0;
DWORD dwNewBytes = 0;
int n;
...
while (!kbhit())
{
// See if there is a new byte of input available:
dwNewBytes = 0; if ((ReadFile(hUsbTower, byBuffer+dwBytes, 1, &dwNewBytes, NULL))
&& (dwNewBytes > 0))
{
dwBytes = dwBytes + dwNewBytes; for (n=0; (n+9)<=dwBytes; n++)
{
if (2 == unpackRcxMessage(byBuffer, 9, byCommand))
{
if (0xF7 == byCommand[0])
printf("Message Received: 0x%02X\n", byCommand[1]); dwBytes = dwBytes - (n + 9);
}
}
// Otherwise, discard the first byte in the buffer and test again:
if (dwBytes >= 9)
{
for (int n=0; n<(dwBytes-1); n++)
byBuffer[n] = byBuffer[n+1];
dwBytes -= 1;
}
}
}
...
}谢谢大家!
在VBA(目前在VB环境下调试)环境下实现一段C++程序的功能。情景:
计算机连接一USB接收塔,等待外部传入信号。软件环境:
C++程序源代码。EXCEL XP, VB 6, VC++ 6, MSDN。USB接收塔驱动。
==================================================================问题:指针类型如何转入VB? 我把不解的地方在下面的代码上标出来了。C++代码:int unpackRcxMessage(BYTE* pbyMessage, int nBytes, BYTE* pbyCommand)
//////////////////////////////////
//此处*是指直接读取变量的值?VB中如何表达?ByVal pbyMessage As Byte,
//ByVal nBytes As Long, ByVal pbyCommand As Byte?
//////////////////////////////////
{
int m = 0;
int n = 0;
int sum = 0; // Make sure it has the right header format: 0x55 0xFF 0x00
if ((pbyMessage[n++] != 0x55) || (pbyMessage[n++] != 0xFF) || (pbyMessage[n++] != 0x00))
{return 0;}
//////////////////////////////////
//此处pbyMessage[n++],如何在VB中表达?
//////////////////////////////////
// Verify that every 2nd byte is a 1's complement of the byte before it,
// and calculate the checksum:
while (n < (nBytes-2))
{
// Every other byte should be a complement:
if (pbyMessage[n] != (0xFF & (~pbyMessage[n+1])))
//////////////////////////////////
//此处(0xFF & (~pbyMessage[n+1]))如何转换?
//////////////////////////////////
{return 0;}
//////////////////////////////////
//return 0;是否等同于functionname=0 exit function?有没有更简单的方法?
//////////////////////////////////
pbyCommand[m++] = pbyMessage[n];
sum += pbyMessage[n]; n += 2;
}
...
}
int main(int argc, char* argv[])
{
BYTE byBuffer[256];
BYTE byCommand[128];
DWORD dwBytes = 0;
DWORD dwNewBytes = 0;
int n;
...
while (!kbhit())
{
// See if there is a new byte of input available:
dwNewBytes = 0; if ((ReadFile(hUsbTower, byBuffer+dwBytes, 1, &dwNewBytes, NULL))
&& (dwNewBytes > 0))
{
dwBytes = dwBytes + dwNewBytes; for (n=0; (n+9)<=dwBytes; n++)
{
if (2 == unpackRcxMessage(byBuffer, 9, byCommand))
{
if (0xF7 == byCommand[0])
printf("Message Received: 0x%02X\n", byCommand[1]); dwBytes = dwBytes - (n + 9);
}
}
// Otherwise, discard the first byte in the buffer and test again:
if (dwBytes >= 9)
{
for (int n=0; n<(dwBytes-1); n++)
byBuffer[n] = byBuffer[n+1];
dwBytes -= 1;
}
}
}
...
}谢谢大家!
解决方案 »
- 如何实现,当程序一段时间无键盘输入或者鼠标输入时,程序自动锁定,输入密码才能进入(类似证券软件)
- 100分探求VB开发嵌入式数据库的方法
- 紧急求助!!!VB自动跳转到Crystal Reports的方法?
- DDE,DDE,DDE,DDE,DDE,DDE,请知道用的进来指点一二。
- 菜鸟求救:鼠标问题
- 想使自己的程序直接执行写入注册表
- 如何在vb中连接远程的access数据库!
- vb java vrml 原码放送!!!hwmfly两年的心血,毕业了愿与广大网友共享编程乐趣
- 请问在VB中如何实现mdb文件格式与文本文件格式互相转换,尽量给出详细的代码,急需,谢谢了!
- 怎样确定系统安装在哪个盘上
- 模块中定义带事件的对象
- 如何获得运行sql server的服务器的时间?
//此处*是指直接读取变量的值?VB中如何表达?ByVal pbyMessage As Byte,
//ByVal nBytes As Long, ByVal pbyCommand As Byte?
//////////////////////////////////方法:
定义一个long型和byte型的变量,然后用copymemory这个api进行赋值
//////////////////////////////////
//此处pbyMessage[n++],如何在VB中表达?
//////////////////////////////////方法:
n=n+1
pbyMessage(n)=………………
//////////////////////////////////
//此处(0xFF & (~pbyMessage[n+1]))如何转换?
//////////////////////////////////方法:&HFF And (255-pbyMessage(n+1))
//////////////////////////////////
//return 0;是否等同于functionname=0 exit function?有没有更简单的方法?
//////////////////////////////////方法:就是等于
functionname=0 : exit function