回 帖 发 新 帖 刷新版面

主题:[讨论]关于用API打开“另存为”对话框的问题

Option Explicit

Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Const OFN_OVERWRITEPROMPT = &H2           '当覆盖时提示
Private Const OFN_PATHMUSTEXIST = &H800           '路径必须存在
'* VB自带的API浏览器里的声明
Private Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As String
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As String
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String
    lpstrTitle As String
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type

'* FoxAPI Ver1.5里的声明,出错
'Private Type OPENFILENAME
'        lStructSize As Long
'        lpstrDefExt As String
'        lCustData As Long
'        lpfnHook As Long
'        lpTemplateName As String
'        nMaxFile As Long
'        lpstrFileTitle As String
'        nMaxFileTitle As Long
'        lpstrInitialDir As String
'        lpstrTitle As String
'        flags As Long
'        nFileOffset As Integer
'        nFileExtension As Integer
'        lpstrCustomFilter As String
'       nMaxCustFilter As Long
'        nFilterIndex As Long
'       lpstrFile As String
'       hInstance As Long
'        lpstrFilter As String
'        hwndOwner As Long
'End Type

Private Function ShowSave() As String
Dim ofname As OPENFILENAME
ofname.lStructSize = Len(ofname)
ofname.hwndOwner = Form1.hWnd
ofname.lpstrFilter = "JPG Files (*.jpg)" + Chr$(0) + "*.jpg" + Chr$(0) + "All Files (*.*)" + Chr$(0) + "*.*" + Chr$(0)
ofname.lpstrFile = Space$(254)
ofname.nMaxFile = 255
ofname.lpstrFileTitle = Space$(254)
ofname.nMaxFileTitle = 255
ofname.lpstrInitialDir = "C:\"
ofname.lpstrTitle = "另存为"
ofname.flags = OFN_OVERWRITEPROMPT Or OFN_PATHMUSTEXIST
ofname.lpstrDefExt = ".jpg"
Debug.Print ofname.nFileExtension
If GetSaveFileName(ofname) Then
    ShowSave = Trim$(ofname.lpstrFile)
Else
    ShowSave = ""
End If
End Function

Private Sub Command1_Click()
Debug.Print ShowSave
End Sub
当声明OPENFILENAME结构时使用vb自带的api浏览器里的格式时,是正常的。
但使用FoxAPI v1.5里的声明时,vb就崩溃了~~。
两种声明只是结构里的元素的顺序不一样而已,真是其名其妙。
难道是由于所谓的“内存对齐”的原因??

回复列表 (共3个回复)

沙发

找到一个相关的解释,http://www.bianceng.cn/vbjc/apidy/ap76.htm

----3、用户自定义类型(User-definedType)参数的传递

----用户自定义类型在VB中是一种重要的数据类型,它为编程者提供了很大的灵活性,使开发人员可以根据需要构造自己的数据结构。它相当于C/C++中的结构类型(structure)。在VB中,允许程序员以传址的方式将自定义数据类型参数传入动态库,DLL过程也可以将修改后的参数返回VB程序。但是,在VB中仍然不支持以传值的方式传递用户自定义类型参数。

----传递用户自定义类型参数时,必须确保VB中的数据类型的成员与动态库中的结构成员是一一对应的,所占空间也必须严格一致。这里所说的一一对应,不仅是指VB中的所有结构成员在动态库的结构中都必须有对应的元素,而且它们在数据结构中定义的顺序也必须严格一致,这是VB中使用的"数据结构成员对齐方式"决定的。在VB中,数据结构使用双字对齐方式(4-bytealignment),因此,在用户自己生成用于VB调用的动态连接库时,也必须把编译选项"structurememberalignment"设为4字节(如前文所述)。
...

板凳


[em14][em14][em14]
这也行? 结构每个元素的位置应该是固定的吧,哪能乱换顺序.

3 楼


OPENFILENAME在FoxAPI 里的结构声明与vb6自带的api浏览器里结构声明不一样.
由于我一直都是用的foxAPI,今天居然就遇到这样的问题了,害得我找了半天的原因

我来回复

您尚未登录,请登录后再回复。点此登录或注册