Непонятки при доступе к объектам БД при запуске приложения 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-битные драйвера БД, кот. в системе естественно установлены). Может можно ей это как-то объяснить в явном виде?
Что она делает:
При запуске с параметром
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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д