VB程序员博客

VB程序开发

VB生成的DLL中调用的函数TestCallDll:
Public Function TestCallDll()
  Dim strXML As String
   
  Dim strXMLFileName As String
   
  MsgBox "0001"
   
  strXMLFileName = App.Path & " est.xml"
   
  MsgBox "0002"
  MsgBox strXMLFileName
   
  Open strXMLFileName For Input As #1
   
  MsgBox "0003"
   
  strXML = Input(FileLen(strXMLFileName), #1)
   
  MsgBox "0004"
   
  Close #1
   
  MsgBox "0005"
End Function

可以肯定的是,上面的TestCallDll()函数在VB环境下是能运行通过的。随便写的VB的exe程序测试即可。
生成DLL之后,在VC中调用,单步运行,通过观察弹出信息框,可以证明在运行DLL中的“ Open strXMLFileName For Input As #1 ”时出错。出错弹出信息:
—————————
Microsoft Visual C++
—————————
Unhandled exception in VCClient.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception.
—————————
确定  
—————————

请问,我该如何更改程序,才能正确运行?
(提示:当你正确回答了这个问题,可以到这里VC板块这个问题里随便答一下,30分送上。。。)试下不用App.Path 而用固定路径,或者将这个方法加个路径参数注册一下你的DLL就行


  Dim pid As Integer
  pid = Shell("ffmpeg.exe -i c:MediaMV.flv -y c:MediaMV.avi")

把里面的 c:MediaMV.flv 换成 strInputFLV
 Dim strInputFLV As String
strInputFLV = "c:MediaMV.flv"

就没有反应了, 请指教如何传递 源文件和 转换后文件。

谢谢,可以通过,但对文件目录中有空格 或 文件名有空格的(例如C:my filesmusic 或者 2008和路雪可爱多广告 剧情篇.flv) FFMPEG命令认为是不同部分,不予执行:
 Dim pid As Integer
 Dim strShell As String
 strShell = App.Path & "ffmpeg.exe -i " & txtInputFile.Text & " -y " & frmMain.txtFolder.Text & (StripPath$(frmMain.txtInputFile.Text) & ".avi")
 pid = Shell(strShell)

如何解决?哦,加上 Chr(34) & 到里面就可,结贴送分。


知道在VC里面可以直接用query,
但是生成的TLB,在VB中应该如何用呢?请各位帮帮忙啊工程-引用-浏览已经引进来了,然后我想用里面的函数,是不是得用CREATEOBJECT啊?可我不知道这个函数里面传什么值 不需要

直接 dim obj As LibName.ClassName 就可以了。

打开 查看-对象浏览器 看看。一般是dim 后,再搞一句set obj = new LibName.ClassName
CreateObject这是晚绑定方式,性能差一些,但不需要做那个引用操作的,跟的参数是字符串形式的ProgID

谢谢大家关注,问题已经解决~


用vc做了一个ocx控件,在vc和js里面测试都没有问题
但是客户说在vb下面测试有问题,不能正确的初始化,
请问一下,vb怎么调用ocx呢?
我要在vb下面测试一下,谢谢。。。。。up~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

虚惊一场啊,客户重新注册了一下ocx,就好用了,但是具体问题原因神鬼不知啊。。。。


DLL代码
int __stdcall myadd(int a, int b)
{
return a + b;
}

已经导出了.静态调用成功
但是我想用LoadLibrary来调用..不知道怎么写这个代码.(网上看过一个SetWindowText的例子..运行了VB直接弹BUG退出了)

有人能指点下么?

附上我调用不成功的代码..
  Dim hModule As Long, ProcAddress As Long
  hModule = LoadLibrary("c:Demodll.dll")
  If hModule = 0 Then MsgBox "载入DLL失败": Exit Sub
  ProcAddress = GetProcAddress(hModule, "myadd")
  If ProcAddress = 0 Then MsgBox "得函数入口失败": Exit Sub
  CallWindowProc ProcAddress, Me.hWnd, ByVal 0&, ByVal 0&, ByVal 0&
  FreeLibrary hModule不要静态调用..静态的我已经测试通过了.呵呵..谢谢二楼的回复

以上就是静态调用,只不过是显式调用而已。

LoadLibrary 方式,微软不建议使用。

以上就是动态调用,只不过是显式调用而已。
LoadLibrary 方式,微软不建议使用。

VB 不存在静态调用动态库。
不建议使用那就是可以使用.- -可是怎么使用呢..结贴..
解决办法
http://topic.csdn.net/u/20080928/15/287c677b-69e6-432e-9f77-ee58b3fa619f.html


DLL代码
int __stdcall myadd(int a, int b)
{
return a + b;
}

已经导出了.静态调用成功
但是我想用LoadLibrary来调用..不知道怎么写这个代码.(网上看过一个SetWindowText的例子..运行了VB直接弹BUG退出了)

有人能指点下么?

附上我调用不成功的代码..
  Dim hModule As Long, ProcAddress As Long
  hModule = LoadLibrary("c:Demodll.dll")
  If hModule = 0 Then MsgBox "载入DLL失败": Exit Sub
  ProcAddress = GetProcAddress(hModule, "myadd")
  If ProcAddress = 0 Then MsgBox "得函数入口失败": Exit Sub
  CallWindowProc ProcAddress, Me.hWnd, ByVal 0&, ByVal 0&, ByVal 0&
  FreeLibrary hModule不要静态调用..静态的我已经测试通过了.呵呵..谢谢二楼的回复

以上就是静态调用,只不过是显式调用而已。

LoadLibrary 方式,微软不建议使用。

以上就是动态调用,只不过是显式调用而已。
LoadLibrary 方式,微软不建议使用。

VB 不存在静态调用动态库。
不建议使用那就是可以使用.- -可是怎么使用呢..结贴..
解决办法
http://topic.csdn.net/u/20080928/15/287c677b-69e6-432e-9f77-ee58b3fa619f.html


在窗体上有image控件和ImageList控件

求:Image控件调用ImageList的方法.Private Sub Form_Load()
  Me.Picture1.Picture = Me.ImageList1.ListImages(1).Picture
  DoEvents
End Sub
现在有个问题是.
图片是原大,不能自动调节,适应Picture1的窗口大小.
结果,只显示图片的局部,不能显示全部图片.装到ImageList的图片的尺寸是
高541,宽951
在Me.Picture1.Picture只能显示局部,不能显示全部.越绕越乱.
目标需求是
图片框一定Image一定时.装入的图片按自动调节适应到图片框中.

upupup<
CAD配合应用程序.
Sub ls()
  On Error Resume Next
  Dim Ent As AcadEntity
  With ThisDrawing
  For Each Ent In .ModelSpace
  If Ent.Layer = "细实线" Then
  Ent.color = 0
  End If
  Next Ent
  .SelectionSets("*TlsDbx*").Delete
  End With
  Set ss = ThisDrawing.SelectionSets.Add("*TlsDbx*")
  ’ss.AddItems pObj
  Dim pathName, fileName
  pathName = "C:Documents and SettingsAdministrator桌面\压力容器制造VBWMF"
  fileName = "SO_MFM"
  ThisDrawing.Export pathName & fileName, "wmf", ss
  ss.Delete

End Sub


自动编号有数据后,我要把数据库的记录全删除,那它的编号怎样才会再从1开始?Truncate Table tablename
  
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 

http://feiyun0112.cnblogs.com/清空的时候使用如下语句: 
TRUNCATE TABLE TableName 我上次也遇到过这个问题 
就是用TRUNCATE TABLE TableName 这个解决的楼上的全对这好像与VB没关系吧,与数据库有关
不知道你是啥数据库,应该不是ORACLE
我记得ORACLE里是没自动编号的字段,只有序列


Private Sub cmdshangbao_Click()
Dim i, j, k As Integer
Dim int_file As Integer
Dim filename As String
Dim filepath As String
Dim fso1, fso2
Dim fil1, fil2
Dim RetVal
Set fso1 = CreateObject("Scripting.FileSystemObject")
Set fil1 = fso1.CreateTextFile("c:ftp_file.txt", True)
fil1.writeline ("open  192.168.1.120")
fil1.writeline ("user  audit01  123456 ")
Set fso2 = CreateObject("Scripting.FileSystemObject")
Set fil2 = fso2.CreateTextFile("c:ftp_file.bat", True)
fil2.writeline ("ftp -in <  ftp_file.txt")
If Me.ListBox1.ListCount = 0 Then
    MsgBox "没有文件,退出!"
    Exit Sub
End If
int_file = Me.ListBox1.ListCount
For i = 0 To int_file - 1
    filename = Trim(Me.ListBox1.List(i))
    filepath = "put  " & ActiveWorkbook.Path & "" & filename & " " & filename
    fil1.writeline (filepath)
Next
fil1.writeline ("by ")

RetVal = Shell("c:ftp_file.bat", vbMaximizedFocus)  '这里总是报无效的过程调用或参数,为啥fil1.Close
fil2.Close
MsgBox "文件上传完成!"
Kill "c:ftp_file.txt"
Kill "c:ftp_file.bat"
End Sub

我在dos下执行c:ftp_file.bat完全正常,为什么?改为
RetVal = Shell("cmd /c c:ftp_file.bat", vbNormalFocus)
试试C/前后各一个空格,vbNormalFocus无所谓.我改成了RetVal = Shell("cmd /c c:ftp_file.bat", vbNormalFocus),
可以为什么出来的ftp命令成了:
d:>ftp -in  0 <ftp_file.txt
而bat中的文件内容为:ftp -in <ftp_file.txt
shell出来的结果多了个0,导致无法连接,为什么?
Shell("cmd /c c:ftp_file.bat")仅是调用cmd.EXE去执行c:ftp_file.bat文件,仅此而已. 去掉参数/c 试一下:
Shell("cmd c:ftp_file.bat")谢谢SYSSZ,已经找到原因
把这两句移到前面就没有问题了

fil1.Close
fil2.Close

RetVal = Shell("c:ftp_file.bat", vbMaximizedFocus) 


Private Sub cmdshangbao_Click()
Dim i, j, k As Integer
Dim int_file As Integer
Dim filename As String
Dim filepath As String
Dim fso1, fso2
Dim fil1, fil2
Dim RetVal
Set fso1 = CreateObject("Scripting.FileSystemObject")
Set fil1 = fso1.CreateTextFile("c:ftp_file.txt", True)
fil1.writeline ("open  192.168.1.120")
fil1.writeline ("user  audit01  123456 ")
Set fso2 = CreateObject("Scripting.FileSystemObject")
Set fil2 = fso2.CreateTextFile("c:ftp_file.bat", True)
fil2.writeline ("ftp -in <  ftp_file.txt")
If Me.ListBox1.ListCount = 0 Then
    MsgBox "没有文件,退出!"
    Exit Sub
End If
int_file = Me.ListBox1.ListCount
For i = 0 To int_file - 1
    filename = Trim(Me.ListBox1.List(i))
    filepath = "put  " & ActiveWorkbook.Path & "" & filename & " " & filename
    fil1.writeline (filepath)
Next
fil1.writeline ("by ")

RetVal = Shell("c:ftp_file.bat", vbMaximizedFocus)  '这里总是报无效的过程调用或参数,为啥fil1.Close
fil2.Close
MsgBox "文件上传完成!"
Kill "c:ftp_file.txt"
Kill "c:ftp_file.bat"
End Sub

我在dos下执行c:ftp_file.bat完全正常,为什么?改为
RetVal = Shell("cmd /c c:ftp_file.bat", vbNormalFocus)
试试C/前后各一个空格,vbNormalFocus无所谓.我改成了RetVal = Shell("cmd /c c:ftp_file.bat", vbNormalFocus),
可以为什么出来的ftp命令成了:
d:>ftp -in  0 <ftp_file.txt
而bat中的文件内容为:ftp -in <ftp_file.txt
shell出来的结果多了个0,导致无法连接,为什么?
Shell("cmd /c c:ftp_file.bat")仅是调用cmd.EXE去执行c:ftp_file.bat文件,仅此而已. 去掉参数/c 试一下:
Shell("cmd c:ftp_file.bat")谢谢SYSSZ,已经找到原因
把这两句移到前面就没有问题了

fil1.Close
fil2.Close

RetVal = Shell("c:ftp_file.bat", vbMaximizedFocus) 


专题:

栏目: