关于Activex Exe传递对象变量的问题
先上代码:
Activex Exe工程名:TestClass
类模块:Class1
代码:
Option Explicit
Private m_StdTestPic As StdPicture
Public Property Get TestPic() As StdPicture
Set TestPic = m_StdTestPic
End Property
Public Property Set TestPic(ByVal StdValue As StdPicture)
Set m_StdTestPic = StdValue
End Property
标准Exe代码:
Option Explicit
Dim a As New Class1
Private 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等类型都能正常操作
[解决办法]
Activex Exe在底层处理可能不太一样吧
String等类型(包含数组、记录集等还有很多),在底层数据结构中是包含长度等信息的。(参见 VB圣经)
这种情况是在set 时,处于不同线程的深拷贝,所以??
在同一线程应该不会出现这种情况的吧?
你可以建一个类模块试试
以上纯属猜测。
[解决办法]
Windows下的一些说法是:基于线程保护,一个线程不可直接访问另一个线程的对象。只能通过线程间的3种通信方式来间接访问。
我不知道有没有这个说法,也不知道是不是这样的。
共同研究??
[解决办法]
Activex Exe与主EXE是两个独立的进程.
对象的传递,在VB里实际是对象指针的传递,然后增加一个引用计数.
对象本身还是同一个实例.
因此作为DLL时是同一进程,即进程内部件,则通过这个指针是可以访问到的.
而作为Activex Exe时则是进程外对象了,需要跨进程,估计就没戏.....
[解决办法]
stdpicture对象转byte数组,怎么转呢?
建议用propertybag转