Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Dll и AccessXP


Автор: Serg_vnovg 9.3.2006, 12:33
Программирую в Access97, решил перейти на AccessXP. Столкнулся с проблеммой :-((
Не работает нижеприведенный код вызова DLL
Функция ошибок не дает, возвращает пустую строку.
Бился два дня. Разные машины, разные дистрибутивы.


Код

Option Compare Database
Option Explicit

Private Declare Function GetOpenFileName Lib "Comdlg32.dll" _
  Alias "GetOpenFileNameA" (pOpenFilename As OpenFilename) _
  As Long


'UDT for the GetOpenFileName and GetSaveFileName functions
Private Type OpenFilename
  lStructSize As Long
  hwndOwner As Long
  hInstance As Long
  lpstrFilter As String
  lpstrCustomFilter As String
  nMaxCustFilter As Long
  iFilterIndex 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

Public Function FileOpen(initDir As String) As String
Dim Struc As OpenFilename
Dim x As Long
Dim wPos As Integer
      
   Struc.lStructSize = Len(Struc)
   Struc.lpstrFilter = "*.mdb"
   Struc.iFilterIndex = 1
   Struc.lpstrFile = String(256, 0)
   Struc.nMaxFile = Len(Struc.lpstrFile) - 1
   Struc.lpstrFileTitle = Struc.lpstrFile
   Struc.nMaxFileTitle = Struc.nMaxFile
   Struc.lpstrInitialDir = initDir
   Struc.lpstrTitle = "Ïîèñê ôàéëà"
   Struc.Flags = 0
   
   x = GetOpenFileName(Struc)
   If x Then
       wPos = InStr(Struc.lpstrFile, Chr(0))
       FileOpen = Left$(Struc.lpstrFile, wPos - 1)
   Else
       FileOpen = ""
   End If
   
End Function

Public Sub Test()
  MsgBox FileOpen("")
End Sub


Использую вызовы Dll не только для диалоговых окон. Написано много программного под Access97 где вызываю Dll API, а так же DLL разработанные на Builder для ускорения работы приложения и выполнения функций, которые в Access реализовывать не очень удобно. Не хочется при переходе на новую версию Access переписывать все, что наработано ранее.

Использую windowsXP. В системе установлен Aceess97 и AccessXP одновременно. При копировании кода из одного приложения в другое получаем нормальную работу под Aceess97 и отсутствие результатов под AceessХР. В FAQ ничего не нашел. Неужели придется остаться под Aceess97. У клиентов периодически его сносят под новую версию, приходится приходить у устанавливать Aceess97. Очень неудобно!

Автор: Akina 9.3.2006, 13:15
Цитата(MSDN)

With Windows 2000, the OPENFILENAME structure has increased to include some additional members. However, this causes problems for applications on previous operation systems. To use the current header files for applications on Windows 95/98 and Windows NT 4.0, either use the #define "/D_WIN32_WINNT=0x0400" or use OPENFILENAME_SIZE_VERSION_400 for the lStructSize member of OPENFILENAME.

А вообще - чего тебя понесло в API? используй архистандартный CommonDialog.ShowOpen

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)