![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Salta |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 31.1.2006 Репутация: нет Всего: нет |
Задача такая: Необходимо получить доступ поочередно к каждому из запущенных от имени пользователя ASPNET, экземпляров COM-сервера, а именно EXCEL. Пробую так(C#):
using SRIS = System.Runtime.InteropServices; [SRIS.DllImport("ole32.dll")] public static extern int CreateBindCtx(int reserved,out SRIS.UCOMIBindCtx bctx); public SRIS.UCOMIRunningObjectTable ROT; public SRIS.UCOMIBindCtx ctx; public SRIS.UCOMIEnumMoniker EnMon; SRIS.UCOMIMoniker[] pMon = new SRIS.UCOMIMoniker[10]; ArrayList RunnExcels = new ArrayList(); private void GetRunningExcels() { object oExcel = new object(); CreateBindCtx(0,out ctx); ctx.GetRunningObjectTable(out ROT); ROT.EnumRunning(out EnMon); EnMon.Reset(); int pceltFetched=0; string str=""; Monikers.Clear(); while (EnMon.Next(1,pMon,out pceltFetched) == 0x0) { pMon[0].GetDisplayName(ctx,pMon[0],out str); if (str=="!{00024500-0000-0000-C000-000000000046}") { ROT.GetObject(pMon[0], out oExcel); RunnExcels.Add(oExcel); } } } Ожидаю получить коллекцию объектов, соответствующую запущенным экземплярам, на деле колличество элементов коллекции совпадает с количеством реально запущенных экземпляров,но фактически все объекты ссылаются на один и тот же экземпляр. Подскажите, кто сталкивался с такой задачей. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Можно в каждом экземпляре COM-сервера создавать именованный WinAPI'шный объект "событие", "мьютекс" и т.п., а в указанной процедуре проверять существование данного именованного объекта.
-------------------- ![]() |
|||
|
||||
| Salta |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 31.1.2006 Репутация: нет Всего: нет |
Это решение не подходит, как я понимаю, GetObject просто возвращает 1-вый попавщийся процесс, того класса на который ссылается моникер, скорее всего надо использовать связывание объекта с моникером BindToObject.
private void GetRunningExcels() { Type myType = typeof(Excel.Application); Guid excelGuid=(Guid) myType.GUID; object oExcel = new object(); CreateBindCtx(0,out ctx); ctx.GetRunningObjectTable(out ROT); ROT.EnumRunning(out EnMon); EnMon.Reset(); int pceltFetched=0; string str=""; Monikers.Clear(); while (EnMon.Next(1,pMon,out pceltFetched) == 0x0) { pMon[0].GetDisplayName(ctx,pMon[0],out str); if (str=="!{00024500-0000-0000-C000-000000000046}") { pMon[0].BindToObject(ctx,null,ref excelGuid,out oExcel); //ROT.GetObject(pMon[0], out oExcel); RunnExcels.Add(oExcel); } } } На исполнении строки pMon[0].BindToObject(ctx,null,ref excelGuid,out oExcel) вываливается ошибка "неверно заданный параметр". Как вообще задать этот интерфейс, через который будет читаться объект? |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |