小弟有一个C++的ocx文件,注册并添加到VS中后调用其中的某个方法。
如 public virtual bool SetUserData(ref short userDataBuffer, int userDataLen);
其中在C++中userDataBuffer的原型是wchar_t *类型,转换成ocx之后变成了ref short,我不知道如何进行调用,ocx文件无法修改,请问各位大牛怎么解决啊?急等啊。
如 public virtual bool SetUserData(ref short userDataBuffer, int userDataLen);
其中在C++中userDataBuffer的原型是wchar_t *类型,转换成ocx之后变成了ref short,我不知道如何进行调用,ocx文件无法修改,请问各位大牛怎么解决啊?急等啊。
COM是封装好的,看不到内部代码。
我是这样用的
这是设置
string data = "这是用户数据";
char[] strs = data.ToCharArray();
short x = (short)strs[0];
if (ocx.SetUserData(ref x, strs.Length))
{ }
这个是读取的方法
string data = "";
char[] strs = new char[100];
short x = (short)strs[0];
int count = ocx.GetUserData(ref x, strs.Length);
if (count>=0)
{
for(int i=0;i<count ;i++)
{ data += (char)x;
x = (short)(x + sizeof (short));
}
}
其中count能够读出来是6,但data除了第一个字符外,其余都是乱码
呵呵,我也想改啊,可是OCX是别人写的,代码改不了,ref short userDataBuffer是visual studio自动生成的,也改不了啊
这时COM组件,不是平台调用!
char[] strs = data.ToCharArray(); int size = Marshal.SizeOf(strs[0]) * strs.Length;
IntPtr ptr=Marshal.AllocHGlobal(size); Marshal.Copy(strs, 0, ptr, strs.Length);
short x=(short)ptr.ToInt32();
if (ocx.SetUserData(ref x, strs.Length))
{ }
string data = "";
char[] strs = new char[100];
short x = 0;
int count = ocx.GetUserData(ref x, strs.Length);
IntPtr ptr=new IntPtr((int)x)
if (count>=0)
{
Marshal.Copy(ptr, strs , 0, strs.Length);
}
再添加引用呢
IntPtr ptr=new IntPtr((int)x)
"那你要先查看x的返回值是否正确,ptr初始化的值是多少?
x的值有时为正,有时为负,对于一个short类型的变量来说是正负都正确。ptr的值是每次与x的值保持一致,执行Copy报错,“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
这样也有个参考