powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / GetObject() как отвязать объект от родительского приложения?
25 сообщений из 34, страница 1 из 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
25 сообщений из 34, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / GetObject() как отвязать объект от родительского приложения?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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