Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".

Узнай цену своей работы

Формулировка задачи:

Ну т.е. есть proga.exe -моя (VB6).
Что она делает:
При запуске с параметром
proga.exe some_path/the_file.tif
1) отображает the_file.tif
2) позволяет напр. удалить the_file.tif, либо вносит данные о пути к этому файлу и какие-то комментарии об нем в БД.
При запуске прога соотв. устанавливает связь с объектами БД.

Все работает на отлично на любой системе, т.е. например если кинуть графический файл на иконку proga.exe, то коннект к БД осуществляется и делает что задумано
Но задача несколько хитрее.
Есть "виртуальный принтер" -не мой, но подогнанный хекс-методами под мои нужды.
Что он делает:
1) при печати создает the_file.tif
2) запускает (из-под собственного драйвера) программу proga.exe, а в качестве параметра отдает ей имя новосозданного tif-файла.
Ну, принтер работает на x64 и x86, т.е. файл tiff генерируется, proga.exe запускается и файл в качестве параметра исправно скармливается.
И не было печали, пока не добавил в proga.exe общение с БД.
Так вот, я на Vista x64 столкнулся со следующей проблемой (сразу скажу что на 32-битных Vista/7 и Win7 x64 пока не проверял).
На XP проблема отсутствует.
Будучи запущенной из-под принтера, proga.exe ругается и на my_JRO , и на adoConn (если даже my_JRO убрать) - неважно позднее связывание или раннее.
Пишет:
Run-time error -2147024770 (8007007e) Automation error The specified module could not be found.
Т.е. запускаем прогу ручками - есть коннект к БД.
Прогу запускает драйвер принтера - нет коннекта к БД.
Принтер запускает прогу под текущим пользователем, т.е. "правовой" разницы с ручным запуском не вижу.
Идей нет.
Если только не отказаться от прямого контакта с БД proga.exe.
По идее proga.exe может кидаться WM_COPYDATA с основным приложением, запущенным классическим методом и кот. не имеет таких проблем в общении с БД.
Но хотелось бы иметь еще возможность запускать основное приложение из под proga.exe (если еще не запущено), а об этом тогда придется забыть, ибо цепочка
Печать на принтер -> Запуск proga.exe -> Запуск основного приложения
приведет к таким же проблемам в общении с БД и в основном приложении.
Как работает принтер я толком не знаю, могу сказать что драйвера на x64 там свои, 32-битная proga.exe запускается от имени того пользователя, который печатает, т.е. текущего. Но почему-то при этом в упор не видит объекты БД.
Подозреваю что будучи запущенной из-под 64-битного драйвера, прога не полностью понимает свою 32-битную сущность, т.е. какой-то другой environment (не видит 32-битные драйвера БД, кот. в системе естественно установлены). Может можно ей это как-то объяснить в явном виде?

Решение задачи: «Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".»

textual
Листинг программы
Private Sub Form_Load()
  Fix_x64_Environment
  DataBaseConnect
End Sub

'===

Private Declare Function SetEnvironmentVariable Lib "kernel32" Alias "SetEnvironmentVariableA" _
 (ByVal lpName As String, ByVal lpValue As String) As Long
Private Declare Function GetEnvironmentVariable Lib "kernel32" Alias "GetEnvironmentVariableA" _
 (ByVal lpName As String, ByVal lpBuffer As String, ByVal nSize As Long) As Long

Public Function GetCommonProgramFilesX86Path() As String
  Dim sf As New CSystemFolders
  GetCommonProgramFilesX86Path = sf.Path(CSIDL_PROGRAM_FILES_COMMONX86)
End Function

Public Sub Fix_x64_Environment()
  If Is64bit Then
    Dim buf As String * 256
    Dim varValue As String
    Dim length As Long

    ' Get "CommonProgramFiles(x86)" Environment Variable.
    length = GetEnvironmentVariable("CommonProgramFiles(x86)", buf, Len(buf))
    varValue = Left$(buf, length)
    If Len(varValue) = 0 Then
      ' Set "CommonProgramFiles(x86)" Environment Variable.
      SetEnvironmentVariable "CommonProgramFiles(x86)", GetCommonProgramFilesX86Path
    End If
  End If
End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы