刚才找了一下以前的关于dcom的贴子,居然没人问这方面的问题……
为什么我的问题连看都没有人愿意看一下呀,是不是分太少了?
回到50分,大家进来随便敷衍一下也领分好不好?

解决方案 »

  1.   

    两个办法:
    1:把图片存为文件然后把文件发出去,在服务器端重新组合。
    2:把图片存为文件,然后把文件appendchunk到一个adodb.recordset里面,这个办法可以一次传送多个图片,还可以带有附注。recrodset对象在传送过程中是压缩的(微软的文档上说的)
    msdn.microsoft.com 中可以找到DCOM的例程,其中使用了第1个方法。奇怪:我回复了两次,第一次回复居然没有上去?
      

  2.   

    补充
    方法2需要用到propertybag对象,以把stdPicture对象实现序列化。
    Dim aa As New PropertyBag
    aa.WriteProperty "aabb", Picture1.Picture
    MsgBox Len(aa.Contents)通过appendchunk aa.contents 可以把图片加入recordset对象而不需要存盘。
      

  3.   

    我不想把图片存为本地文件,也不想存到数据库中,想调用在服务器上运行的一个active exe部件的方法,把图片作为参数传递过去,然后由该方法保存图片为文件,但是会出错……
      

  4.   

    看来大家都不太喜欢使用dcom??豁出去了,加到300分。
      

  5.   

    图片通过扫描仪和摄像头产生放到PictureBox中,然后使用Variant类型数据传递
    stdPicture对象。我没有在VB中使用过DCOM,在Delphi好像可以。
    www.applevb.com
      

  6.   

    在本地存成要存的文件格式,然后将文件读出成为数组,然后再传回服务器,然后再存盘。
    这样挺好嘛!又不浪费什么时间,要存成jpg在网上传输的时间应该还会短一些。怀疑对象不可以直接传输。而vb中没有图像数据类型,所以可能不可以直接传输的!
      

  7.   

    我来了
        fish
      

  8.   

    我一直在从事类似的工作,可以一起探讨
    [email protected]
      

  9.   

    '这是引用activeexe的工程中的代码:
    Dim clsShowPic As ObjectPrivate Sub Command1_Click()
        Dim lPic As StdPicture
        Set lPic = Picture1.Picture
        clsShowPic.ShowPic lPic
    End SubPrivate Sub Form_Load()
        Set clsShowPic = CreateObject("showpic.clsshowpic") 'showpic.classhowpic是自定义activeexe的类名。
    End Sub
    '________________________________________________________________________
    '这是activeexe中的代码(工程名为showpic,类名为clsshowpic):
    Public Sub ShowPic(paraPic As Variant)
        frmShowPic.Show                      'frmShowPic和该类同在showpic工程中。
        frmShowPic.picShow.Picture = paraPic 'frmshowpic上有一个picture控件名为picshow
    End Sub
      

  10.   

    错误出在:    clsShowPic.ShowPic lPic
    ?err.Number
    -2147418113 
    ?err.Description
    对象 'ShowPic' 的方法 '_clsShowPic' 失败在VB的实时错误对话框中点击帮助按钮如下结果:自动化错误(错误 440)
       当访问 Automation 对象时,发生了特定类型的错误。此错误有以下原因和解决方法: 当执行某个方法时,或是得到或设置对象变量的属性时,发生了此错误。创建此对象的应用程序会报告此错误。 
    检查 Err 对象的属性以决定错误的来源和性质。同样地,也可以在访问语句前,直接使用 On Error Resume Next 语句,然后在访问语句后检查错误。详细信息,可选取有问题的项目,并按下 F1 键。 
      

  11.   

    上面这段代码是我刚在本机上写的,在一台机器上运行也不能通过……有点不太明白原因。
    由于时间比较紧急,所以最后我还是不得不放弃了使用dcom存储图片的打算,而是使用专用的图片管理数据库。不过我还是想请各位高手帮我搞清楚出上面的错误的原因。TechnoFantasy(www.applevb.com):用variant类型传输图片也不行,我把传输参数改为图片框控件实例本身在传输时都不会出错。不过传输过去的图片框对象不能访问其picture属性。否则提示相同错误。frs(FANG)的办法“在本地存成要存的文件格式,然后将文件读出成为数组,然后再传回服务器,然后再存盘。”从理论上说应该可行,能不能不将其存为文件,直接把stdpicture类型直接转换为binary或把binary转换为stdpicture?对象可以作为参数传输,这是毫无疑问的。不过我不太清楚把对象实例传输到服务器上,是通过把客户机的对象所占内存空间拷贝到服务器上还是通过其它什么办法实现的。snowguy(snowguy) 很希望与你讨论。请在此发表你的高见啊。再次非常感谢大家!:-)
      

  12.   

    我没说清楚
    传送recordset不一定代表必须使用数据库,服务器可以把recordset拆开然后把其中的数据存为文件。
    在VB中stdPicture对象是不允许远程传送的,大部分包含状态的对象都不允许远程传送。但是recordset是一个特例。所以通常使用recordset作为远程传送的容器。刚才看了你的代码,一般来说服务器都是没有UI的,你的服务器有form。如果客户端调用的话是无法看到的,这个form是在服务器上弹出的。不知道你为什么要这样做。
    关于propertybag
    这是一个可以将对象序列化的工具,可以使用propertybag的writeproperty方法把大部分对象写入其中(仍然有一部分对象是不允许写入的,比如使用服务器游标的recordset)。然后可以使用propertybag的aa.Contents属性来得到一个序列化的字节数组
    '---------------------------
    dim aa() as byte 
    dim pp as propertybag
    set pp=new peopertybag
    pp.writeproperty "test",11
    aa=pp.contents
    '---------------------------然后在服务器端使用如下语句可以得到
    Dim aa As New PropertyBag
    aa.Contents = myarry  '在这里读入客户端发来的bit数组
    Picture2.Picture = bb.ReadProperty("test")现在你只要写如何把客户端的pp.contents发送到服务器端的代码即可
    给我一个e-mail,我写一段例程给你。我的e-mail:[email protected]
      

  13.   

    修正:
    '---------------------------
    dim aa() as byte 
    dim pp as propertybag
    set pp=new peopertybag
    pp.writeproperty "test",picture1.picture
                            ^^^^^^^^^^^^^^^^ 
    aa=pp.contents
    '---------------------------
      

  14.   

    我想bucher的办法是比较好的,不过我也没试过,另外,把图片保存为文件也是可行的办法,这个文件不一定要保存在磁盘上,完全可以建一个内存映射文件嘛,还有,C/S通讯用命名管道也很方便
      

  15.   

    DCOM怎么可以用内存映射文件和C/S通讯用命名管道呢?
      

  16.   

    to bucher:
    thank you very much。
    因为还有一些问题需要向各位大虾请教,我暂时还不想结束这个贴子,所以另开一个贴子给您加分(100),请笑纳。:)
    我在服务端使用可视界面的目的只是为了想试验一下效果(这是我写的测试工程)。
    您的意思是可以通过把picture放到recordset对象或propertybag对象中进行传递对吧?虽然我还没来得及试,但估计一定可行。
    用recordset对象传递我还是有点疑问,即能不能不将图片存为文件,直接把stdpicture类型直接转换为binary或把binary转换为stdpicture?是否是通过您上面所说的使用属性包的方法?sorry,小弟才疏学浅,我对propertybag的使用仅限于制作activeX控件的时候保存一下属性……没具体去了解过其详细作用,惭愧惭愧。请不吝赐教。
    请问“包含状态的对象”能不能请您说清楚一点其具体含义?到底哪些对象不能远程传送?
    另外,谢谢您的好心,我想实验代码还是我自己写比较好,先不麻烦您了,有什么问题再向您请教好吗?
    另外,能否向我推荐一两本您看过的认为写得不错的关于这方面的好书,再次谢谢:)
      

  17.   

    to jifeng:我不太明白把内存映射文件如何传递到另一台计算机上,是把一台计算机上的内存拷贝到另一台计算机上吗?……有点糊涂?请告知具体办法,谢谢!
    我还是不太清楚把对象实例传输到服务器上,是通过把客户机的对象所占内存空间拷贝到服务器上还是通过其它什么办法实现的。敬请各位高手指教,不胜感激:)
      

  18.   

    lujianjian玩完了别忘了把结果告诉我。:-)
      

  19.   

    看看 Inside COM+ Base Services 组件编程技术内幕希望出的
      

  20.   

    propertybag有一个极为重要的功能就是可以把其中的对象变成一个bit数组(使用Contents属性)用以传递或保存
    比如
    1:你把一个stdpicture对象添加到一个propertybag中
    2:然后读取该propertybag的contents属性得到一个bit数组.
    3:把这个bit数组传送给服务器端
    4:服务器收到该bit数组,然后将起复制给一个propertybag对象  (mypropertybag.contents=myarry)
    5:然后可以从该propertybag中读出stdpicture对象用于处理
    其实propertybag对象最大的用处就是把一个对象(比如stdpicture)变成一个数组便于传输。微软使用propertybag在VB中保存OCX控件的状态其实也就是把状态变成一个OCX存到frx文件中。运行时再读出来加以恢复。
    使用propertybag的局限:
        没有索引,无法得到其中所储存的属性列表。如果你不知道属性名称是无法取出的
        无法两次写入,如果写入一个已经存在的对象,比如:
        '----------------------------------------
        mypropertybag.writeproperty "aa",1
        mypropertybag.writeproperty "aa",2  '这里不会出错,但是也不会写入
        msgbox mypropertybag.readproperty("aa")  
        得到 1
        '----------------------------------------鉴于这样,推荐你使用recordset来传递对象.把bit数组存入其中,同时加上属性名(PropertyName)一起传送.这样便于服务器解开propertybag、而且可以传送一些额外的数据,比如图片名称、格式、作者、制作日期等等。而且如果需要写入数据库,使用无状态的recordset对象的updatebath是最方便的。我看了MSDN中关于微软数据格式传送限制的解释。微软说他们不推荐在远程传送内部的图片,窗体之类的内部对象,这样破坏了程序的封装(不应该将程序内部状态传送出去)。虽然form对象可以通过一些技巧来绕过VB6编译器的限制,但是他们将在VB7(也就是VB.NET)中彻底杜绝这种调用.    我认为是微软限制了VB6的功能避免它过于强大与VC,C#抢夺用户,既然recordset这么复杂的对象都可传递为什么stdpicture这种无状态对象就不允许传递。有状态的对象是指该对象引用了外部对象,并且脱离了该外部对象就无法正常工作(我自己认为,还请高人指正),比如使用服务器端游标的recodset对象有一个对数据源的引用,几乎任何操作都不能脱离数据源。一旦与数据源脱离该recodset对象就没有意义了。而一个使用客户端游标的recodset对象一旦脱离了数据源仅仅一部分功能不能使用,最主要的功能还是可以使用。对于分数我不在乎.分数你自己留着吧
      

  21.   

    更正:
    原文:微软使用propertybag在VB中保存OCX控件的状态其实也就是把状态变成一个OCX存到frx文件中
    应该为:微软使用propertybag在VB中保存OCX控件的状态其实也就是把状态变成一个bit串存到frx文件中
                                                                          ^^^^^
      

  22.   

    bucher(bucher) 的回答真是太精彩了,我又学到了一招,相比来说,我的方法不值一提,见笑了,你有OICQ么?或者Email,希望能常向你请教
      

  23.   

    除此之外,还有下列方法可以考虑:
    1 IDataObject - 我不清楚在VB中是否可行
    2 MSMQ - 这种方法并不是基于DCOM,而是在NT/Win2000中的connectionless 消息传输方法。上面的两种方法都能传输binary data. 不过不一定适合你的要求,因此仅供参考。
      

  24.   

    插一句嘴,“直接把stdpicture类型直接转换为binary”是很容易的,用API函数GetBitmapBits和SetBitmapBits就可以搞定。
    我想这样大概比propertybag直观一点,也不必担心微软以后是否支持的问题。
      

  25.   

    多谢各位的回答,分数已经出。
    bucher的办法已证实可行。
    TechnoFantasy推荐的书恰好我现在手头也有一本,只是平时实在没有多少时间来专研它。
    GoldenLion提到的MSMQ也应该可行,不过未作实验。
    wxj_lake提到的API转换stdpicture和binary也应该可行,尚未获证实。再次感谢各位朋友的热心帮助!