vb弹出对话框代码报错。

fireegg 2016-12-27 10:20:06
我使用以下代码:

Dim oDLG
Set oDLG = CreateObject("MSComDlg.CommonDialog")
With oDLG
.DialogTitle = "保存文件"
‘其他脚本
end WITH

在本机有vb安装的电脑执行没问题,但是将程序编译后拷贝到另外的电脑,没有安装VB的电话则执行到 Set oDLG = CreateObject("MSComDlg.CommonDialog") 的时候报以下错误:


请教这是什么问题?网上搜的要注册comdlg32.ocx 也没用。

另外的方法说调用 api
Declare Function GetOpenFileName Lib "COMDLG32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
但是不知道引用哪个,编译时这个无法通过。谢谢
...全文
602 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
kiiiiloos 2017-01-09
  • 打赏
  • 举报
回复
引用 8 楼 fireegg的回复:
[quote=引用 7 楼 Chen8013 的回复:]
谢谢。


谢谢您的指导。看下我的图和脚本

输入不存在的文件名就报错了。
您的代码就是上方那些代码吗?
Option Explicit 如果不加行不行?貌似加到我的程序进来,有其他的程序,加这个会报错,不加的话可以编译,谢谢您[/quote] option explicit是引用显式变量 意思是指在代码中不允许出现未定义的变量使用
fireegg 2016-12-31
  • 打赏
  • 举报
回复
引用 14 楼 Chen8013 的回复:
[quote=引用 13 楼 fireegg 的回复:] ........... 这个定义的是Private Declare Function GetOpenFileName Lib 。。。。。 是OPENFILE,跳出窗口显示的是打开文件,是不是有个定义SAVEFILE的?用SAVE是不是会更好?谢谢
你自己在主贴中,提到的就是“ GetOpenFileName” !  [/quote] 非常感谢老师。谢谢
舉杯邀明月 2016-12-31
  • 打赏
  • 举报
回复
引用 13 楼 fireegg 的回复:
........... 这个定义的是Private Declare Function GetOpenFileName Lib 。。。。。 是OPENFILE,跳出窗口显示的是打开文件,是不是有个定义SAVEFILE的?用SAVE是不是会更好?谢谢
你自己在主贴中,提到的就是“ GetOpenFileName” !  如果用“保存”对话框,用另一个API: GetSaveFileName() 使用方面就名称不同,其它是一样的(当然在“对话框”中的一些行为细节也有所区别)。 如果要“保存”对话框,还有“添加默认文件名”,要改一下代码:
' 模块 增加API声明:
Private Declare Function GetSaveFileName Lib "Comdlg32" Alias "GetSaveFileNameW" _
                             (pOpenfilename As OPENFILENAME) As Long

' 增加接口函数:
Public Function ShowSave(hWndOwner As Long, FileOpen As String, _
                        Optional Title As String = "保存文件:", _
                        Optional Filter As String = "所有文件(*.*)|*.*", _
                        Optional FilterIndex As Long = 0&, _
                        Optional StartDir As String = vbNullChar, _
                        Optional Flags As Long = &H806&) As Long
      Dim OpenFN  As OPENFILENAME
      Dim strFilt As String
      Dim strName As String
      Dim strTemp As String
 
   ' 之前的“打开文件”如果要设置默认文件名,这句也这样改一下
   strName = FileOpen & vbNullChar & String$(264&, 0)
   strTemp = strName
   strFilt = Replace(Replace(Filter & vbNullChar, "|", vbNullChar), ",", vbNullChar)
   OpenFN.lStructSize = 76&
   OpenFN.hWndOwner = hWndOwner
   OpenFN.hInstance = App.hInstance
   OpenFN.lpstrTitle = StrPtr(Title)
   OpenFN.lpstrFilter = StrPtr(strFilt)
   OpenFN.nFilterIndex = FilterIndex
   OpenFN.lpstrDefExt = 5& + StrPtr(strFilt) + InStrB(1&, Filter, "|")
   OpenFN.lpstrInitialDir = StrPtr(StartDir)
   OpenFN.lpstrFile = StrPtr(strName)
   OpenFN.nMaxFile = 256&
   OpenFN.lpstrFileTitle = StrPtr(strTemp)
   OpenFN.nMaxFileTitle = 256&
   OpenFN.Flags = Flags
   If (GetSaveFileName(OpenFN)) Then
      FileOpen = Left$(strName, InStr(1&, strName, vbNullChar) - 1&)
      ShowSave = 0&
   Else
      ShowSave = -1&
   End If
End Function
调用示例:
Private Sub Command2_Click()
   Dim strFilt As String
   Dim strFile As String

   strFile = "ABCD123"
   ' ↑ 如果在在“对话框”中设置默认文件名,先把这个变量赋值
   strFilt = "文本文件(*.txt)|*.txt,所有文件(*.*)|*.*" & vbNullChar
   If (ShowSave(Me.hWnd, strFile, , strFilt)) Then
      MsgBox "用户选择了“取消”。", 64
   Else
      MsgBox "要保存的文件名是:" & strFile, 64
   End If
End Sub
fireegg 2016-12-31
  • 打赏
  • 举报
回复
引用 11 楼 Chen8013 的回复:
VB6代码,本来就应该加上“Option Explicit”才是最好的! 我给你的代码,有“Option Explicit”都是能编译通过的,你把它去掉了也不会有问题。 (除非你拿过去“改错了”…………)
老师,非常感谢,弱弱问一下,W版和A版是什么东东? 完全用你的代码可以了。再问下怎么传一个打开窗口的默认的文件名上去?我将strFile 赋值不行 这个定义的是Private Declare Function GetOpenFileName Lib 。。。。。 是OPENFILE,跳出窗口显示的是打开文件,是不是有个定义SAVEFILE的?用SAVE是不是会更好?谢谢
赵4老师 2016-12-30
  • 打赏
  • 举报
回复
在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下; 所以要注意: 在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。 且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll
舉杯邀明月 2016-12-29
  • 打赏
  • 举报
回复
VB6代码,本来就应该加上“Option Explicit”才是最好的! 我给你的代码,有“Option Explicit”都是能编译通过的,你把它去掉了也不会有问题。 (除非你拿过去“改错了”…………)
舉杯邀明月 2016-12-29
  • 打赏
  • 举报
回复
1. 你用的并不是我的代码!我用的是 W版的API代码。   就算你“没窗口”,那个窗口句柄是可以传0的。   我在回复你之前已经试过了,用你那样的“A版API代码”,在我这儿根本就不能正确执行,   调用API时直接就返回,根本就不弹框。   在调用语句后设置了一个断点,在执行调用后,查到的信息是“错误的参数”。 2. 你说“不能打开不存在的文件”,是你自己封装代码的问题!   你知道 ofn.flags = 6148 代表什么含义吗!!!!   这就是你自己要求“只能打开已经存在的文件”!    你可以把6148改成2052或者是4 ,再试试看!
fireegg 2016-12-29
  • 打赏
  • 举报
回复
而且我是没有窗口的cls文件。Me.hWnd 不能用。
fireegg 2016-12-29
  • 打赏
  • 举报
回复
引用 7 楼 Chen8013 的回复:
谢谢。


谢谢您的指导。看下我的图和脚本

输入不存在的文件名就报错了。
您的代码就是上方那些代码吗?
Option Explicit 如果不加行不行?貌似加到我的程序进来,有其他的程序,加这个会报错,不加的话可以编译,谢谢您
舉杯邀明月 2016-12-28
  • 打赏
  • 举报
回复
给你一个截图看看:
我输入的文件名:123456abc 就是一个不存在的文件,
(如果有,它会排在图中 Adodb_Stream详解(属性及方法).txt 的前面)
但是在对话框中点“打开”之后,不会有任何提示,直接返回了相应的文件名。

舉杯邀明月 2016-12-28
  • 打赏
  • 举报
回复
你的调用语句是怎么写的? (你的操作系统是哪个版本?难道跟操作系统有关…………但我在各个系统中都没这种问题啊)
fireegg 2016-12-28
  • 打赏
  • 举报
回复
引用 4 楼 Chen8013 的回复:
[quote=引用 3 楼 fireegg 的回复:] [quote=引用 2 楼 Chen8013 的回复:] 用W版API的代码,给你一段参考: 。。。。。
请教你,这个open是要文件存在才行,如果不存在是怎么用呢?谢谢[/quote] 胡说 !!! 这个代码,“不存在的文件”,也是“可以打开”的 ! (它实际上只是返回了文件的“路径+文件名”而已,并不执行真正的打开操作。跟用控件的效果是一样的。)[/quote] 会提示我文件不存在呀,呵呵。
舉杯邀明月 2016-12-28
  • 打赏
  • 举报
回复
引用 3 楼 fireegg 的回复:
[quote=引用 2 楼 Chen8013 的回复:] 用W版API的代码,给你一段参考: 。。。。。
请教你,这个open是要文件存在才行,如果不存在是怎么用呢?谢谢[/quote] 胡说 !!! 这个代码,“不存在的文件”,也是“可以打开”的 ! (它实际上只是返回了文件的“路径+文件名”而已,并不执行真正的打开操作。跟用控件的效果是一样的。)
fireegg 2016-12-28
  • 打赏
  • 举报
回复
引用 2 楼 Chen8013 的回复:
用W版API的代码,给你一段参考: 。。。。。
请教你,这个open是要文件存在才行,如果不存在是怎么用呢?谢谢
舉杯邀明月 2016-12-27
  • 打赏
  • 举报
回复
用W版API的代码,给你一段参考:
' 标准模块中的代码:
Option Explicit

Private Declare Function GetOpenFileName Lib "Comdlg32" Alias "GetOpenFileNameW" _
                             (pOpenfilename As OPENFILENAME) As Long

Private Type OPENFILENAME
    lStructSize      As Long
    hWndOwner        As Long
    hInstance        As Long
    lpstrFilter      As Long
    lpstrCustFilter  As Long
    nMaxCustFilter   As Long
    nFilterIndex     As Long
    lpstrFile        As Long
    nMaxFile         As Long
    lpstrFileTitle   As Long
    nMaxFileTitle    As Long
    lpstrInitialDir  As Long
    lpstrTitle       As Long
    Flags            As Long
    nFileOffset      As Integer
    nFileExtension   As Integer
    lpstrDefExt      As Long
    lCustData        As Long
    lpfnHook         As Long
    lpTemplateName   As Long
End Type

Private Const OFN_HIDEREADONLY   As Long = 4&         ' 隐藏“只读”选项


Public Function ShowOpen(hWndOwner As Long, FileOpen As String, _
                        Optional Title As String = "打开文件:", _
                        Optional Filter As String = "所有文件(*.*)|*.*", _
                        Optional FilterIndex As Long = 0&, _
                        Optional StartDir As String = vbNullChar, _
                        Optional Flags As Long = OFN_HIDEREADONLY) As Long
      Dim OpenFN  As OPENFILENAME
      Dim strFilt As String
      Dim strName As String
      Dim strTemp As String

   strName = String$(264&, 0)
   strTemp = strName
   strFilt = Replace(Replace(Filter & vbNullChar, "|", vbNullChar), ",", vbNullChar)
   OpenFN.lStructSize = 76&
   OpenFN.hWndOwner = hWndOwner
   OpenFN.hInstance = App.hInstance
   OpenFN.lpstrTitle = StrPtr(Title)
   OpenFN.lpstrFilter = StrPtr(strFilt)
   OpenFN.nFilterIndex = FilterIndex
   OpenFN.lpstrDefExt = 5& + StrPtr(strFilt) + InStrB(1&, Filter, "|")
   OpenFN.lpstrInitialDir = StrPtr(StartDir)
   OpenFN.lpstrFile = StrPtr(strName)
   OpenFN.nMaxFile = 256&
   OpenFN.lpstrFileTitle = StrPtr(strTemp)
   OpenFN.nMaxFileTitle = 256&
   OpenFN.Flags = Flags
   If (GetOpenFileName(OpenFN)) Then
      FileOpen = Left$(strName, InStr(1&, strName, vbNullChar) - 1&)
      ShowOpen = 0&
   Else
      ShowOpen = -1&
   End If
End Function
' 窗体代码(调用示例)
Option Explicit

Private Sub Command1_Click()
   Dim strFilt As String
   Dim strFile As String
   
   strFilt = "文本文件(*.txt)|*.txt,所有文件(*.*)|*.*" & vbNullChar
   If (ShowOpen(Me.hWnd, strFile, , strFilt)) Then
      MsgBox "用户选择了“取消”。", 64
   Else
      MsgBox "选择的文件是:" & strFile, 64
   End If
End Sub
舉杯邀明月 2016-12-27
  • 打赏
  • 举报
回复
按理说,如果comdlg32.ocx注册成功,应该是可以用这段代码创建对象的。 用API打开文件,我用的是W版的,一直使用正常。 A版的“直接翻译”过来的代码,运行失败。 估计还是得把那些“字符串成员”换成Long类型(指针),   并把“字符串”转换成ANSI编码、数据首址赋给相应的指针值, 再把结构体传递给API才行。 与其这样,倒不如直接就用W版的API…………

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧