|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
подскажите : Как после создания документа ворд из FORMS ( OLE2.CREATE_OBJ('Word.Application') ) можно узнать ИД созданного Процесса ? (в самой форме) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2015, 21:13 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Al*GatoR, Для чего? а вообще св-ва получают через get_obj_property: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2015, 22:09 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Forms тут совсем не при чем. Вопрос чисто по MS Word. Но вопрос интересный... Если есть открытый документ - у него есть окно - у объекта Window можно получить hWnd ( свойство https://msdn.microsoft.com/en-us/library/office/jj231484.aspx ). В Windows API перейти от hWnd к HPROCESS точно должно быть возможно. Зачем Вам это нужно? Мне, обычно, HPROCESS нужен только для того, что бы дождаться завершения выполнения приложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 00:29 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Спасибо за ответы. Насчет "зачем" - после закрытия документа из формы ( OLE2.INVOKE(doc, 'Close', args); ) иногда документ не закрывается ( по разным причинам, иногда не понятным ), так вот когда это происходит хочу остановить этот процесс с помощью taskkill . Нужен именно PID . Word открывается всегда под заранее неизвестным пользователем (или с правами какого-то неизвестного пользователя), тут 17355242 описал что заставляет WORD так действовать. Хотел найти свой процесс по " названию окна ", но так как Word и форма находятся под разными пользователем, tasklist выдает " название окна " = "N/A" . mRdUKE , в свойствах документа OLE2.get_obj_property(..) не знаю как узнать ID процесса. Есть варианты? Leonid Kudryavtsev 123987 , подскажите как из FORMS получить hWnd или HPROCESS и потом прийти к PID ? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 03:45 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Al*GatoR, После Close + OLE2.RELEASE_OBJ(...) по каждому типу в обратном порядке объявления и OLE2.INVOKE(word_app,'Quit'); присутствует? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 07:12 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
1. Подтвержаю. Наиболее часто ( 99% ) проблема исключительно в некоректно написаном коде. Отсутствие вызовов RELEASE_OBJ для каких-то объектов. Соответственно объекты отмечены как занятые, приложение ( Word, Excel ) завершится не может. 2. Вроде и так понятно написал. Если есть объект MS Word Window, то у него можно получить HWND. https://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.window.hwnd.aspx Через HWND мы можем получить ID потока и процесса, который создал данное окно. https://msdn.microsoft.com/en-us/library/windows/desktop/ms633522(v=vs.85).aspx GetWindowThreadProcessId function Retrieves the identifier of the thread that created the specified window and, optionally, the identifier of the process that created the window. .... НО, если у Вас действительно чахорда с юзерами и правами, то ничего гарантировать нельзя. Я даже не понимаю, как такое отлаживать. ... тут 17355242 описал ... IMHO Кривость какую то сотворили и продолжаете творить ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 15:19 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Вроде tasklist процессы других пользователей тоже показывает. Т.ч. тоже проблем особых быть не должно (только не понятно, как "свой" Word искать). ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 16:05 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Насколько я могу судить, то код закрытия коректен, хотябы потому что проблемы возникают в 10% всех создаваемых документах. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Leonid Kudryavtsev , спасибо за вашу наводку, но " Window.Hwnd property " имеет синтаксис для С# и VB , а " GetWindowThreadProcessId function " для C++ . Как практически можно это использовать в FORMS 6 ? Leonid KudryavtsevIMHO Кривость какую то сотворили и продолжаете творить Если бы клиент согласился выполнять задачу из под вошедшего пользователя, то никаких вообще проблем ни воросов не возникло бы, а так нужно считаться с его требованиями. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 16:24 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevВроде tasklist процессы других пользователей тоже показывает. Т.ч. тоже проблем особых быть не должно (только не понятно, как "свой" Word искать). Если бы это было так, то тему можно было бы закрывать, т.к. если документы создаю я, то и имя этим документам тоже генерирую я, по имени окна можно было бы найти нужный процесс. А так TaskList показывает названия документов открытых только у текущего пользователя. к сожалению. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 16:29 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Al*GatoRНасколько я могу судить, то код закрытия коректен, хотябы потому что проблемы возникают в 10% всех создаваемых документах. Дело не только в коде закрытия. Где-то, какой-то объект забывают освободить через RELEASE_OBJ. Какой - ищется только глазками по коду. ВСЕ объекты полученные от OLE нужно освобождать. Al*GatoRспасибо за вашу наводку, но " Window.Hwnd property " имеет синтаксис для С# и VB , а " GetWindowThreadProcessId function " для C++ . Как практически можно это использовать в FORMS 6 ? Тут я не знаю, что Вам ответить: 1. OLE2.GET_OBJ_PROPERTY. В чем проблема? Я так понимаю, у Вас уже написано немало кода с OLE2 т.ч. проблемы быть не должно. 2. ORA_FFI package Al*GatoR...а так нужно считаться с его требованиями. Ничего не могу сказать, не знаю Вашу ситуацию. Но сама по себе конфигурация и проблемы крайне странные. Есть подозрение, что проблема не с кодом, а с постановкой задачи (ну или с архитектурой) ))) Al*GatoR...А так TaskList показывает названия документов открытых только у текущего пользователя. к сожалению. Ничего не могу сказать У Вас крайне специфическая конфигурация. Т.ч. нужно смотреть и экспериментировать на Вашей конфигурации. Визуально и по доке - вроде пользователь проблемой являться не должен. Как на самом деле в Вашей конфигурации - вряд ли кто сможет сказать, не видя ее. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 17:27 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Al*GatoRНасколько я могу судить, то код закрытия коректен, хотябы потому что проблемы возникают в 10% всех создаваемых документах. Возможно порядок команд играет роль, где-то указывают release_obj до "закрытия", где-то видел после.. дока по командам Leonid KudryavtsevВроде tasklist процессы других пользователей тоже показывает.судя по мане тоже TASKLIST /v /fi "username eq ..." и судя, по той же мане, даже на remote pc .. а может написать батник, закрывающий все процессы winword.exe и запускать его после всех команд, или, к примеру - не все процессы, а в статусе NOT RESPONDING или по другим параметрам отсеивать, cputime/memusage, max(pid) :) как-то так ? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 19:49 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
По всему коду где открывается обьект в конце процедуры ( и в excpetion ) стоят RELEASE_OBJ. Нет ниодной переменной обьекта которая остается не освобаждённой. вот результат TaskList сразу после создания документа: Image NamePIDSession NameSession#Mem UsageStatusUser NameCPU TimeWindow TitleWINWORD.EXE28376RDP-Tcp#29453`504 KUnknownSSTSC\U112340:00:03N/AWINWORD.EXE29288RDP-Tcp#262995`616 KUnknownSSTSC\M000050:00:14N/AWINWORD.EXE 14224 RDP-Tcp#6340`004 KUnknownSSTSC\U002240:00:07N/AWINWORD.EXE23072RDP-Tcp#6335`876 KUnknownSSTSC\U002240:00:02N/AWINWORD.EXE11128RDP-Tcp#6334`848 KUnknownSSTSC\U002240:00:01N/A PID:14224 - мой документ, знаю это лишь потому что отслеживаю результаты TaskList до и после создания документа. Но этот метод имеет погрешность в случаи когда какой-то пользователь откроет новый документ вместе со мной, тогда я неузнаю свой процесс. В этом случаи придется лишь надеется что мой процесс закроется без проблем... По " CPU Time " тоже что-то не понятно, это точно НЕ время которое процесс существует. По " Mem Usage " тоже скольско, т.к. размер колеблется по мере наполнения документа данными от 30 до 80 может и больше. Leonid KudryavtsevТут я не знаю, что Вам ответить: 1. OLE2.GET_OBJ_PROPERTY. В чем проблема? Я так понимаю, у Вас уже написано немало кода с OLE2 т.ч. проблемы быть не должно.Много искал на просторах всемирной поутины как называется тот параметр для OLE2.GET_OBJ_PROPERTY, который даст мне ожидаемый результат но никак, да и сам перепробовал этих параметров на угад от самых логичных до самых нелепых, но врезультате ничего не нашел, поэтому и пришел на форум. Leonid Kudryavtsev2. ORA_FFI packageПокопаюсь с этим еще денёк. Вот было бы радости, получив готовый код :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 20:38 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Al*GatoRпоутины как называется тот параметр для OLE2.GET_OBJ_PROPERTY, который даст мне ожидаемый результат но никак, да и сам перепробовал этих параметров на угад от самых логичных до самых нелепых, но врезультате ничего не нашел Такое чувство, что Вы OLE2 первый раз в жизни видите. Параметр ясно дело тот, который описан в доке - HWND. Al*GatoRПокопаюсь с этим еще денёк. Вот было бы радости, получив готовый код :) Что бы получился готовый код, нужно AFAIK: 1. Видеть код, который у Вас сейчас 2. Написать код 3. Отладить его. С учетом Вашей специфики, без доступа к Вашему окружению (DEV/TEST) малореально. Ну или затрачивать дохрина сил, на воспроизведения всего того, что Вы "наворотили" ))) Как-то так. Вообще, собственно искомый вопрос - все решается. Что уже хорошо ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 20:45 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevAl*GatoRпоутины как называется тот параметр для OLE2.GET_OBJ_PROPERTY, который даст мне ожидаемый результат но никак, да и сам перепробовал этих параметров на угад от самых логичных до самых нелепых, но врезультате ничего не нашел Такое чувство, что Вы OLE2 первый раз в жизни видите. Параметр ясно дело тот, который описан в доке - HWND. Свойство числовое, т.ч. понятное дело OLE2.GET_NUM_PROPERTY от объекта Window (его должно быть возможно из объекта Document или Application получить). ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 21:10 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev , ценю ваше участие в поиске решения задачи. результаты следующей комманды приводит к ошибке: Код: plsql 1. 2. 3. 4. 5. 6.
Так же перепробовал и для happlication и hdocument , так же для всех трёх объектов искал и get_ obj _property и get_ char _property, в результате - ошибка . Кроме того, еще попробовал получить и объект и число и строку свойства ' ActivePrinter ', в результате получил 3 разных значения но не упало на ошибке. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 22:19 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Al*GatoR, А PowerShell юзать не пробовали? > get-process winword | select-object * -last 1 __NounName : Process Name : WINWORD Handles : 242 VM : 252293120 WS : 31969280 PM : 19517440 NPM : 12680 Path : C:\Program Files\Microsoft Office\Office14\WINWORD.EXE Company : Microsoft Corporation CPU : 1,03125 FileVersion : 14.0.4762.1000 ProductVersion : 14.0.4762.1000 Description : Microsoft Word Product : Microsoft Office 2010 Id : 3680 PriorityClass : Normal HandleCount : 242 WorkingSet : 31969280 PagedMemorySize : 19517440 PrivateMemorySize : 19517440 VirtualMemorySize : 252293120 TotalProcessorTime : 00:00:01.0312500 BasePriority : 8 ExitCode : HasExited : False ExitTime : Handle : 784 MachineName : . MainWindowHandle : 1705674 MainWindowTitle : Документ1 - Microsoft Word MainModule : System.Diagnostics.ProcessModule (WINWORD.EXE) MaxWorkingSet : 1413120 MinWorkingSet : 204800 Modules : {System.Diagnostics.ProcessModule (WINWORD.EXE), System.Diagnostics.ProcessModule (ntdll.d ll), System.Diagnostics.ProcessModule (kernel32.dll), System.Diagnostics.ProcessModule (MS VCR90.dll)...} NonpagedSystemMemorySize : 12680 NonpagedSystemMemorySize64 : 12680 PagedMemorySize64 : 19517440 PagedSystemMemorySize : 222128 PagedSystemMemorySize64 : 222128 PeakPagedMemorySize : 25866240 PeakPagedMemorySize64 : 25866240 PeakWorkingSet : 38371328 PeakWorkingSet64 : 38371328 PeakVirtualMemorySize : 259362816 PeakVirtualMemorySize64 : 259362816 PriorityBoostEnabled : True PrivateMemorySize64 : 19517440 PrivilegedProcessorTime : 00:00:00.3593750 ProcessName : WINWORD ProcessorAffinity : 3 Responding : True SessionId : 0 StartInfo : System.Diagnostics.ProcessStartInfo StartTime : 28.07.2015 8:37:22 SynchronizingObject : Threads : {3076, 2168, 3780, 4044...} UserProcessorTime : 00:00:00.6718750 VirtualMemorySize64 : 252293120 EnableRaisingEvents : False StandardInput : StandardOutput : StandardError : WorkingSet64 : 31969280 Site : Container : ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2015, 07:44 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
mRdUKEА PowerShell юзать не пробовали? Нет. Спасибо, попробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2015, 16:35 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Похоже HWND появился только в Word 2013 ((( До этого советуют искать окна через FindWindow Но что будет при разных именах пользователя, не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2015, 21:39 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
mRdUKE , PowerShell тоже не видит название открытого документа Word у других пользователей, как tasklist так и get-process Leonid KudryavtsevПохоже HWND появился только в Word 2013 ((( До этого советуют искать окна через FindWindow Но что будет при разных именах пользователя, не знаю. По FindWindow тоже падает на ошибке при выполнении комманды: Код: plsql 1.
тоже самое пробовал и get_OBJ_ и get_CHAR_ и get_NUM_ - всё падает на ошибке. также добавлял два входящих параметра, но всё-равно - ошибка: Код: plsql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2015, 00:14 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Почитал инет. Проникся проблемой. 1. Собственно Subj до Word 2013 по простому никак не решается. MS уроды, для MS Excel соответствующие свойства добавили еще в 2002, в MS Word добавляют только что (и урезанно) ((( Получить доступ к окнам (GetWindowText Win API function) созданных другим пользователем не дает система безопасности. В Инет уверют, что это никак не обойти. Всегда можно создать свое приложение "прокладку" запускающееся под другим пользователем и уже оттуда создавать приложение. Для топик-стартера это явно сильно сложно. Ну и для данной задачи, это из пушки по воробьям 2. Зачем у топик стартера такая порнография с пользователями - я понять не могу. Т.ч., на мой взгляд, правильнее разобраться с порнографией с пользователями. Что бы и Word и приложение работало под одним пользователем. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2015, 15:53 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Al*GatoRПланировщиком заданий запускать форму с помощью bat файла, которая в свою очередь открывает Word по средством ole2, заполняет документ и сохраняет его. ... Word с помощью Код: plsql 1.
открывается под не постоянным пользователем и в результате иногда появляются проблемы с последующей работой. Т.е. в разное время ворд открыт под разными пользователями. Так же проникся ((( Разобраться явно можно. Но доки на данную тему достаточно сложны. Сходу никак док MS не нашел, а _современных_ книжек у меня нет. Раньше, одновременно работать под разными пользователями было банально нельзя. Т.ч. такой проблемы и не возникало. Сейчас, действительно, позволяют работать с OLE объектами запущенными под другим пользователм. Каким образом - мне не понятно. Возможно, что-то типа DCOM'а. Теоретически, на C можно попытаться самому запустить процесс MS Word и потом получить от него IDispatch (через AccessibleObjectFromWindow,WindowFromAccessibleObject ). Т.е. изобразить OLE2.CREATE_OBJ самому. Но это нужно использовать C И теоретически. По докам не все ясно. Не понятно насколько это прикручивается к OLE2 package (подозреваю, что Handle объекто банальная ссылка/адрес IDispatch). Так же не ясно с какой версии MS Office поддерживает MS Active Accessibility User Interface Services. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2015, 16:11 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Разумеется. есть третье решение: Написать макрос в Word'е, который спрашивает свой PID и возвращает его. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2015, 16:15 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevРазумеется. есть третье решение: Написать макрос в Word'е, который спрашивает свой PID и возвращает его. эта мысль меня тоже посещала, но такое решение будет не достаточным в том случаи когда WORD зависнет не выполнив этот макрос. Хотя так как альтернатив особо в ближайшее время не предвидится, может быть буду использовать этот вариант как страховочный когда не смогу определить PID который добавился во время создания документа с помощью tasklist. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 03:45 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Al*GatoR, м.б. на VBScript решение найдете.. "убить" все процессы winword.exe Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
покажет PID,CommandLine,CreationDate процесса winword.exe Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
т.е., - как вариант фильтровать в запросе по CreationDate , CommandLine - название документа Win32_Process class или "убивать" зависшие процессы How to Terminate Unwanted MS Office Processes ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 08:17 |
|
OLE2.CREATE_OBJ('Word.Application') как узнать ID ПРОЦЕССА (PID) созданного документа?
|
|||
---|---|---|---|
#18+
Al*GatoRLeonid KudryavtsevРазумеется. есть третье решение: Написать макрос в Word'е, который спрашивает свой PID и возвращает его. эта мысль меня тоже посещала, но такое решение будет не достаточным в том случаи когда WORD зависнет не выполнив этот макрос. Хотя так как альтернатив особо в ближайшее время не предвидится, может быть буду использовать этот вариант как страховочный когда не смогу определить PID который добавился во время создания документа с помощью tasklist. Я болдом и веделил, что по раздумею вообще безотказный метод. 1. Создает Word.Application 2. Загружаем туда наш документ с макросом 3. Получаем PID процесса и сохраняем его 4. Закрываем документ (мавр сделал свое дело) 5....990. Работаем как обычно.... Ничего не меняем... 991. Закрываем Word. 992. Ждем 10-15 сек и если не закрылся прибиваем его намертво. Понятное дело, что при такой реализации, отсутствие resource leak'а при длительной работе никто не обещает. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2015, 17:03 |
|
|
start [/forum/topic.php?fid=51&fpage=5&tid=1878050]: |
0ms |
get settings: |
24ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
492ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 629ms |
0 / 0 |