控件中代码如下:
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。
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
能否说具体点,给出点代码让我学习,BSTR我也考虑过,但没做成功
#6
传递数组指针过去
#7
我前面的做法就是传数组指针过去的呀,可不行,后面的高手能否在解答的时候写点代码举个例,这样比较清晰,谢谢
#8
用SafeArray C#支持这个
#9
很简单,BSTR绝对没有问题
#10
楼上,能否写点代码帮助一下呀,拜托
#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的字节数组
在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';
...
int value;
int* p = &value;
char* pC = (char*)p;
pC[0] = 'a';
pC[1] = 'b';
...
#13
谢谢楼上的回答,上面的代码只是举个例子,数组长度不止4个,是任意长的,我准备研究一下SafeArray的做法,但不知道在OCX中应该选什么类型输出,是variant *吗?,另外在C#中该如何 做呢?
#14
VARIANT可以的,如果你只是可变字符数组,用BSTR最好不过
#15
在可变字符数组中包含0x00字符的,用BSTR会出现截断的
再具体讲就是我用串口采集一段数据(数据是无符号的Byte类型的数据),需要通过控件的事件传送给C#
#16
BSTR的长度是由独立的4字节前缀内存保存的,所以能存放任意二进制数据,只要你不把它当作字符串来用(比如求字符串长度),可以保存任意数量的0。
#17
我想用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
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;...
这个定义成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。
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
能否说具体点,给出点代码让我学习,BSTR我也考虑过,但没做成功
#6
传递数组指针过去
#7
我前面的做法就是传数组指针过去的呀,可不行,后面的高手能否在解答的时候写点代码举个例,这样比较清晰,谢谢
#8
用SafeArray C#支持这个
#9
很简单,BSTR绝对没有问题
#10
楼上,能否写点代码帮助一下呀,拜托
#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的字节数组
在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';
...
int value;
int* p = &value;
char* pC = (char*)p;
pC[0] = 'a';
pC[1] = 'b';
...
#13
谢谢楼上的回答,上面的代码只是举个例子,数组长度不止4个,是任意长的,我准备研究一下SafeArray的做法,但不知道在OCX中应该选什么类型输出,是variant *吗?,另外在C#中该如何 做呢?
#14
VARIANT可以的,如果你只是可变字符数组,用BSTR最好不过
#15
在可变字符数组中包含0x00字符的,用BSTR会出现截断的
再具体讲就是我用串口采集一段数据(数据是无符号的Byte类型的数据),需要通过控件的事件传送给C#
#16
BSTR的长度是由独立的4字节前缀内存保存的,所以能存放任意二进制数据,只要你不把它当作字符串来用(比如求字符串长度),可以保存任意数量的0。
#17
我想用BSTR在C++中估计可以,但我是在C#中调用该OCX,BSTR在C#中自动对应为CString,就把0后面的二进制数据截断了
#18
那就用SafeArray(UI1)吧
#19
SafeArray兼容性好。只要支持com的环境都可以用。
#20
看看如下2个帖子,你就基本懂了
http://topic.csdn.net/u/20080706/03/5407f494-8f41-48d0-b952-931245d749db.html
http://topic.csdn.net/u/20080625/10/677ac2bc-b24f-42e5-a674-43d82414eb39.html
http://topic.csdn.net/u/20080706/03/5407f494-8f41-48d0-b952-931245d749db.html
http://topic.csdn.net/u/20080625/10/677ac2bc-b24f-42e5-a674-43d82414eb39.html
#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
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;...
这个定义成FireOutput(long addr);
然后在activex中FireOutput((long)data);
在应用程序中char *ptr = (char*)data;...
#23
CComBSTR类比较容易
#24
嗯 BSTR好东西
#25
其实控件的接口参数,应该能让容器知道,因此容器收到这个FireOutput(data)的时候,就应该知道data是个什么类型的参数了吧。即便是数组,也是要控件告诉容器的。