Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / GetObject() как отвязать объект от родительского приложения? / 25 сообщений из 34, страница 1 из 2
19.02.2004, 14:36
    #32415455
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetObject() как отвязать объект от родительского приложения?
создаю в приложении объект

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Теперь надо думать, что делать если в базу низя заранее добавить такой модуль с переменной и функцией. Тут варианты:
1. Добавить модуль и вписать туда строчки кода через COM (где-то на форуме был пример динамического создания и заполнения модуля) - достат. гемморойно, да еще и модуль будет висеть...
2. мда... думая я... нет у меня пока никакго второго варианта :)
...
Рейтинг: 0 / 0
19.02.2004, 15:54
    #32415655
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetObject() как отвязать объект от родительского приложения?
объявлять переменную мне не подходит - проекты будут разные
да и вроде кривовато..
...
Рейтинг: 0 / 0
19.02.2004, 16:04
    #32415687
RustamSaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetObject() как отвязать объект от родительского приложения?
2 АлексейК
а если тебе через реестр посмотреть где аксесс прописан?
...
Рейтинг: 0 / 0
19.02.2004, 16:10
    #32415704
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetObject() как отвязать объект от родительского приложения?
Тогда наверное действительно дучше делать через 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
19.02.2004, 16:10
    #32415710
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetObject() как отвязать объект от родительского приложения?
c путем к файлу аксесса разобрался


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


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

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

открывает в режиме только чтение....
...
Рейтинг: 0 / 0
19.02.2004, 16:11
    #32415712
ShellExecute
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetObject() как отвязать объект от родительского приложения?
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
19.02.2004, 16:12
    #32415716
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetObject() как отвязать объект от родительского приложения?
А зачем искать MSACCESS.EXE, Officce и так свои пути прописывает, достаточно написать MSACCESS.EXE и все, попробуйте...

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

у меня такого нет, пишу Shell ("MSACCESS.EXE c:\db2.mdb") и он нормально открывается.
...
Рейтинг: 0 / 0
19.02.2004, 16:20
    #32415742
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetObject() как отвязать объект от родительского приложения?
спасибо,
это я затупил, забыл его закрыть в предыдущей сессии
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / GetObject() как отвязать объект от родительского приложения? / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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