Здравствуйте, G0ga, Вы писали:
G>В общем это мои догадки. Есть форма на ней контрол. К контролу через WinAPI прикрепляется окно другого приложения. Все работает замечательно. Но вот необходимо закрыть окно. Последовательно вызываются методы Dispose формы затем контрола. В реализации этого метода (для контрола) указываем открепить окно другого приложения, но увы кто-то его уже утилизировал (а мне очень нужно его оставить). Как правильно поступить в данной ситуации? Если это "сборщик мусора", то можно ему "сказать" — "низззззя". Контрол подписан на событие OnQuit приложения. Увы пусто .
Здравствуйте, G0ga, Вы писали:
G>Здравствуйте, _gargon, Вы писали:
_>>Честно говоря мало, что понял, но что я понял: _>>В твоем приложении отображается окно (не главное), под которое ты создаеш вордовский документ и отображаеш его где-то в своем окне. _>>После закрытия твоего окна (не главного), в виде вызова метода Dispose, ты ни как не можеш заюзать вордовский ком-объект, _>>т.к. он какогото х кем то освободился? _>>Я правильно понимаю ?
G>В целом правильно, только вордовский документ отображается на части окна, а точнее на UserControl-е.
Можно попробовать такое решение:
Создается UserControl, который обварачивает вордовское окно. Перегружается Load событие созданного UserControl'a, в котором вытягивается родительская форма (свойство TopLevelControl). К родительской форме добавляется обработчик FormClosed в котором происходит отсоединение вордовского документа.
Решение далеко не супер, плюс имеет ограничение — родительская форма дожна быть закрыта при помощи пользователя или вызова метода Close() для обычного окна (для диалога должно работать нормально).
А лучше ваще отказаться от такого, извини, "извращеного" использования ворда.
В общем это мои догадки. Есть форма на ней контрол. К контролу через WinAPI прикрепляется окно другого приложения. Все работает замечательно. Но вот необходимо закрыть окно. Последовательно вызываются методы Dispose формы затем контрола. В реализации этого метода (для контрола) указываем открепить окно другого приложения, но увы кто-то его уже утилизировал (а мне очень нужно его оставить). Как правильно поступить в данной ситуации? Если это "сборщик мусора", то можно ему "сказать" — "низззззя". Контрол подписан на событие OnQuit приложения. Увы пусто .
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, G0ga, Вы писали:
G>>В общем это мои догадки. Есть форма на ней контрол. К контролу через WinAPI прикрепляется окно другого приложения. Все работает замечательно. Но вот необходимо закрыть окно. Последовательно вызываются методы Dispose формы затем контрола. В реализации этого метода (для контрола) указываем открепить окно другого приложения, но увы кто-то его уже утилизировал (а мне очень нужно его оставить). Как правильно поступить в данной ситуации? Если это "сборщик мусора", то можно ему "сказать" — "низззззя". Контрол подписан на событие OnQuit приложения. Увы пусто .
M>Благородные Доны, кто-нибудь понял автора?
Да, он зовёт Dispose в обратном порядке — от этого и проблемы.
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, G0ga, Вы писали:
G>>В общем это мои догадки. Есть форма на ней контрол. К контролу через WinAPI прикрепляется окно другого приложения. Все работает замечательно. Но вот необходимо закрыть окно. Последовательно вызываются методы Dispose формы затем контрола. В реализации этого метода (для контрола) указываем открепить окно другого приложения, но увы кто-то его уже утилизировал (а мне очень нужно его оставить). Как правильно поступить в данной ситуации? Если это "сборщик мусора", то можно ему "сказать" — "низззззя". Контрол подписан на событие OnQuit приложения. Увы пусто .
M>Благородные Доны, кто-нибудь понял автора?
Автор просит заимплементить пропертю "низззззя" в GС object.
Было бы неплохо добавить еще 2 проперти "хочу" и "тупо хочу"
Здравствуйте, EvilChild, Вы писали:
EC>Здравствуйте, meowth, Вы писали:
M>>Здравствуйте, G0ga, Вы писали:
G>>>В общем это мои догадки. Есть форма на ней контрол. К контролу через WinAPI прикрепляется окно другого приложения. Все работает замечательно. Но вот необходимо закрыть окно. Последовательно вызываются методы Dispose формы затем контрола. В реализации этого метода (для контрола) указываем открепить окно другого приложения, но увы кто-то его уже утилизировал (а мне очень нужно его оставить). Как правильно поступить в данной ситуации? Если это "сборщик мусора", то можно ему "сказать" — "низззззя". Контрол подписан на событие OnQuit приложения. Увы пусто .
M>>Благородные Доны, кто-нибудь понял автора?
EC>Да, он зовёт Dispose в обратном порядке — от этого и проблемы.
А тогда встречный вопрос: как определить разрушен COM объект или жив. Просто писать в программе "провоцирующий" код как-то неправильно.
Здравствуйте, Какая разница, Вы писали:
КР>Здравствуйте, meowth, Вы писали:
M>>Здравствуйте, G0ga, Вы писали:
G>>>В общем это мои догадки. Есть форма на ней контрол. К контролу через WinAPI прикрепляется окно другого приложения. Все работает замечательно. Но вот необходимо закрыть окно. Последовательно вызываются методы Dispose формы затем контрола. В реализации этого метода (для контрола) указываем открепить окно другого приложения, но увы кто-то его уже утилизировал (а мне очень нужно его оставить). Как правильно поступить в данной ситуации? Если это "сборщик мусора", то можно ему "сказать" — "низззззя". Контрол подписан на событие OnQuit приложения. Увы пусто .
M>>Благородные Доны, кто-нибудь понял автора?
КР>Автор просит заимплементить пропертю "низззззя" в GС object. КР>Было бы неплохо добавить еще 2 проперти "хочу" и "тупо хочу"
А кто говорит про "заимплементить пропертю"? Это ваше ... воображение (понимание)
Здравствуйте, G0ga, Вы писали:
G>В общем это мои догадки. Есть форма на ней контрол. К контролу через WinAPI прикрепляется окно другого приложения. Все работает замечательно. Но вот необходимо закрыть окно. Последовательно вызываются методы Dispose формы затем контрола. В реализации этого метода (для контрола) указываем открепить окно другого приложения, но увы кто-то его уже утилизировал (а мне очень нужно его оставить). Как правильно поступить в данной ситуации? Если это "сборщик мусора", то можно ему "сказать" — "низззззя". Контрол подписан на событие OnQuit приложения. Увы пусто .
Мне кажется, что окно др. прил. нужно открепить до реального закрытия окна (т.е. до вызова Dispose управляемого окна)
Здравствуйте, _gargon, Вы писали:
_>Здравствуйте, G0ga, Вы писали:
G>>В общем это мои догадки. Есть форма на ней контрол. К контролу через WinAPI прикрепляется окно другого приложения. Все работает замечательно. Но вот необходимо закрыть окно. Последовательно вызываются методы Dispose формы затем контрола. В реализации этого метода (для контрола) указываем открепить окно другого приложения, но увы кто-то его уже утилизировал (а мне очень нужно его оставить). Как правильно поступить в данной ситуации? Если это "сборщик мусора", то можно ему "сказать" — "низззззя". Контрол подписан на событие OnQuit приложения. Увы пусто . _>Мне кажется, что окно др. прил. нужно открепить до реального закрытия окна (т.е. до вызова Dispose управляемого окна)
Это конечно правильно, но это контрол который используется в нескольких местах. И такой код надо писать в каждой форме, где используется контрол.
Здравствуйте, _gargon, Вы писали:
_>Здравствуйте, G0ga, Вы писали:
G>>В общем это мои догадки. Есть форма на ней контрол. К контролу через WinAPI прикрепляется окно другого приложения. Все работает замечательно. Но вот необходимо закрыть окно. Последовательно вызываются методы Dispose формы затем контрола. В реализации этого метода (для контрола) указываем открепить окно другого приложения, но увы кто-то его уже утилизировал (а мне очень нужно его оставить). Как правильно поступить в данной ситуации? Если это "сборщик мусора", то можно ему "сказать" — "низззззя". Контрол подписан на событие OnQuit приложения. Увы пусто . _>Мне кажется, что окно др. прил. нужно открепить до реального закрытия окна (т.е. до вызова Dispose управляемого окна)
Например:
public class ManagedForm : Form {
...
private void DetachChildControls() { ... }
protected override void OnFormClosing(FormClosingEventArgs e) {
base.OnFormClosing(e);
if (!e.Cancel) {
DetachChildControls();
}
}
...
}
Здравствуйте, G0ga, Вы писали:
G>Здравствуйте, _gargon, Вы писали:
_>>Здравствуйте, G0ga, Вы писали:
G>>>В общем это мои догадки. Есть форма на ней контрол. К контролу через WinAPI прикрепляется окно другого приложения. Все работает замечательно. Но вот необходимо закрыть окно. Последовательно вызываются методы Dispose формы затем контрола. В реализации этого метода (для контрола) указываем открепить окно другого приложения, но увы кто-то его уже утилизировал.
В каком смысле утилизировал? Вызвал CloseWindow(HWDN) для присоединенного внешнего окна или ссылка на обертку окна равна null?
G>Это конечно правильно, но это контрол который используется в нескольких местах. И такой код надо писать в каждой форме, где используется контрол.
Здравствуйте, _gargon, Вы писали:
_>Здравствуйте, G0ga, Вы писали:
G>>Здравствуйте, _gargon, Вы писали:
_>>>Здравствуйте, G0ga, Вы писали:
G>>>>В общем это мои догадки. Есть форма на ней контрол. К контролу через WinAPI прикрепляется окно другого приложения. Все работает замечательно. Но вот необходимо закрыть окно. Последовательно вызываются методы Dispose формы затем контрола. В реализации этого метода (для контрола) указываем открепить окно другого приложения, но увы кто-то его уже утилизировал. _>В каком смысле утилизировал? Вызвал CloseWindow(HWDN) для присоединенного внешнего окна или ссылка на обертку окна равна null?
G>>Это конечно правильно, но это контрол который используется в нескольких местах. И такой код надо писать в каждой форме, где используется контрол.
Нет конечно и ссылка неравна NULL. Просто обращение к любому свойству окна вызывает System.Runtime.InteropServices.COMException.
Здравствуйте, G0ga, Вы писали:
G>Нет конечно и ссылка неравна NULL. Просто обращение к любому свойству окна вызывает System.Runtime.InteropServices.COMException.
Можеш привести код присоединения нативного окна?
Здравствуйте, _gargon, Вы писали:
_>Здравствуйте, G0ga, Вы писали:
G>>Нет конечно и ссылка неравна NULL. Просто обращение к любому свойству окна вызывает System.Runtime.InteropServices.COMException. _>Можеш привести код присоединения нативного окна?
public class ExternalApplication
{
#region"API usage declarations"
[DllImport("user32.dll")]
public static extern int FindWindow(string strclassName, string strWindowName);
[DllImport("user32.dll")]
public static extern int SetParent(int hWndChild, int hWndNewParent);
[DllImport("user32.dll")]
public static extern int GetParent(int hWndChild);
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern bool SetWindowPos(
int hWnd, // handle to windowint hWndInsertAfter, // placement-order handleint X, // horizontal positionint Y, // vertical positionint cx, // widthint cy, // heightuint uFlags // window-positioning options
);
[DllImport("user32.dll", EntryPoint = "MoveWindow")]
public static extern bool MoveWindow(
int hWnd,
int X,
int Y,
int nWidth,
int nHeight,
bool bRepaint
);
[DllImport("user32.dll", EntryPoint = "ShowWindow")]
public static extern Int32 ShowWindow(
Int32 hWnd,
Int32 nCmdShow
);
public const int MF_BYPOSITION = 0x400;
public const int MF_REMOVE = 0x1000;
public const Int32 SW_HIDE = 0;
public const Int32 SW_RESTORE = 9;
public const Int32 SWP_DRAWFRAME = 0x20;
public const Int32 SWP_NOMOVE = 0x2;
public const Int32 SWP_NOSIZE = 0x1;
public const Int32 SWP_NOZORDER = 0x4;
#endregion
public static int wordWnd = 0;
internal static Word.ApplicationClass _WordApplication = null;
public static Word.ApplicationClass WordApplication
{
get
{
if (ExternalApplication._WordApplication == null)
{
ExternalApplication._WordApplication = new Word.ApplicationClass();
if (wordWnd == 0) wordWnd = FindWindow("Opusapp", null);
ExternalApplication.SetParent(ExternalApplication.wordWnd, Thread.CurrentThread.ManagedThreadId);
_WordApplication.ApplicationEvents4_Event_Quit += new Microsoft.Office.Interop.Word.ApplicationEvents4_QuitEventHandler(ExternalApplication.OnQuit);
}
return ExternalApplication._WordApplication;
}
}
Здравствуйте, G0ga, Вы писали:
G>Здравствуйте, _gargon, Вы писали:
_>>Здравствуйте, G0ga, Вы писали:
G>>>Нет конечно и ссылка неравна NULL. Просто обращение к любому свойству окна вызывает System.Runtime.InteropServices.COMException. _>>Можеш привести код присоединения нативного окна?
G>
G>public class ExternalApplication
G>{
G>#region"API usage declarations"
G>[DllImport("user32.dll")]
G>public static extern int FindWindow(string strclassName, string strWindowName);
G>[DllImport("user32.dll")]
G>public static extern int SetParent(int hWndChild, int hWndNewParent);
G>[DllImport("user32.dll")]
G>public static extern int GetParent(int hWndChild);
G>[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
G>public static extern bool SetWindowPos(
G> int hWnd, // handle to window
G> int hWndInsertAfter, // placement-order handle
G> int X, // horizontal position
G> int Y, // vertical position
G> int cx, // width
G> int cy, // height
G> uint uFlags // window-positioning options
G>);
G>[DllImport("user32.dll", EntryPoint = "MoveWindow")]
G>public static extern bool MoveWindow(
G> int hWnd,
G> int X,
G> int Y,
G> int nWidth,
G> int nHeight,
G> bool bRepaint
G>);
G>[DllImport("user32.dll", EntryPoint = "ShowWindow")]
G>public static extern Int32 ShowWindow(
G> Int32 hWnd,
G> Int32 nCmdShow
G>);
G>public const int MF_BYPOSITION = 0x400;
G>public const int MF_REMOVE = 0x1000;
G>public const Int32 SW_HIDE = 0;
G>public const Int32 SW_RESTORE = 9;
G>public const Int32 SWP_DRAWFRAME = 0x20;
G>public const Int32 SWP_NOMOVE = 0x2;
G>public const Int32 SWP_NOSIZE = 0x1;
G>public const Int32 SWP_NOZORDER = 0x4;
G>#endregion
G>public static int wordWnd = 0;
G>internal static Word.ApplicationClass _WordApplication = null;
G>public static Word.ApplicationClass WordApplication
G>{
G> get
G> {
G> if (ExternalApplication._WordApplication == null)
G> {
G> ExternalApplication._WordApplication = new Word.ApplicationClass();
G> if (wordWnd == 0) wordWnd = FindWindow("Opusapp", null);
G> ExternalApplication.SetParent(ExternalApplication.wordWnd, Thread.CurrentThread.ManagedThreadId);
G> _WordApplication.ApplicationEvents4_Event_Quit += new Microsoft.Office.Interop.Word.ApplicationEvents4_QuitEventHandler(ExternalApplication.OnQuit);
G> }
G> return ExternalApplication._WordApplication;
G> }
G>}
G>
Честно говоря мало, что понял, но что я понял:
В твоем приложении отображается окно (не главное), под которое ты создаеш вордовский документ и отображаеш его где-то в своем окне.
После закрытия твоего окна (не главного), в виде вызова метода Dispose, ты ни как не можеш заюзать вордовский ком-объект,
т.к. он какогото х кем то освободился?
Я правильно понимаю ?
Здравствуйте, _gargon, Вы писали:
_>Честно говоря мало, что понял, но что я понял: _>В твоем приложении отображается окно (не главное), под которое ты создаеш вордовский документ и отображаеш его где-то в своем окне. _>После закрытия твоего окна (не главного), в виде вызова метода Dispose, ты ни как не можеш заюзать вордовский ком-объект, _>т.к. он какогото х кем то освободился? _>Я правильно понимаю ?
В целом правильно, только вордовский документ отображается на части окна, а точнее на UserControl-е.
Здравствуйте, _gargon, Вы писали:
_>Здравствуйте, G0ga, Вы писали:
G>>Здравствуйте, _gargon, Вы писали:
_>>>Честно говоря мало, что понял, но что я понял: _>>>В твоем приложении отображается окно (не главное), под которое ты создаеш вордовский документ и отображаеш его где-то в своем окне. _>>>После закрытия твоего окна (не главного), в виде вызова метода Dispose, ты ни как не можеш заюзать вордовский ком-объект, _>>>т.к. он какогото х кем то освободился? _>>>Я правильно понимаю ?
G>>В целом правильно, только вордовский документ отображается на части окна, а точнее на UserControl-е. _>Можно попробовать такое решение: _>Создается UserControl, который обварачивает вордовское окно. Перегружается Load событие созданного UserControl'a, в котором вытягивается родительская форма (свойство TopLevelControl). К родительской форме добавляется обработчик FormClosed в котором происходит отсоединение вордовского документа. _>Решение далеко не супер, плюс имеет ограничение — родительская форма дожна быть закрыта при помощи пользователя или вызова метода Close() для обычного окна (для диалога должно работать нормально). _>А лучше ваще отказаться от такого, извини, "извращеного" использования ворда.
Здравствуйте, _gargon, Вы писали:
_>Здравствуйте, G0ga, Вы писали: _>Можно попробовать такое решение: _>Создается UserControl, который обварачивает вордовское окно. Перегружается Load событие созданного UserControl'a, в котором вытягивается родительская форма (свойство TopLevelControl). К родительской форме добавляется обработчик FormClosed в котором происходит отсоединение вордовского документа. _>Решение далеко не супер, плюс имеет ограничение — родительская форма дожна быть закрыта при помощи пользователя или вызова метода Close() для обычного окна (для диалога должно работать нормально).
ИМХО можно проще. Автор исходного постинга знаком с Win32, поэтому должен меня понять.
Устраиваем сабклассинг вордовского окна (SetWindowLongPtr) примерно здесь
Теперь все сообщения идут через сабклассирующую функцию. На FormClosed формы посылаем этому вордовскому окну (SendMessage) некое юзеровское сообщение, в ответ на которое он себе прописывает парентом некое иное окно.
Единственно, что я не знаю — как эту сабклассирующую функцию написать на C#. На чистом С она пишется за 5 минут.
Здравствуйте, G0ga, Вы писали:
G>А тогда встречный вопрос: как определить разрушен COM объект или жив. Просто писать в программе "провоцирующий" код как-то неправильно.
у каждого ком объекта есть счетчик подписчиков. если он равен 0, значит объект уже разрушен.
Здравствуйте, игппук, Вы писали:
И>Здравствуйте, G0ga, Вы писали:
G>>А тогда встречный вопрос: как определить разрушен COM объект или жив. Просто писать в программе "провоцирующий" код как-то неправильно.
И>у каждого ком объекта есть счетчик подписчиков. если он равен 0, значит объект уже разрушен.
А если этот объект определён как статический. Он следовательно один единственный. И закрытие формы это делает так, что глазом моргнуть не успеешь.
И>>у каждого ком объекта есть счетчик подписчиков. если он равен 0, значит объект уже разрушен.
G>А если этот объект определён как статический. Он следовательно один единственный. И закрытие формы это делает так, что глазом моргнуть не успеешь.
ни разу не встречал статического ком-объекта в одном единственном экземпляре. есть примеры?