我想用c++写一个protobuf整数编解码的dll给vb调用,用variant传递字节数组,运行中出现写入访问冲突错误。希望大神不吝赐教,帮忙改下

weixin_39553455 2018-10-27 07:37:49
'0x0AF26EFD (VBMOVE.dll) (VB6.EXE 中)处有未经处理的异常: 0xC0000005: 写入位置 0x30300134 时发生访问冲突。

0x0AF26EFD (VBMOVE.dll) (VB6.EXE 中)处有未经处理的异常: 0xC0000005: 写入位置 0x30300134 时发生访问冲突。 出现了 0x0AF26EFD (VBMOVE.dll) (VB6.EXE 中)处有未经处理的异常: 0xC0000005: 写入位置 0x30300134 时发生访问冲突。 出现了


VARIANT _stdcall decode( VARIANT varChunk2)
{
switch (varChunk2.vt )
{
case VT_ARRAY|VT_UI1:
{

SAFEARRAY *psa2=varChunk2.parray; //使用数组整理读取的数据
long plUbound=0;
SafeArrayGetUBound(psa2,1,&plUbound);
unsigned char *buf;
// psa = SafeArrayCreate(VT_UI1,1,rgsabound); //创建SafeArray数组
SafeArrayAccessData(psa2, (void **)&buf); //安全指针

unsigned _int64 value=0;
unsigned _int64 valuem=0;
int pos =0;
int offset=0;
unsigned char *buffer=new unsigned char[100];
delete []buffer;
unsigned char byte;
for (long i=0;i<=plUbound;i++)
{
buffer[i]=buf[i];
byte =buffer[i];
byte=byte&0x7f; //高位置0
valuem=byte;

valuem= valuem<<offset;
value =value | valuem ;
offset+=7;
}
unsigned char x[8]={0};
memcpy(x , &value,8);
SafeArrayUnaccessData(psa2);
//字节数组封装》safearray》variant
VARIANT varChunk;
SAFEARRAY *psa; //使用数组整理读取的数据
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].cElements =8; //设置数组的大小,geshu
rgsabound[0].lLbound = 0;
unsigned char *buf2;
psa = SafeArrayCreate(VT_UI1,1,rgsabound); //创建SafeArray数组
SafeArrayAccessData(psa, (void **)&buf2); //安全指针
//直接接作buf即可

//buf[0]=126;
//buf[1]=127;
for ( int j = 0; j < 8; j++)
{
buf2[j]= x[j];
}
SafeArrayUnaccessData(psa);
varChunk.vt = VT_ARRAY|VT_UI1; //数组类型
varChunk.parray = psa;
return varChunk;
}
default:
{
VARIANT n;
return n;
}
}

}



//--------------------------------------
VARIANT _stdcall encode(VARIANT varChunk2,int fuhao)
{
//判断变体类型

unsigned __int64 value=0 ;
switch (varChunk2.vt )
{
case VT_ARRAY|VT_UI1:
{
SAFEARRAY *psa2=varChunk2.parray; //使用数组整理读取的数据
long plUbound=0;
SafeArrayGetUBound(psa2,1,&plUbound);
unsigned char *buf;
SafeArrayAccessData(psa2, (void **)&buf); //安全指针
unsigned char *buffer=new unsigned char[100];
delete []buffer;
unsigned char x[8];
for ( int z= 0; z < 8; z++)
{
x[z]=0;
}

for (long i=0;i<plUbound;i++)
{
x[i]=buf[i];
}
memcpy(&value,x , 8);
SafeArrayUnaccessData(psa2);
break;
}
case VT_R8:
{
double b=varChunk2.dblVal ;
value=b;
break;
}
case VT_R4:
{
float f=varChunk2.fltVal ;
value=f;
break;
}
case VT_I4:
{
long l=varChunk2.lVal ;
value=l;
break;
}
case VT_I2:
{
int i=varChunk2.iVal ;
value=i;
break;
}

case VT_UI1:
{
unsigned char c=varChunk2.bVal ;
value=c;
break;
}

default:
{
VARIANT b;
return b;
}
}
unsigned char *buffer=new unsigned char[100];
delete []buffer;
int pos =0;
int more=1;
if (fuhao=0)
{
unsigned __int64 value1=value;

while (more){
unsigned char byte =value1 & 0x7f;//取低7位,成立新字节,高位置0
value1>>=7;//剔除7位
if (value1==0)//正数
more=0;
if (more!=0)
byte|=0x80;
buffer[pos++]=byte;
}
}
else
{
__int64 value3=value;
//强制赋值给64位无符号整型
unsigned __int64 value2=value3; //强制赋值给64位无符号整型

while (more){
unsigned char byte =value2 & 0x7f;//取低7位,成立新字节,高位置0
value2>>=7;//剔除7位
if (value2==0)//正数
more=0;
if (more!=0)
byte|=0x80;
buffer[pos++]=byte;
}
}

//字节数组封装》safearray》variant
VARIANT varChunk;
SAFEARRAY *psa; //使用数组整理读取的数据
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].cElements =pos; //设置数组的大小
rgsabound[0].lLbound = 0;
unsigned char *buf;
psa = SafeArrayCreate(VT_UI1,1,rgsabound); //创建SafeArray数组
SafeArrayAccessData(psa, (void **)&buf); //安全指针
//直接接作buf即可
for ( int i = 0; i < pos; i++)
{
buf[i]=buffer[i];
}

SafeArrayUnaccessData(psa);
varChunk.vt = VT_ARRAY|VT_UI1; //数组类型
varChunk.parray = psa;
return varChunk;


}
...全文
148 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
十八道胡同 2019-03-07
  • 打赏
  • 举报
回复
问题解决了吗? 我发现protobuf的头文件好像是cdcall的方式。。

6,721

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 Google技术社区
社区管理员
  • Google技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧