|
Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
|
|||
---|---|---|---|
#18+
Ну т.е. есть proga.exe -моя (VB6). Что она делает: При запуске с параметром proga.exe some_path/the_file.tif 1) отображает the_file.tif 2) позволяет напр. удалить the_file.tif, либо вносит данные о пути к этому файлу и какие-то комментарии об нем в БД. При запуске прога соотв. устанавливает связь с объектами БД. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Все работает на отлично на любой системе, т.е. например если кинуть графический файл на иконку 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-битные драйвера БД, кот. в системе естественно установлены). Может можно ей это как-то объяснить в явном виде? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2013, 05:43 |
|
Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
|
|||
---|---|---|---|
#18+
А если другую строку соединения попробовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2013, 10:34 |
|
Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
|
|||
---|---|---|---|
#18+
Antonariy, Так вылетает еще до "строки соединения". Т.е. либо на Код: vbnet 1.
либо если ее (про JRO) убрать, то на Код: vbnet 1.
т.е. до подключения дело не доходит. Тут в чем-то другом проблема. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2013, 15:44 |
|
Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
|
|||
---|---|---|---|
#18+
Ну, пока пошел по этому пути. Дмитрий77Если только не отказаться от прямого контакта с БД proga.exe. По идее proga.exe может кидаться WM_COPYDATA с основным приложением, запущенным классическим методом и кот. не имеет таких проблем в общении с БД. Т.е. если основное приложение запущено, то оно и общается с БД. Если основное приложение НЕ запущено, то proga.exe выводит MsgBox, что не запущено и удаляет "новоотпечатанный" файл. Не совсем то что хотелось, но как бороться не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2013, 20:02 |
|
Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
|
|||
---|---|---|---|
#18+
Дмитрий77Так вот, я на Vista x64 столкнулся со следующей проблемой... Будучи запущенной из-под принтера, proga.exe ругается и на my_JRO , и на adoConn (если даже my_JRO убрать) - неважно позднее связывание или раннее. Пишет: Run-time error -2147024770 (8007007e) Automation error The specified module could not be found. Т.е. запускаем прогу ручками - есть коннект к БД. Прогу запускает драйвер принтера - нет коннекта к БД. Принтер запускает прогу под текущим пользователем, т.е. "правовой" разницы с ручным запуском не вижу... Ответ-то я нашел: http://www.symantec.com/business/support/index?page=content&pmv=print&impressions=&viewlocale=&id=TECH173832 ПРИЧИНАWhen exporting, RMS needs and looks for oledb32.dll, by default this is located in: C:\Program Files (x86)\Common Files\System\Ole DB\. However the location could be different from the default and when RMS searches for the dll it uses the system variable %CommonProgramFiles(x86)% to find this location. There is a known issue in Windows Vista X64 and Windows 2008 X64 that when the CreateEnvironmentBlock function is called without inheriting environment variables from the current process, the returned environment block is missing the following environment variables: CommonProgramFiles(x86), CommonProgramW6432, ProgramFiles(x86), ProgramW6432. This causes RMS to fail to find oledb32.dll and the export fails. И как раз Vista x64. И естественно у меня не C:\Program Files (x86) а H:\Program Files (x86) (на Win 7 x64 проблема отсутствует) Решение как бы есть: РЕШЕНИЕCreate a system environment variable "CommonProgramFiles(x86)" and set its value to the folder for common program files (32bit). This folder can be found out by going to Start > Run > "%CommonProgramFiles(x86)%" . Generally this folder is located at "C:\Program Files (x86)\Common Files". И, ДА, это решение помогает. Но это "ручками", причем вмешательство в настройки ОС. Я тупо смотрю на ф-цию CreateEnvironmentBlock Причем я понимаю, что если где и напортачено, то в драйвере принтера, на что я не в силах влиять - скомпилированный закрытый код. Т. е. вопрос: Что я могу (и могу ли) добавить в КОД СВОЕЙ ПРОГРАММЫ перед строчками Код: vbnet 1. 2. 3.
Если программа запустившая мою соизволила сделать вот этот подарок: without inheriting environment variables from the current process, the returned environment block is missing the following environment variables: CommonProgramFiles(x86), Как мне дозаставить свою прогу видеть CommonProgramFiles(x86) ? P.S. Мне это сейчас нужно. Когда в январе задавал вопрос, я извернулся через SendMessage (COPYDATA) - запрос-ответ "серверу", а "сервер" копается в БД. А сейчас "сервер" -As Windows Service, и соотв. SendMessage от юзер-аккаунта в System не достучится, нужен прямой доступ к БД. Не, я понимаю, что в XP проблемы нет, а на Win7 уже исправили, но хотелось бы без подобных подарков. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2013, 05:30 |
|
Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
|
|||
---|---|---|---|
#18+
Environment Variables GetEnvironmentVariable function Retrieves the contents of the specified variable from the environment block of the calling process. SetEnvironmentVariable function Sets the contents of the specified environment variable for the current process . Суть в том что при описанном вызове моей проги GetEnvironmentVariable отдает пустую "CommonProgramFiles(x86)". И ее надо установить через SetEnvironmentVariable. А взять имя папки можно независимо через SHGetFolderPath function CSIDL_PROGRAM_FILES_COMMONX86 FOLDERID_ProgramFilesCommonX86 Я пользуюсь готовым классом: Karl E. Peterson's Classic VB Code: SysFolders Рабочая заплатка такова: Код: vbnet 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.
Т.е. исправить баг OS + баг драйвера принтера все-таки можно. ХЗ, может кому пригодится. А то постоянно какие-то вопли о проблемах с БД на x64 и рекомендациями ставить непонятные драйвера от 2015-х оффисов. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2013, 07:11 |
|
Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
|
|||
---|---|---|---|
#18+
Только я вот думаю. Насколько актуальна проблема и насколько и как она может вылезти в других местах. Или взять за правило делать этот фикс для любой проги кот. коннектится к БД через Microsoft.Jet.OLEDB...? В принципе фикс то каши много не просит. Никогда ж не знаешь из под какого скрипта или другой проги твою прогу запустят. Если это напр. Command Line Tool. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 02:32 |
|
Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
|
|||
---|---|---|---|
#18+
Обалдеть. Чёртов мелкософт. Дмитрий77, спасибо, что указали решение к моей проблеме. В Visual Basic 6 Sp6 на Windows x64 2008 Server R2 SP1 возникала время от времени следующая проблема - при вызове метода Open объекта ADODB.Connection выдавалась ошибка Method 'Open' of object '_Connection' failed. После перезагрузки проблема исчезала - до следующего раза. Никак не мог выяснить причину. У множества людей такая проблема, судя по данным гугла. И множество индийсиих "экспертов" на сайтах Microsoft советовали там всякую срань, никто не дал даже близкого к правильному ответа. В ProcessMonitor заметил, что система не находит файл oledb32.dll, пытаясь найти его в диковинных местах тапа C:\Windows\SysWOW64\%CommonProgramFiles(x86)%\System\Ole DB\oledb32.dll. Стало ясно, что переменные среды каким-то образом перестают работать. Ваш подход реши проблему! ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2014, 12:14 |
|
|
start [/forum/topic.php?fid=60&msg=38411313&tid=2156111]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 140ms |
0 / 0 |