我用VB实现一个远程屏幕监视,现在遇到如下一个问题:我用VB6编译器打开服务端与客服端,这样可以正常监视对方屏幕!
但是我用VB6把工程编译成EXE文件后,再在同样的2台电脑上运行,结果就不能监视屏幕了。确切的说,是没图片传送过来了!我把所要用的控件和DLL文件都放到system32下面了的。请大家指点
我查了相关资料,有的说tlb文件不需要注册,tlb文件里面只包含一些结构和声明什么的,为什么我后面不注册了,还是一样的情况呢?
我把exe文件拷贝到其他电脑上,这台电脑没注册istream.tlb,还是提示一样的问题!提示的是:什么 with block 还是block with ,记得不怎么清楚了 ,希望有经验的指定下!谢谢啦!因为是在公司写的,公司不能联网,也不能带东西出来!真郁闷
但是我用VB6把工程编译成EXE文件后,再在同样的2台电脑上运行,结果就不能监视屏幕了。确切的说,是没图片传送过来了!我把所要用的控件和DLL文件都放到system32下面了的。请大家指点
我查了相关资料,有的说tlb文件不需要注册,tlb文件里面只包含一些结构和声明什么的,为什么我后面不注册了,还是一样的情况呢?
我把exe文件拷贝到其他电脑上,这台电脑没注册istream.tlb,还是提示一样的问题!提示的是:什么 with block 还是block with ,记得不怎么清楚了 ,希望有经验的指定下!谢谢啦!因为是在公司写的,公司不能联网,也不能带东西出来!真郁闷
应该是你引用了 tlb 里面的某个对象, 或接口, 但在其他的电脑中缺少实现那个对象或接口的类库, 造成了无法实例化引用的对象的确, tlb 里面一般就是存了些 结构,常数,api声明还有些com对象接口之类的内容
不做安装软件只拷贝是不行的
http://download.csdn.net/source/427333
------------------------------------------------------------------------------------
提示:
运行时错误:‘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是对象,这个对象里面没属性,不知道怎么确定了,很痛苦啊,网上找不到相关资料!
-----------------------------------------------------------------------
大神,赐于我能量,让我解决了吧!呜呼哀哉!!!
还是在A电脑上,我用VB6打开,用编译成EXE文件,在A电脑上运行,就出现上面的错误!
所有VB需要的库文件,都有的,因为机器上都装了VB软件的的,我也检查了所有需要文件,都在的
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
更不知道其中包含那些DLL了
定义是:
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设置相应参数
作用是:把图象输出到流,以便进行网络传输。