Выбор файла и Windows 2000

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Matv
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 13.11.2002 (Ср) 9:20
Откуда: Украина, Харьков

Выбор файла и Windows 2000

Сообщение Matv » 08.06.2004 (Вт) 11:00

Применял для выбора файла для открытия API функцию:

Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long

Под Windows98 всё работало, но когда ексешник запустили в среде Windows 2000 - runtime error 5 (неправильный вызов процедуры).

Что правильней делать? Избегать применения API функций и пользоваться только объектами VB6 или есть более универсальные API функции? Или нужно анализировать оболочку и применять разные функции (как и какие)?
Заранее благодарен.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.06.2004 (Вт) 11:21

Можешь использовать что-то типа
Код: Выделить всё
#If Win32 Then
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameW" (pOpenfilename As OPENFILENAME) As Long
#Else
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
#End If


Но дело не в этом, GetOpenFileName это функция универсальная, она работает на любой версии Windows. Приведи пример вызова, наверное там что-то неправильно.
Lasciate ogni speranza, voi ch'entrate.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 08.06.2004 (Вт) 11:48

В качестве варианта:

Вариант 1:
Код: Выделить всё
'На форму TextBox и CommandButton

Option Explicit
Private Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type

Private Enum WhatBrowse
BIF_RETURNONLYFSDIRS = &H1
BIF_BROWSEINCLUDEFILES = &H1 Or &H4000
BIF_BROWSEFORCOMPUTER = &H1000
BIF_BROWSEFORPRINTER = &H2000
End Enum

Private Const MAX_PATH = 260
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long

Public Function fBrowseForFolder(hWndOwner As Long, sPrompt As String, WhatBr) As String
Dim iNull As Integer
Dim lpIDList As Long
Dim lResult As Long
Dim sPath As String
Dim udtBI As BrowseInfo
With udtBI
.hWndOwner = hWndOwner
.lpszTitle = lstrcat(sPrompt, "")
.ulFlags = WhatBr
End With
lpIDList = SHBrowseForFolder(udtBI)
If lpIDList Then
sPath = String$(MAX_PATH, 0)
lResult = SHGetPathFromIDList(lpIDList, sPath)
Call CoTaskMemFree(lpIDList)
iNull = InStr(sPath, vbNullChar)
If iNull Then sPath = Left$(sPath, iNull - 1)
End If
fBrowseForFolder = sPath
End Function

Private Sub Command1_Click()
Dim sStr As String
sStr = fBrowseForFolder(hWnd, "Choose folder, file, printer or computer", BIF_BROWSEINCLUDEFILES)
Text1.Text = sStr
End Sub

Matv
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 13.11.2002 (Ср) 9:20
Откуда: Украина, Харьков

Сообщение Matv » 08.06.2004 (Вт) 14:23

alibek писал(а): GetOpenFileName это функция универсальная, она работает на любой версии Windows. Приведи пример вызова, наверное там что-то неправильно.


Private Sub Form_Load()
Dim DXFFile As OPENFILENAME
Dim t$, t1$, i As Integer
PathMSAPR$ = SetPathMSAPR 'Функция определяет путь к директории MSAPR, директория DXF является поддиректорией MSAPR
DXFFile.lStructSize = Len(DXFFile)
'Set the parent window
DXFFile.hwndOwner = Me.hWnd
'Set the application's instance
DXFFile.hInstance = App.hInstance
'Select a filter
DXFFile.lpstrFilter = "DXF Files (*.dxf)" + Chr$(0) + "*.dxf" + Chr$(0)
'create a buffer for the file
DXFFile.lpstrFile = Space$(254)
'set the maximum length of a returned file
DXFFile.nMaxFile = 255
'Create a buffer for the file title
DXFFile.lpstrFileTitle = Space$(254)
'Set the maximum length of a returned file title
DXFFile.nMaxFileTitle = 255
'Set the initial directory
DXFFile.lpstrInitialDir = PathMSAPR + "dxf"
'Set the title
DXFFile.lpstrTitle = "Выбор файла для обработки "
'No flags
DXFFile.flags = 0
If GetOpenFileName(DXFFile) Then
FileName$ = Mid$(DXFFile.lpstrFile, DXFFile.nFileOffset + 1, DXFFile.nFileExtension - DXFFile.nFileOffset - 1)
Else
MsgBox "Файл не выбран" + Chr(13) + "Программа завершена"
End
End If

'FileName – имя файла (без расширения)
End Sub


А может проще применить:
CommonDialog1.CancelError = True
CommonDialog1.Filter = "Все файлы |*.*|DXF файлы |*.dxf|"
CommonDialog1.ShowOpen
Open CommonDialog1.FileName For Output As #1

не знаю только про универсальность данного способа.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 5

    TopList