Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить все экземпляры запущеного COM-сервера 
V
    Опции темы
Salta
Дата 31.1.2006, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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);
}
}
}

Ожидаю получить коллекцию объектов, соответствующую запущенным экземплярам, на деле колличество элементов коллекции совпадает с количеством реально запущенных экземпляров,но фактически все объекты ссылаются на один и тот же экземпляр. Подскажите, кто сталкивался с такой задачей.
PM MAIL   Вверх
mr.DUDA
Дата 31.1.2006, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Можно в каждом экземпляре COM-сервера создавать именованный WinAPI'шный объект "событие", "мьютекс" и т.п., а в указанной процедуре проверять существование данного именованного объекта.


--------------------
user posted image
PM MAIL WWW   Вверх
Salta
Дата 1.2.2006, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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) вываливается ошибка "неверно заданный параметр". Как вообще задать этот интерфейс, через который будет читаться объект? smile

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1065 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.