小弟有一个C++的ocx文件,注册并添加到VS中后调用其中的某个方法。
如 public virtual bool SetUserData(ref short userDataBuffer, int userDataLen);
其中在C++中userDataBuffer的原型是wchar_t *类型,转换成ocx之后变成了ref short,我不知道如何进行调用,ocx文件无法修改,请问各位大牛怎么解决啊?急等啊。

解决方案 »

  1.   

    有没有这个COM的C++使用例子,贴出来看看
      

  2.   


    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除了第一个字符外,其余都是乱码
      

  3.   

    把ref short userDataBuffer改为string试试看,
      

  4.   


    呵呵,我也想改啊,可是OCX是别人写的,代码改不了,ref short userDataBuffer是visual studio自动生成的,也改不了啊
      

  5.   


    这时COM组件,不是平台调用!
      

  6.   

    你这样做:  string data = "这是用户数据";
      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);
      }
      

  7.   

    ocx文件进行注册下呢
    再添加引用呢
      

  8.   

    OCX是组件啊,注册以后添加,是和控件一样用,而不是ImportDLL的用法吧?你不用声明,New出对象去“点”方法就行了,干嘛非要找匹配的数据类型?你找匹配的类型的数据就是了,看参数名,应该是数据缓存区,和数据长度,VC++基于网络编程的数据传递而已
      

  9.   

    OCX注册后,在VS中添加引用的“COM”选项卡中找到并添加,拖拽控件后,直接“点”智能感应出方法就可以用了。第一个参数确实是一片内存的指针,在C++中是wchar_t *类型的,只是通过上述方式添加后,参数被转换成了ref short 类型,不知道VS转换的机制是什么,但目前确实是ref  short ,用6楼的Set方法是可以成功的,Get方法获取数据的count也是正确的,但 Marshal.Copy(ptr, strs , 0, strs.Length); 这句话报错,而且在调试的时候ptr有时为负值,这样强制转换是不行的。
               
      

  10.   

    "   int count = ocx.GetUserData(ref x, strs.Length); 
       IntPtr ptr=new IntPtr((int)x) 
    "那你要先查看x的返回值是否正确,ptr初始化的值是多少?
      

  11.   

    “在C++中是wchar_t *类型的,只是通过上述方式添加后,参数被转换成了ref short 类型,不知道VS转换的机制是什么”这是因为:typedef unsigned short wchar_t加上有是指针,这样C#的类型自然映射为ref的形式,不过我认为ref ushort更准确些!
      

  12.   


    x的值有时为正,有时为负,对于一个short类型的变量来说是正负都正确。ptr的值是每次与x的值保持一致,执行Copy报错,“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
      

  13.   

    你最好找找这个COM组件Demo,VB,VC的都行,看看正确的是怎样做的,
    这样也有个参考