powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
8 сообщений из 8, страница 1 из 1
Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
    #38099076
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну т.е. есть 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.
Public Sub DataBaseConnect()
  If Len(Dir(path_AppData & "\mybaza.mdb")) = 0 Then
    DataBaseOK = False
    Exit Sub
  Else
    DataBaseOK = True
  End If
  Set my_JRO = CreateObject("JRO.JetEngine")
  Set adoConn = New ADODB.Connection 'CreateObject("ADODB.Connection")
  adoConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
   path_AppData & "\mybaza.mdb;Mode=Share Deny None;Persist Security Info=False;Jet OLEDB:Database Password=mypassword"
End Sub


Все работает на отлично на любой системе, т.е. например если кинуть графический файл на иконку 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-битные драйвера БД, кот. в системе естественно установлены). Может можно ей это как-то объяснить в явном виде?
...
Рейтинг: 0 / 0
Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
    #38099109
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если другую строку соединения попробовать?
...
Рейтинг: 0 / 0
Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
    #38099372
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Так вылетает еще до "строки соединения".
Т.е. либо на
Код: vbnet
1.
  Set my_JRO = CreateObject("JRO.JetEngine")


либо если ее (про JRO) убрать, то на
Код: vbnet
1.
  Set adoConn = New ADODB.Connection 'CreateObject("ADODB.Connection")


т.е. до подключения дело не доходит.
Тут в чем-то другом проблема.
...
Рейтинг: 0 / 0
Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
    #38099560
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, пока пошел по этому пути.
Дмитрий77Если только не отказаться от прямого контакта с БД proga.exe.
По идее proga.exe может кидаться WM_COPYDATA с основным приложением, запущенным классическим методом и кот. не имеет таких проблем в общении с БД.
Т.е. если основное приложение запущено, то оно и общается с БД.
Если основное приложение НЕ запущено, то proga.exe выводит MsgBox, что не запущено и удаляет "новоотпечатанный" файл. Не совсем то что хотелось, но как бороться не знаю.
...
Рейтинг: 0 / 0
Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
    #38410953
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий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.
  Set my_JRO = CreateObject("JRO.JetEngine")
  Set adoConn = New ADODB.Connection 'CreateObject("ADODB.Connection")
  adoConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _


Если программа запустившая мою соизволила сделать вот этот подарок:
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 уже исправили, но хотелось бы без подобных подарков.
...
Рейтинг: 0 / 0
Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
    #38410955
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
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



Т.е. исправить баг OS + баг драйвера принтера все-таки можно.
ХЗ, может кому пригодится. А то постоянно какие-то вопли о проблемах с БД на x64 и рекомендациями ставить непонятные драйвера от 2015-х оффисов.
...
Рейтинг: 0 / 0
Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
    #38411313
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только я вот думаю.
Насколько актуальна проблема и насколько и как она может вылезти в других местах.
Или взять за правило делать этот фикс для любой проги кот. коннектится к БД через Microsoft.Jet.OLEDB...?
В принципе фикс то каши много не просит.
Никогда ж не знаешь из под какого скрипта или другой проги твою прогу запустят. Если это напр. Command Line Tool.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
    #38819324
fingoldo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обалдеть. Чёртов мелкософт.
Дмитрий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.
Стало ясно, что переменные среды каким-то образом перестают работать.
Ваш подход реши проблему!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера".
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]