ActiveX 控件中,字节数组如何传出去?

时间:2022-03-26 21:02:39
我用VC++ 6.00提供的控件的创建引导(MFC ActiveX ControlWizard)生成了一个ActiveX 控件,在里边我要将一个字符串传给控件调用者。
控件中代码如下:
char data[10]={0};
    data[0]=0x31;
    data[1]=0x32;
    data[2]=0x33;
    data[3]=0x34;
    FireOutput(data);//事件触发发送字符串data给容器
我是在C#中调用该控件的。
请各位高手给予指导,VC++中如何做,因为MFC ActiveX ControlWizard中事件定义中无字符串指针的定义,同时最好也能给出C#中对应的调用方法。

25 个解决方案

#1


定义全局数组变量,控件与容器间传递数组指针和长度就行了

#2


在实际当中我也是这样想,以为可以解决问题,但实际验证结果是:全局数组变量的地址可以传出去,但我在C#中用该地址进行取数据时候全为0,楼上的这种方法你实际测试过吗?

#3


C#中代码如下
private void axTestocx1_output(object sender, AxTESTOCXLib._DTestocxEvents_outputEvent e)//事件触发函数
        {
            IntPtr Pdata = new IntPtr(e.StrAddres);//获取事件中传出来的字符数组的地址
            Byte[] Data = new Byte[10];
            Marshal.Copy(Data, 0, Pdata, 10);  //将该地址胡字节拷贝10个字节到Data中
        }
结果发现全局数组变量的地址可以传过来,但传出来的10个字节均为0。

#4


当然用BSTR了

#5


引用 4 楼 ouyh12345 的回复:
当然用BSTR了

能否说具体点,给出点代码让我学习,BSTR我也考虑过,但没做成功

#6


传递数组指针过去

#7


引用 6 楼 VsirSoft 的回复:
传递数组指针过去

我前面的做法就是传数组指针过去的呀,可不行,后面的高手能否在解答的时候写点代码举个例,这样比较清晰,谢谢

#8


用SafeArray C#支持这个

#9


很简单,BSTR绝对没有问题

#10


引用 9 楼 hoboo 的回复:
很简单,BSTR绝对没有问题

楼上,能否写点代码帮助一下呀,拜托

#11


各位可能没理解我的问题:
在C#中将ACTIVEX OCX中的BSTR自动转换成String接收,这样一来,如果我要转送的字符串是
char data[10]={0};
    data[0]=0x31;
    data[1]=0x32;
    data[2]=0x0;
    data[3]=0x34; 
也就是字符中包含0,则在C#中自动截断,输出为12,而我希望输出的是四个字节0x31,0x32,0x0,0x34
请各位指点如何转送含0的字节数组

#12


如果一定要用数组,我认为最好用SafeArray.如果只是四个字节.可以传一个整数(4个字节).
int value;
int* p = &value;
char* pC = (char*)p;
pC[0] = 'a';
pC[1] = 'b';
...

#13


引用 12 楼 tom_12_23_34 的回复:
如果一定要用数组,我认为最好用SafeArray.如果只是四个字节.可以传一个整数(4个字节).
int value;
int* p = &value;
char* pC = (char*)p;
pC[0] = 'a';
pC[1] = 'b';
...

谢谢楼上的回答,上面的代码只是举个例子,数组长度不止4个,是任意长的,我准备研究一下SafeArray的做法,但不知道在OCX中应该选什么类型输出,是variant *吗?,另外在C#中该如何 做呢?

#14


VARIANT可以的,如果你只是可变字符数组,用BSTR最好不过

#15


引用 14 楼 wangweixing2000 的回复:
VARIANT可以的,如果你只是可变字符数组,用BSTR最好不过

在可变字符数组中包含0x00字符的,用BSTR会出现截断的
再具体讲就是我用串口采集一段数据(数据是无符号的Byte类型的数据),需要通过控件的事件传送给C#

#16


BSTR的长度是由独立的4字节前缀内存保存的,所以能存放任意二进制数据,只要你不把它当作字符串来用(比如求字符串长度),可以保存任意数量的0。

#17


引用 16 楼 jameshooo 的回复:
BSTR的长度是由独立的4字节前缀内存保存的,所以能存放任意二进制数据,只要你不把它当作字符串来用(比如求字符串长度),可以保存任意数量的0。

我想用BSTR在C++中估计可以,但我是在C#中调用该OCX,BSTR在C#中自动对应为CString,就把0后面的二进制数据截断了 

#18


那就用SafeArray(UI1)吧

#19


SafeArray兼容性好。只要支持com的环境都可以用。

#21


这个是微软的例子,传出的结果在vb和js中都可以用。
http://msdn.microsoft.com/en-us/library/akdhw818(VS.80).aspx

更多ATL Samples
http://msdn.microsoft.com/en-us/library/65t81w8a(VS.80).aspx

#22


FireOutput(data);//
这个定义成FireOutput(long addr);
然后在activex中FireOutput((long)data);
在应用程序中char *ptr = (char*)data;...

#23


CComBSTR类比较容易

#24


嗯 BSTR好东西

#25


其实控件的接口参数,应该能让容器知道,因此容器收到这个FireOutput(data)的时候,就应该知道data是个什么类型的参数了吧。即便是数组,也是要控件告诉容器的。

#1


定义全局数组变量,控件与容器间传递数组指针和长度就行了

#2


在实际当中我也是这样想,以为可以解决问题,但实际验证结果是:全局数组变量的地址可以传出去,但我在C#中用该地址进行取数据时候全为0,楼上的这种方法你实际测试过吗?

#3


C#中代码如下
private void axTestocx1_output(object sender, AxTESTOCXLib._DTestocxEvents_outputEvent e)//事件触发函数
        {
            IntPtr Pdata = new IntPtr(e.StrAddres);//获取事件中传出来的字符数组的地址
            Byte[] Data = new Byte[10];
            Marshal.Copy(Data, 0, Pdata, 10);  //将该地址胡字节拷贝10个字节到Data中
        }
结果发现全局数组变量的地址可以传过来,但传出来的10个字节均为0。

#4


当然用BSTR了

#5


引用 4 楼 ouyh12345 的回复:
当然用BSTR了

能否说具体点,给出点代码让我学习,BSTR我也考虑过,但没做成功

#6


传递数组指针过去

#7


引用 6 楼 VsirSoft 的回复:
传递数组指针过去

我前面的做法就是传数组指针过去的呀,可不行,后面的高手能否在解答的时候写点代码举个例,这样比较清晰,谢谢

#8


用SafeArray C#支持这个

#9


很简单,BSTR绝对没有问题

#10


引用 9 楼 hoboo 的回复:
很简单,BSTR绝对没有问题

楼上,能否写点代码帮助一下呀,拜托

#11


各位可能没理解我的问题:
在C#中将ACTIVEX OCX中的BSTR自动转换成String接收,这样一来,如果我要转送的字符串是
char data[10]={0};
    data[0]=0x31;
    data[1]=0x32;
    data[2]=0x0;
    data[3]=0x34; 
也就是字符中包含0,则在C#中自动截断,输出为12,而我希望输出的是四个字节0x31,0x32,0x0,0x34
请各位指点如何转送含0的字节数组

#12


如果一定要用数组,我认为最好用SafeArray.如果只是四个字节.可以传一个整数(4个字节).
int value;
int* p = &value;
char* pC = (char*)p;
pC[0] = 'a';
pC[1] = 'b';
...

#13


引用 12 楼 tom_12_23_34 的回复:
如果一定要用数组,我认为最好用SafeArray.如果只是四个字节.可以传一个整数(4个字节).
int value;
int* p = &value;
char* pC = (char*)p;
pC[0] = 'a';
pC[1] = 'b';
...

谢谢楼上的回答,上面的代码只是举个例子,数组长度不止4个,是任意长的,我准备研究一下SafeArray的做法,但不知道在OCX中应该选什么类型输出,是variant *吗?,另外在C#中该如何 做呢?

#14


VARIANT可以的,如果你只是可变字符数组,用BSTR最好不过

#15


引用 14 楼 wangweixing2000 的回复:
VARIANT可以的,如果你只是可变字符数组,用BSTR最好不过

在可变字符数组中包含0x00字符的,用BSTR会出现截断的
再具体讲就是我用串口采集一段数据(数据是无符号的Byte类型的数据),需要通过控件的事件传送给C#

#16


BSTR的长度是由独立的4字节前缀内存保存的,所以能存放任意二进制数据,只要你不把它当作字符串来用(比如求字符串长度),可以保存任意数量的0。

#17


引用 16 楼 jameshooo 的回复:
BSTR的长度是由独立的4字节前缀内存保存的,所以能存放任意二进制数据,只要你不把它当作字符串来用(比如求字符串长度),可以保存任意数量的0。

我想用BSTR在C++中估计可以,但我是在C#中调用该OCX,BSTR在C#中自动对应为CString,就把0后面的二进制数据截断了 

#18


那就用SafeArray(UI1)吧

#19


SafeArray兼容性好。只要支持com的环境都可以用。

#20


#21


这个是微软的例子,传出的结果在vb和js中都可以用。
http://msdn.microsoft.com/en-us/library/akdhw818(VS.80).aspx

更多ATL Samples
http://msdn.microsoft.com/en-us/library/65t81w8a(VS.80).aspx

#22


FireOutput(data);//
这个定义成FireOutput(long addr);
然后在activex中FireOutput((long)data);
在应用程序中char *ptr = (char*)data;...

#23


CComBSTR类比较容易

#24


嗯 BSTR好东西

#25


其实控件的接口参数,应该能让容器知道,因此容器收到这个FireOutput(data)的时候,就应该知道data是个什么类型的参数了吧。即便是数组,也是要控件告诉容器的。