先上代码:
Activex Exe工程名:TestClass
类模块:Class1
代码:
Option ExplicitPrivate m_StdTestPic As StdPicturePublic Property Get TestPic() As StdPicture
    Set TestPic = m_StdTestPic
End PropertyPublic Property Set TestPic(ByVal StdValue As StdPicture)
    Set m_StdTestPic = StdValue
End Property标准Exe代码:
Option Explicit
Dim a As New Class1Private Sub cmdCommand1_Click()
    Set a.TestPic = Me.Icon
End Sub问题:
当TestClass编译为ActiveX Exe时标准Exe执行
Set a.TestPic = Me.Icon出错
当TestClass编译为ActiveX Dll时标准Exe执行
正常执行
请高手指条明路,不单是StdPicture不能传递,像ImageList控件对象等都不能用
String等类型都能正常操作

解决方案 »

  1.   

    Activex Exe在底层处理可能不太一样吧String等类型(包含数组、记录集等还有很多),在底层数据结构中是包含长度等信息的。(参见 VB圣经)
    这种情况是在set 时,处于不同线程的深拷贝,所以⋯⋯
    在同一线程应该不会出现这种情况的吧?
    你可以建一个类模块试试以上纯属猜测。
      

  2.   

    Windows下的一些说法是:基于线程保护,一个线程不可直接访问另一个线程的对象。只能通过线程间的3种通信方式来间接访问。
    我不知道有没有这个说法,也不知道是不是这样的。
    共同研究⋯⋯
      

  3.   

    Activex Exe与主EXE是两个独立的进程.对象的传递,在VB里实际是对象指针的传递,然后增加一个引用计数.对象本身还是同一个实例.因此作为DLL时是同一进程,即进程内部件,则通过这个指针是可以访问到的.而作为Activex Exe时则是进程外对象了,需要跨进程,估计就没戏.....
      

  4.   

    老马说的也是我想到的问题所在,因为无法解决,我目前只想传递STDPICTURE对像,但这个对像有没有变通方法传递呢,如传递BYTE()数组不知道是不是可行
      

  5.   

    老马说的也是我想到的问题所在,因为无法解决,我目前只想传递STDPICTURE对像,但这个对像有没有变通方法传递呢,如传递BYTE()数组不知道是不是可行
      

  6.   

    不知道有没有办法把整个对像转换成BYTE()数组,传递后再转回这种方法不知道是不是可行
      

  7.   

    stdpicture对象转byte数组,怎么转呢?建议用propertybag转
      

  8.   

    在论坛里找到以前有人发过STDPICTURE转BYTE()的代码了http://blog.csdn.net/tzwsoho/article/details/5201499
    留个标记给有需要的人
      

  9.   

    你这个问题就是对象序列化的问题.这在VB6里非常麻烦,因为VB6貌似并不支持全自动的序列化.而所谓支持序列化的对象,需要是ActiveX DLL或ActiveX EXE中的类,并且设置Persistable属性,然后就会有套接口,这接口会在序列化时被自动调用,你要在这个接口中完成你这个类中的数据的存与取.这样的话好象是完成了序列化,但是挺麻烦,效果也不好,还一样是无法直接存取整个对象,得你自己一一把每个属性及需要用到的数据存和取.并且关键在于系统的对象你没办法自己写,它要是不支持Persistable,那就傻眼了-------除非你自己从对象指针得到对象的内存,再进行内存复制与恢复!这可不是一般人能干的活了!而propertybag能做的也是非常有限!对于它不能识别的类型,同样傻了!比如自定义类!但是对于VB6内部的类型,还是挺好用,勉强用用吧.