powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / GetObject() как отвязать объект от родительского приложения?
34 сообщений из 34, показаны все 2 страниц
GetObject() как отвязать объект от родительского приложения?
    #32415455
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
создаю в приложении объект

set OBJ = GetObject(path)
(ком -объект)

после завершения приложения, которое создало этот объект хочу чтобы он остался.

есть мысль что если указать в качестве окна - родителя рабочий стол то поможет ? хотя путаюсь в мыслях как происходит закрытие дочерних объектов
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415480
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут лучше проявить конкретику, потому как некоторые приложения например сами отвязываются если в окно запущенной программы вмешивается пользователь, так например у Excel происходит

Вообщем что за программа, какой у нее статус (может access с ней в режиме hide работает, а ты потом хочешь показать ее и оставить висеть) и т.д.
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415489
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
программа - приложение Access

я хочу чтоб он не убивался после того как будет закрыто вызвавшее его приложение
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415517
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, вот так значит

Я проводил опыты с Excel, вызывая его из Access. Там так: с ParentWindow ловить нечего, потому как в обоих случаев у Excel нет никакого ParentWindow. Наскоко я в курсе все решает COM технология, именно она глушит сама окно/программу, которая самма по себе то и не ведает что с ней будут творить - она себя полностью отдает COM интерфейсу.

Чтобы оставить висеть Excel, я сделал так - просто не стал делать Set xlApp=Nothing - и все. Ссылка не обновилась и COM не убил программу, так и висит, пока я ее вручную не убил. Главное не вешать так прогру в скрытом режиме, а то токо через менеджер задач придется убивать, хотя тоже не очень сложно :)

Думаю с Access также можно, поробуй..
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415539
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очепятка:

>>Set xlApp=Nothing - и все. Ссылка не обнУЛИлась и...

Кстати, это к разговору об автоматической очистке ...

Видно что с некоторыми COM объектами пока явно не обнулишь счетчик через Set xlApp=Nothing освобождение памяти происходить не будет, потому что сам компиллятор VBE не собирается делать это за нас.
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415546
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к сожалению
set ACCOBJ = nothing
в случае с аксессом
приводит к закрытию объекта
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415549
RustamSaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 АлексейК.
в оле используется счетчик ссылок на созданные объекты. при каждом присваивании увеличивает на 1 при освобождении уменьшает на 1. когда количество ссылок равно 0 то объект уничтожается. в данном случае можно либо не освобождать текущую ссылку на объект либо выполнить присваивание еще раз. SergeySV предложил на мой взгляд вполне приемлемый путь. как раз то что тебе нужно.
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415574
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в том то и дело что обнуляется...
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415584
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да АлексейК, я ж как раз обратное предлагал (наверное слишком сумборно) - не делать в своем коде Set ACCOBJ = Nothing

Просто ниже, я пошел филосовствовать по поводу того, что некоторые предлагают в своем коде не писать Set rst=Nothing, так как все равно автомат. чистильщик VBE очистит память если время жизни переменной вышло. вроде бы с Recordset не было замечано в этом случае утечек памяти, а вот с внешними COM-объектами - пжл, на лицо явная утечка памяти, токо если это не преднамерено (как в твоем случае).
По идее Recodset (ADO, DAO) это же тоже подключаемая библиотека, наверная таже технология COM используется, но эффекты разные. Видимо так задумано было специально, чтобы Com объекты типа программ Excel, Word, Access оставались висеть в памяти если нет явного Set ... = Nothing, ведь в реализации COM интерфейса помойму сам объект решает что ему делать и наверное он может и наплевать, на то что ему пришло указание, что в его услугах больше не нуждаются, а он раз такой и говорит - все фигня, хочу и вешу :-) - ИМХО мое предположение
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415588
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хмм, ща поглядим... с Excel прокатывало
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415599
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надыбал фишку, буду думать как ее применить:

если объект уже создан а я делаю
set OBJ = GetObject(path)
то объект назначается
и после
set OBJ = nothing

объект не уничтожается!!!!

правда не хочется cmdshell для предварительного создания использовать ...
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415601
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мдаам, действительно противный.

закрывается даже тогда, когда теряет ссылку. Set =nothing делал - висит, ну думаю обманул, Excel закрыл, Access тоже закрылся :(
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415607
ShellExecute
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
надо поиметь ссылку на созданный Аксесс.Аппликейшн из другого (не закрываемого) сеанса. Лучше всего - из того самого, который хочется оставит открытым (схватить себя за хвост). Я как-то че-то в этом роде смотрел, но плюнул и сделал через Shell (или ShellExecute). Что неудобно - могут быть у разных юзеров настроены разные пути (разные команды по умолчанию).
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415609
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, на =Nothing мне тоже удалось его прокатить, но как токо Excel закрываю, то Access грохается полюбому даже несмотря на то, что я там уже вручную какую-то базу открыл.

Правда я сейчас смотрю вариант с CreateObject, а не с GetObject
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415629
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Следуя совету ShellExecute мне удалось заставить висеть Access после закрытия Excel'я.

Для этого в базу Access добавил функцию:
Set a = GetObject(CurrentProject.FullName)

переменная "a" объявлена на уровне формы как public

Таким макаром мы сделали ссылку на самого себя и Access остался висеть - прикольно.

Ща еще пощупаю код, как можно попроще ;-)
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415637
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторсхватить себя за хвост
вот как бы это сделать...

сеейчас ищу в свойствах объекта access путь к каталогу офиса откуда он запущен ... вроде где - то было
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415653
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, уточняю:

переменную "a" надо объвлять на уровне модуля, потому как если она умрет (время жизни вышло), а Excel пока еще не закрыт и начинает закрывать, то естественно ссылка Access на самого себя пропадает и он успешно закрывается.

Теперь надо думать, что делать если в базу низя заранее добавить такой модуль с переменной и функцией. Тут варианты:
1. Добавить модуль и вписать туда строчки кода через COM (где-то на форуме был пример динамического создания и заполнения модуля) - достат. гемморойно, да еще и модуль будет висеть...
2. мда... думая я... нет у меня пока никакго второго варианта :)
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415655
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
объявлять переменную мне не подходит - проекты будут разные
да и вроде кривовато..
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415687
RustamSaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 АлексейК
а если тебе через реестр посмотреть где аксесс прописан?
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415704
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда наверное действительно дучше делать через Shell, как например и у Гетца (кое что от меня):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
pathToDb =  "c:\db1.mdb" 
strCmd= "MSACCESS.EXE "  & pathToDb &  "  /user... /pwd ..."  (user и pwd это если надо)
WaitForProcessToEnd(strCmd)
Set objAcc = GetObject(pathToDb)


Private Const INFINITE = &HFFFF

Private Declare Function WaitForSingleObject Lib  "kernel32"  (ByVal hHandle As Long, _
                ByVal dwMilliseconds As Long) As Long

Private Declare Function OpenProcess Lib  "kernel32"  (ByVal dwAccess As Long, _
                ByVal fInherit As Integer, ByVal hObject As Long) As Long

Public Sub WaitForProcessToEnd(cmdLine As String)
          'You can substitute a discrete time
          'value in milliseconds for INFINITE.
          Dim retVal As Long, pID As Long, pHandle _
                  As Long
          pID = Shell(cmdLine)
          pHandle = OpenProcess(&H100000, True, pID)
          retVal = WaitForSingleObject(pHandle, INFINITE)
  End Sub
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415710
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c путем к файлу аксесса разобрался


Accesspath = ACC.Application.SysCmd(acSysCmdAccessDir) & "msaccess.exe"


теперь новая засада
почему то

Call Shell(Accesspath & " " & Filepath, vbMaximizedFocus)

открывает в режиме только чтение....
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415712
ShellExecute
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. я про криэйт и говорил - фихфам там такой же.

2. офтоп авторЧтобы оставить висеть Excel, я сделал так - просто не стал делать Set xlApp=Nothing - и все гы! - а ты сделай так без придания видимости:
Код: plaintext
1.
2.
3.
4.
    Set xl = CreateObject( "excel.application" )
    Set WB = xl.Workbooks.Open(strPath)
'    xl.Visible = True
    Set WB = Nothing
    Set xl = Nothing

у меня после этого в списке процессов столько EXCEL , сколько раз запускалось. (в списке задач EXCEL-а правда нет). И сам файл ручками открывается только с "уведомлением" (пока не убьеш процессы в менеджере)

3. автор свойствах объекта access путь к каталогу офиса может посмотреть в регистри путь по имени (Access.Application.9)(вернее по имени - класс, а в классе путь)? Но, сдается, может быть установлено несколько екзешников (да я как-то и по сети с другой машины екзешник запускал - а тот уж точно в реестр локал машины не был прописан :0).
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415716
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем искать MSACCESS.EXE, Officce и так свои пути прописывает, достаточно написать MSACCESS.EXE и все, попробуйте...

А если Access умудрились так хитр поставить, что путей не будет, тогда выведи диалог OpenFile и пусть пользователь сам его ищет, вот.
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415728
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>открывает в режиме только чтение....

у меня такого нет, пишу Shell ("MSACCESS.EXE c:\db2.mdb") и он нормально открывается.
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415742
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо,
это я затупил, забыл его закрыть в предыдущей сессии
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32415746
ShellExecute
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у вас скорее всего настрока запуска по умолчанию "только чтение"

авторПараметры командной строки

Следующая таблица содержит список параметров командной строки Microsoft Access.

Параметр Результат
базаДанных Открытие файла указанной базы данных. При необходимости, укажите путь к этому файлу.
/Excl Открытие указанной базы данных с монопольным доступом. Чтобы открыть базу данных для общего доступа в многопользовательской среде, опустите данный параметр.
/Ro Открытие указанной базы данных с доступом только для чтения.
/User имяПользователя Запуск Microsoft Access с указанным именем пользователя.
/Pwd пароль Запуск Microsoft Access с указанным паролем.
/Profile конфигурация Запуск Microsoft Access с параметрами указанной конфигурации пользователя, вместо стандартных параметров реестра Windows, записанных при установке Microsoft Access. Данный параметр заменяет параметр /ini, использовавшийся в предыдущих версиях Microsoft Access для указания файла инициализации. Однако параметр /ini будет по-прежнему работать для пользовательских файлов .INI из предыдущих версий Microsoft Access.В комплекте Microsoft Access Developer’s Toolkit содержатся средства создания конфигурации пользователя и их описание. Для получения дополнительных сведений нажмите кнопку .
/Compact результирующийФайл Сжатие базы данных, указанной перед параметром /Compact и закрытие Microsoft Access. Если опустить имя результирующего файла базы данных после параметра /Compact, база данных после сжатия записывается в файл с тем же именем. Для сохранения сжатого файла под другим именем необходимо указать имя результирующего файла.
/Repair Восстановление указанной базы данных и закрытие Microsoft Access.
/Convert результирующийФайл Преобразование базы данных предыдущей версии в формат базы данных Microsoft Access 97 под новым именем и закрытие Microsoft Access. Исходная база данных задается перед параметром /Convert.
/X макрос Запуск Microsoft Access с одновременным запуском указанного макроса. Другой способ запуска макроса при открытии базы данных заключается в использовании макроса AutoExec.
/Cmd Задание в командной строке значения, возвращаемого функцией Command. Этот параметр должен быть последним параметром командной строки. Вместо параметра /Cmd допускается использование точки с запятой (;).Для получения дополнительных сведений о функции Command нажмите кнопку .
/Nostartup Запуск Microsoft Access без вывода стартового диалогового окна (второго диалогового окна, которое видит пользователь при запуске Microsoft Access).
/Wrkgrp
файлРабочейГруппы Запуск Microsoft Access с использованием указанного файла рабочей группы.

авторAccesspath = ACC.Application.SysCmd(acSysCmdAccessDir) & "msaccess.exe" - Сэнкс. Закоплю (обычно теряется). Находил неоднократно :0)

Вопросы на засыпку: сколько может быть установлено аксов? Какой из них найдется как "MSACCESS.EXE" ? :0)
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32417087
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
найдется тот который запустился по getobject() ))
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32417157
ShellExecute
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
откуда такая уверенность?

А если я делаю конкретно:
CreateObject("Access.Application.8")
т.к. у меня стоит еще Access.Application.9 ... Access.Application.ХХХ

так какой из них запустится ПРОСТО как "MSACCESS.EXE" ? (из Shell )

(не уверен, что любой запуск любого аксесса перепишет реестр нужным образом). а предложенный вариант {Accesspath = ACC.Application.SysCmd(acSysCmdAccessDir) & "msaccess.exe"} вернет, похоже, что нужно - путь именно к исполняемому в настоящий момент экзешнику. (Или я ошибаюсь?)
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32417246
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, все правильно: ACC.Application.SysCmd(acSysCmdAccessDir) & "msaccess.exe - это конечно более надежный способ.
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32417328
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
странно, но опытным путем выяснил, если подержаться руками за открытый програмно Access.Application (просто щелкнуть в его окно), то он не закрывается после закрытия родителя. после этого обнаружил, что после

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Public Function assa()
Dim res As Boolean
Dim sStamp, lStamp, nAcc As Access.Application
Dim sName As String, lName As String

        Set nAcc = CreateObject( "Access.Application.8 ")
        'Stop
        nAcc.OpenCurrentDatabase "C:\assa\ReCode.mdb"
       ' DoEvents
        'Stop
        Set nAcc = Nothing
        Application.Quit
        Exit Function
        '__________
End Function

, если в вызываемом приложении по умолчанию запускается форма, то оно висит (собирался делать nAcc.Screen.ActiveForm.SetFocus, но не понадобилось) вполне нормально после закрытия вызова. Сейчас попробую в 2000
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32417359
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так это наверное у тебя Acc97....?!

У него раньше была нестандартная реакция на Nothing после Create/Get Object , он любил висеть :)

С 2000 все поменялось.
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32417370
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там похуже:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Public Function assa()
Dim res As Boolean
Dim sStamp, lStamp, nAcc As Access.Application
Dim sName As String, lName As String

        Set nAcc = CreateObject( "Access.Application.9 ")
        'Stop
        nAcc.OpenCurrentDatabase "C:\assa\ReCode2k.mdb"
        nAcc.Visible = True
        'Stop
        Set nAcc = Nothing
        Application.Quit
        Exit Function
        '__________
End Function

И, главное, если потом просто закрыть стартовую формочку - эта падла (аппликейшен 9) захлопнется целиком, а вот если создать какой объектик - то вроде не станет .



ЗЫ В списке процессов с 97 все в порядке - просто если передать до закрытия в него фокус (просто перйти после Stop руками, то он не закрывается (а ведет себя как4 нормально руками созданный), в отличии от 2000, а в 2000 надо еще и поработать, чтобы он закрываться не начал (перестал). Вот что именно напрочь отобьет ему охоту к закрытию, я пока не выяснил, но покуда открыта стартовая форма, он точно не закрывается)
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32417379
guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, что если сделать так
Set nAcc = CreateObject("Access.Application.8")
nAcc.Visible = true
то для того чтобы оставить 97 на экране не достаточно просто кликнуть окно, а нужно открыть какой-нибудь диалог, например About или Open
...
Рейтинг: 0 / 0
GetObject() как отвязать объект от родительского приложения?
    #32417404
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2guest

действительно nAcc.Visible = True в 97 чуть меняет поведение окна. В случае открытия в вызванном приложении формы (в параметрах запуска), оно все таки остается открытым, но при закрытии окна б.д. (видимо - после закрытия последнего подчиненного окна объекта Screen) станет закрываться (без nAcc.Visible = True - не закрывается и после закрытия окна б.д).
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / GetObject() как отвязать объект от родительского приложения?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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