[VB6] Buffer voor Common Dialog Box te klein?

Pagina: 1
Acties:

  • looskuh
  • Registratie: Februari 2000
  • Laatst online: 07-12-2024
Hey daar. Ik heb een applicatie waarbij een lijst .jpg's van de harde schijf geselecteerd moet worden via een common dialog box. Dit moeten er makkelijk 150 kunnen zijn.

Nou doe ik dit niet via het ActiveX object, maar via de API. Heeft me wat hoofdpijn gekost, maar het werkte... dacht ik.

Nou kwam ik erachter dat ik er maar een stuk of 15 kan selecteren. Daarna houdt de string die de common dialog returned simpelweg op.

Ik dacht dus dat het aan de buffer moest liggen, aan nMaxFile dus. Dat die te klein is. Maar, nou lees ik op de MSDN:
If the buffer is too small, the function returns FALSE and the CommDlgExtendedError function returns FNERR_BUFFERTOOSMALL. In this case, the first two bytes of the lpstrFile buffer contain the required size, in bytes or characters.
Maar hij doet het dus wel degelijk, ware het niet dat hij hem maar opvult tot, denkik, 255 tekens.

De code die het doet:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Type CMDLG_FILENAME
    lStructSize As Long
    hWndOwner As Long
    hInstance As Long
    lpstrsFilter As String
    lpstrCustomsFilter As String
    nMaxCustsFilter As Long
    nsFilterIndex 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

Declare Function GetOpenFileNameA Lib "COMDLG32.DLL" (tFilename As CMDLG_FILENAME) As Integer

Const CMDLG_OFN_READONLY = &H1
Const CMDLG_OFN_OVERWRITEPROMPT = &H2
Const CMDLG_OFN_HIDEREADONLY = &H4
Const CMDLG_OFN_NOCHANGEDIR = &H8
Const CMDLG_OFN_SHOWHELP = &H10
Const CMDLG_OFN_ENABLEHOOK = &H20
Const CMDLG_OFN_ENABLETEMPLATE = &H40
Const CMDLG_OFN_ENABLETEMPLATEHANDLE = &H80
Const CMDLG_OFN_NOVALIDATE = &H100
Const CMDLG_OFN_ALLOWMULTISELECT = &H200
Const CMDLG_OFN_EXTENSIONDIFFERENT = &H400
Const CMDLG_OFN_PATHMUSTEXIST = &H800
Const CMDLG_OFN_FILEMUSTEXIST = &H1000
Const CMDLG_OFN_CREATEPROMPT = &H2000
Const CMDLG_OFN_SHAREAWARE = &H4000
Const CMDLG_OFN_NOREADONLYRETURN = &H8000
Const CMDLG_OFN_NOTESTFILECREATE = &H10000
Const CMDLG_OFN_EXPLORER = &H80000
Const CMDLG_OFN_DONTADDTORECENT = &H2000000
Const CMDLG_OFN_SHAREFALLTHROUGH = 2
Const CMDLG_OFN_SHARENOWARN = 1
Const CMDLG_OFN_SHAREWARN = 0

Public Function GetOpenFileName(tFilename As CMDLG_FILENAME) As Integer
  GetOpenFileName = GetOpenFileNameA(tFilename)
End Function

Function OpenFileDialog(hWnd As Long, sTitel As String, sFilter As String, sCurDir As String) As String
   Dim tFilename As CMDLG_FILENAME
   Dim sFilename As String
   Dim sFiletitel As String

   sTitel = sTitel + Chr$(0)
   sFilter = sFilter & "Alle Bestanden (*.*)" & Chr$(0) & "*.*" & Chr$(0) & Chr$(0)
   sFilename = Chr$(0) & Space$(255)
   sFiletitel = Chr$(0) & Space$(255)

   sCurDir = gvntNull2Arg(sCurDir, CurDir$) & Chr$(0)

   tFilename.lStructSize = Len(tFilename)
   tFilename.hWndOwner = hWnd
   tFilename.lpstrsFilter = sFilter
   tFilename.nsFilterIndex = 1
   tFilename.lpstrFile = sFilename
   tFilename.nMaxFile = &H7FFF
   tFilename.lpstrFileTitle = sFiletitel
   tFilename.nMaxFileTitle = Len(sFiletitel)
   tFilename.lpstrTitle = sTitel
   tFilename.Flags = CMDLG_OFN_FILEMUSTEXIST Or CMDLG_OFN_HIDEREADONLY Or CMDLG_OFN_ALLOWMULTISELECT 
Or CMDLG_OFN_EXPLORER Or CMDLG_OFN_DONTADDTORECENT
   tFilename.lpstrInitialDir = sCurDir

   If GetOpenFileName(tFilename) <> 0 Then
       OpenFileDialog = tFilename.lpstrFile
   Else
       OpenFileDialog = ""
   End If

End Function

tFilename.nMaxFile staat dus op &H7FFF, dit is toch 32k? Of zit ik er helemaal naast?

Bijkomend probleem is dat Visual Basic om de haverklap crasht. Het heeft er ongetwijfeld mee te maken.

offtopic:
Even een entertje op regel 74 gegeven om de topic niet helemaal lelijk te maken

[ Voor 7% gewijzigd door looskuh op 26-06-2004 01:05 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je zegt wel dat 'ie 32k mag teruggeven in je struct door nMaxFile daarop in te stellen, maar je dan moet je 'm ook de ruimte geven die 32k ergens te dumpen:
code:
1
sFilename = Chr$(0) & Space$(255)

Als je die nou ook eens init op 32k i.pv. 255 bytes? Dan crasht je VB ook niet meer omdat 'ie over de boundaries van die string heen gaat... Duh...

:Y)

[ Voor 24% gewijzigd door RobIII op 26-06-2004 01:10 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • looskuh
  • Registratie: Februari 2000
  • Laatst online: 07-12-2024
* looskuh buigt zijn hoofd in schaamte, dankt RobIII enorm, en heeft toch stiekem een nieuw inzicht vergaard ;)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
looskuh schreef op 26 juni 2004 @ 01:27:
* looskuh buigt zijn hoofd in schaamte, dankt RobIII enorm, en heeft toch stiekem een nieuw inzicht vergaard ;)
Ach, 't is al laat zullen we maar zeggen :X

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij