如题,也就是再Ctrl类中,thankyou 了先!
不是ATL啊!

解决方案 »

  1.   

    不是atl那么就在odl文件中定义,最次的解决方案是将这个struct包装成COM对象.
      

  2.   

    比如,我的工程文件叫做GQTest,在对象栏中找到GQTestLib,他的子目录中有"GQTest Control 的调度接口":_GQTest
    选中右健添加方法。
    此时即使我在idl中定义了Struct应该也还是不形吧!
      

  3.   

    使用BSTR或者SAFEARRAY封装你的结构内容
      

  4.   

    具体点吧!我也隐约知道,可以用BSTR、SafeArray和Variant,指针应该也可以,好汉还能写点具体点的代码,感激不尽啊!
    那个SafeArray难看得一米多高的!
      

  5.   

    CYourStruct ys;
    ys.aa = ...;
    BSTR bstr = SysAllocStringByteLen((char*)&ys, sizeof(ys));
      

  6.   

    实在不好意思,最后一个问题,如何解析此BSTR成为CYourStruct呢,
    谢谢了!立刻结贴给分!
      

  7.   

    怎么会没有人呢?
    如何将BSTR类型转化为CYourStruct类型呢?
    55!
      

  8.   

    一样的过程:
    CYourStruct ys;
    memcpy(&ys, (LPVOID)bstr, sizeof(ys));
      

  9.   

    先谢谢jameshooo,我刚刚加了100分,希望可以继续知道其他方法,可以非常好地解决这样的一个问题,不过jameshooo的分已经预订了。结贴得时候一定给。
    我是VC新手,希望大家可以告诉下:
    以上的自定义结构是否可以用指针来传,是否可以,应该怎么做?
    还有就是我想问一下,MFC ActiveX和ATL究竟有多大的区别呢?
    是否就仅仅是MFC支持类库,比较大;而ATL比较小,这样的话,如果我的ActiveX用到很多Form是不是就应该用MFC了。
    还有如果MFC ActiveX和ATL对象混用,会产生什么样的恶果呢?谢谢了!
      

  10.   

    Typedef struct EDPoint
    {
    Double x;
    Double y;
    }EDPoint;
    EDPoint tmpPoint;
    一、 BSTR方式传递自定义结构体参数;
    1. 如何从BSTR转化为EDPoint:
    memcpy(&tmpPoint,   (LPVOID)bstr,   sizeof(tmpPoint));
    2. 如何从EDPoint转化为BSTR;
    BSTR bstr = SysAllocStringByteLen((char*)& tmpPoint, sizeof(tmpPoint));
    二、 BYTE流方式传递自定义结构体参数;
    1. 如何从BYTE流转化为EDPoint;
    PBYTE bOut[Max];
    EDPoint tmpPoint;
    Memset(&tmpPoint,0,sizeof(tmpPoint));
    Memcpy((LPVOID)& tmpPoint,&bOut,sizeof(tmpPoint));
    ----memset(   &tData,   0,   sizeof(ATTRINFO)   );   
    ----memcpy(   &tData,   pIn,   sizeof(ATTRIINFO)   );   2. 如何从EDPoint转化为BYTE流;
    Memset(&bOut,0,Max);
    Memcpy(&bOut,(LPVOID)& tmpPoint,sizeof(tmpPoint));
    三、 Variant方式传递自定义结构体参数;
    初始化:
    EDPoint * tmpPoint = NULL;
    VARIANT tmpVar;
    tmpPoint =(EDPoint*)CoTaskMemAlloc(sizeof(EDPoint));
    1. 如何从Variant转化为EDPoint:
    tmpPoint = (EDPoint*) tmpVar.byref;2. 如何从EDPoint转化为Variant:
    tmpVar.byref =(LPVOID) tmpPoint;
    结束:
    CoTaskMemFree((LPVOID) tmpVar);不过都觉得太过繁了,大家帮忙整个简单的哈!
    我如果在外面需要调用需要先将EDPoint转换成BSTR、BYTE..返回后又得转过来,太累了!
    指针是如何做的呢?
      

  11.   


    template<class T>
    class CBSTR
    {
    protected:
      BSTR bstr;
      T* pT;public:
      CBSTR() : bstr(NULL), pT(NULL) {}
      CBSTR(const T& other)
      {
        bstr = ::SysAllocStringByteLen((char*)&other, sizeof(T));
        pT = &other;
      }
      CBSTR(BSTR obstr)
      {
        bstr = obstr;
        pT = (T*)obstr;
      }  ~CBSTR()
      {
        if (bstr)
        {
          ::SysFreeString(bstr);
          bstr = NULL;
        }
        pT = NULL;
      }  operator BSTR() { return bstr; }
      operator T*() { return pT; }
    };CBSTR<EDPoint> bstred(empPoint);
    pInterface->MethodIn((BSTR)bstred, ...);BSTR outbstr = NULL;
    pInterface->MethodOut(&outbstr);
    CBSTR<EDPoint> bstred2(outbstr);
    EdPoint* pedp = bstred2;
    pedp->x;
    pedp->y;
      

  12.   

    如果我要在C#中使用这个控件呢?怎么把BSTR转成EPOINT结构?