我用VB实现一个远程屏幕监视,现在遇到如下一个问题:我用VB6编译器打开服务端与客服端,这样可以正常监视对方屏幕!
但是我用VB6把工程编译成EXE文件后,再在同样的2台电脑上运行,结果就不能监视屏幕了。确切的说,是没图片传送过来了!我把所要用的控件和DLL文件都放到system32下面了的。请大家指点
我查了相关资料,有的说tlb文件不需要注册,tlb文件里面只包含一些结构和声明什么的,为什么我后面不注册了,还是一样的情况呢?
我把exe文件拷贝到其他电脑上,这台电脑没注册istream.tlb,还是提示一样的问题!提示的是:什么 with block 还是block with ,记得不怎么清楚了 ,希望有经验的指定下!谢谢啦!因为是在公司写的,公司不能联网,也不能带东西出来!真郁闷

解决方案 »

  1.   

    可能是你的某个类或者对象没有初始化就被调用, 导致出现了那个 with xx
    应该是你引用了 tlb 里面的某个对象, 或接口, 但在其他的电脑中缺少实现那个对象或接口的类库, 造成了无法实例化引用的对象的确, tlb 里面一般就是存了些 结构,常数,api声明还有些com对象接口之类的内容
      

  2.   

    那台机器上有VB程序运行需要的所有库么?比如msvbvm60.dll
    不做安装软件只拷贝是不行的
      

  3.   

    看看这个范例可能对你有帮助
    http://download.csdn.net/source/427333
      

  4.   

    我特意截了个图来。
    ------------------------------------------------------------------------------------
    提示:
    运行时错误:‘91’
    未设置对象变量或with block变量
    ------------------------------------------------------------------------------------
    具体代码位置:
    If GdipSaveImageToStream(lBitmap, picStream, tJpgEncoder, tParams) <> 0 Then
        GdipDisposeImage lBitmap
        Set picStream = Nothing
        GdiplusShutdown lGDIP
        Exit Sub
    End If
    ----------------------------------------------------------------
    lBitmap这个我跟踪过了,是有的。
    picStream 是Istream.tlb这个类型库的,定义dim picStream as Istream
    ----------------------------------------------------------------
    picStream是通过这个创建的
    If CreateStreamOnHGlobal(ByVal 0, 1, picStream) <> 0 Then
        GdipDisposeImage lBitmap
        GdiplusShutdown lGDIP
        Exit Sub
    End If
    --------------------------------------------------------------------
    错误的位置是这句:
    GdipSaveImageToStream(lBitmap, picStream, tJpgEncoder, tParams)
    很奇怪,既然说Istream.ltb这个不需要注册,那为什么编译成exe文件之后就提示错误,
    如果是代码错误,那为什么在VB6中又能运行?
    ---------------------------------------------------------------------
    更奇怪的是,如果需要注册才能运行的话,为什么前面我刚写完这程序的时候,我也没注册,直接编译成exe文件之后,就可以直接运行了,就是在我用vb6打包了后,就再也不能运行起来了。
    我每个变量都跟踪了,除picStream这个外,因为picStream是对象,这个对象里面没属性,不知道怎么确定了,很痛苦啊,网上找不到相关资料!
    -----------------------------------------------------------------------
    大神,赐于我能量,让我解决了吧!呜呼哀哉!!!
      

  5.   

    在同一台电脑上运行的,比如这样,我在A电脑上用VB6打开,点运行,这样就OK,
    还是在A电脑上,我用VB6打开,用编译成EXE文件,在A电脑上运行,就出现上面的错误!
      

  6.   

    刚写完的时候,我什么都没注册,也没弄安装软件,就直接编译成exe文件,就可以运行了,,后面,我用VB6做了安装软件之后,就再也不能云行了呢
    所有VB需要的库文件,都有的,因为机器上都装了VB软件的的,我也检查了所有需要文件,都在的
      

  7.   

    将工程属性中,“Make”这个标签页中最下面的“Remove information abount unused ActiveX Controls” 打钩去掉试试。
      

  8.   

    下面是全这个模块的代码:请看看
    Public Sub send_screen(Optional ByVal quality As Byte = 80)
    Dim tJpgEncoder As GUID
    Dim tParams As EncoderParameters
    Dim tSI As GdiplusStartupInput
    Dim lRes As Long
    Dim lGDIP As Long
    Dim lBitmap As Long
    Dim picStream As IStream
    dim kk as long
    tSI.GdiplusVersion = 1
    ss = GdiplusStartup(lGDIP, tSI)
    If ss <> 0 Then
        Exit Sub
    End If
    kk = hdl_window()'这个返回一个屏幕图片句柄
    If GdipCreateBitmapFromHBITMAP(kk, 0, lBitmap) <> 0 Then
        GdiplusShutdown lGDIP
        DeleteObject kk
        Exit Sub
    End If
    kk = DeleteObject(kk)
    Set picStream = Nothing
    If CreateStreamOnHGlobal(ByVal 0, 1, picStream) <> 0 Then
        GdipDisposeImage lBitmap
        GdiplusShutdown lGDIP
        Exit Sub
    End If
    CLSIDFromString StrPtr("{557CF402-1A04-11D3-9A73-0000F81EF32E}"), tJpgEncoder
    tParams.Count = 1
    With tParams.Parameter
        CLSIDFromString StrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB3505E7EB}"), .GUID
        .NumberOfvalues = 1
        .type = 1
        .value = VarPtr(quality)
    End With
    If GdipSaveImageToStream(lBitmap, picStream, tJpgEncoder, tParams) <> 0 Then
    '这句就是出错误的地方
        GdipDisposeImage lBitmap
        Set picStream = Nothing
        GdiplusShutdown lGDIP
        Exit Sub
    End If
    GdipDisposeImage lBitmap
    GdiplusShutdown lGDIP
    Set picStream = Nothing
    End Sub
      

  9.   

    你没说到问题啊,功能已经实现,不需要原代码了。就是exe运行不了!谢谢,看清楚!
      

  10.   

    GdipSaveImageToStream是个自定义函数吧?
      

  11.   

    lz 你把这段代码,单独在一个工程中测试下吧, 另外要说的就是你怎么确定的是 GdipSaveImageToStream 这句导致的错误? 你都说运行之后才出错, 你一点点的排查的吗?听我的... 把这堆代码, 拿出来在一个独立的工程中进行测试...
      

  12.   

    除了你工程直接引用的 dll,还有你 tlb 中声明相关的 dll 也要放在搜索路径下(系统目录、程序所在目录)。
      

  13.   

    我都一句一句去输出的啊,GdipSaveImageToStream 下面的就没输出了,上面的就有输出!而且整个工程,就引用的Istream.tlb这个出问题最多!
      

  14.   

    可是我不知道Istream.tlb中到底有哪些函数啊,因为这个TLB文件,不是我自己写的!是拿别人的。
    更不知道其中包含那些DLL了
      

  15.   

    这个是Gdiplus.dll中的函数啊,怎么会是自定义函数呢,是API!
    定义是:
    Private Declare Function GdipSaveImageToStream Lib "GdiPlus" (ByVal image As Long, ByVal Stream As IStream, ByRef clsidEncoder As GUID, ByRef encoderParams As Any) As Long
    image图片句柄
    Stream流对象
    clsidEncoder格式
    encoderParams设置相应参数
    作用是:把图象输出到流,以便进行网络传输。
      

  16.   

    你用ole viewer打开哪个tlb,看看导入了什么dll (importlib)
      

  17.   

    就用个GDI+和网络都用不好还这么屌,无语。