[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

microsoft.public.dotnet.framework.interop

Attach to all running Excel processes

J?rgen Ahrens

6/4/2007 2:56:00 PM

Hi

I would like to attach to all running excel applications.

I tried
System.Runtime.InteropServices.Marshal.GetActiveObject()
you get an excel application but you can not specify which one, so this
doesn't work...

I tried
System.Runtime.InteropServices.Marshal.BindToMoniker()
But all Excel Application Monikers returned the same display name and
binding to the moniker always returned the same (i guess the first) excel
application object....

Finally i tried the following code:

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

using Excel = Microsoft.Office.Interop.Excel;

using System.Collections;

using System.Runtime.InteropServices.ComTypes;



namespace Ascami.Axpo.EnergiemarktSimulator.WinApp

{

public class ExcelSelector

{

[DllImport("ole32.dll")]

private static extern int GetRunningObjectTable(uint reserved, out
IRunningObjectTable pprot);

[DllImport("ole32.dll")]

private static extern int CreateBindCtx(uint reserved, out IBindCtx pctx);

/// <summary>

/// Will hold all excel applications that are currently running on this
machine.

/// </summary>

private static List<Excel.Application> excelApps = new
List<Excel.Application>();

/// <summary>

/// This function will bind to all currently running excel objects and store
the COM object within excelApps.

/// </summary>

public static void BindToRunningExcelObjects()

{

IRunningObjectTable runningObjectTable = null;

IEnumMoniker monikerList = null;

try

{

if (GetRunningObjectTable(0, out runningObjectTable) != 0 ||
runningObjectTable == null) return;

runningObjectTable.EnumRunning(out monikerList);

monikerList.Reset();

IMoniker[] monikerContainer = new IMoniker[1];

IntPtr pointerFetchedMonikers = IntPtr.Zero;

//Run through all monikers

while (monikerList.Next(1, monikerContainer, pointerFetchedMonikers) == 0)

{

IBindCtx bindInfo;

CreateBindCtx(0, out bindInfo);

//The following block does not work but isn't there any way?

//this may be the wrong iid. or do i have to use the iunknown?

Object boundComObject;

Guid iid = new Guid("000208D5-0000-0000-C000-000000000046");

try

{

monikerContainer[0].BindToObject(bindInfo, null, ref iid, out
boundComObject);

//Add the bound object to the list (I actually never got here...)

excelApps.Add((Excel.Application)boundComObject);

}

catch { }

Marshal.ReleaseComObject(bindInfo);

}

}

finally

{

if (runningObjectTable != null)
Marshal.ReleaseComObject(runningObjectTable);

if (monikerList != null) Marshal.ReleaseComObject(monikerList);

}

}

}

}


it didn't work... does anyone know a solution?

thanks for your help
jahrens


6 Answers

wawang

6/5/2007 5:53:00 AM

0

Hi,

Please see this KB on related information:

#How to use Visual C# to automate a running instance of an Office program
http://support.microsoft.com...
<quote>
Whether a COM server is Single Use (Multiple Instances) or Multiuse (Single
Instance) might affect your decision to use GetActiveObject to get
reference to that server. Because potentially more than one instance of
Word, Excel, or Microsoft Access can be running, GetActiveObject on a
particular server may return an instance that you did not expect. The
instance that is first registered in the ROT is typically the instance that
is returned by GetActiveObject. If you want to get an Automation Reference
to a specific running instance of Word, Excel, or Microsoft Access, use
BindToMoniker with the name of the file that is opened in that instance.
</quote>

In summary, using GetActiveObject can only get you one instance; you will
need to know a file name before hand to use BindToMoniker to get a specific
instance.

Could you please tell me why you need to know all running instances of
excel? Thanks.



Sincerely,
Walter Wang (wawang@online.microsoft.com, remove 'online.')
Microsoft Online Community Support

==================================================
Get notification to my posts through email? Please refer to
http://msdn.microsoft.com/subscriptions/managednewsgroups/default....
ications. If you are using Outlook Express, please make sure you clear the
check box "Tools/Options/Read: Get 300 headers at a time" to see your reply
promptly.

Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
where an initial response from the community or a Microsoft Support
Engineer within 1 business day is acceptable. Please note that each follow
up response may take approximately 2 business days as the support
professional working with you may need further investigation to reach the
most efficient resolution. The offering is not appropriate for situations
that require urgent, real-time or phone-based interactions or complex
project analysis and dump analysis issues. Issues of this nature are best
handled working with a dedicated Microsoft Support Engineer by contacting
Microsoft Customer Support Services (CSS) at
http://msdn.microsoft.com/subscriptions/support/de....
==================================================

This posting is provided "AS IS" with no warranties, and confers no rights.

wawang

6/8/2007 2:47:00 AM

0

Hi,

Please feel free to let me know if there's anything else I can help. Thanks.


Regards,
Walter Wang (wawang@online.microsoft.com, remove 'online.')
Microsoft Online Community Support

==================================================
When responding to posts, please "Reply to Group" via your newsreader so
that others may learn and benefit from your issue.
==================================================

This posting is provided "AS IS" with no warranties, and confers no rights.

J?rgen Ahrens

6/8/2007 7:53:00 AM

0

Hi Walter

Sorry for the delay.

We would like to let the user chose the excel application to which we will
export some data.

There may be many workbooks open within one application and we do not want
to bind to the moniker of each workbook. Furthermore, there may be an excel
application with no workbook open, in which case it would not be considered.

If you can bind to the workbooks, you should be able to bind to the monikers
of the application, or not?

There is a moniker for each excel application, so there should be a way to
do it. The problem of the excel application monikers is, that they have all
the same display name and therefore
System.Runtime.InteropServices.Marshal.BindToMoniker() does not work. I
guess there is another way to bind to the moniker (by using the previously
mentioned IMoniker.BindToObject() method perhaps), or not?

Thanks for your support
jahrens


wawang

6/11/2007 12:35:00 PM

0

Hi jahrens,


Unfortunately it's not possible without knowing the document path first:

#How To Attach to a Running Instance of an Office Application
http://support.microsoft.com/...

<quote>
Theoretically, you can iterate the ROT for each individual instance, but
Office applications do not register themselves if another instance is
already in the ROT because the moniker for itself is always the same, and
cannot be distinguished. This means that you cannot attach to any instance
except for the first. However, because Office applications also register
their documents in the ROT, you can successfully attach to other instances
by iterating the ROT looking for a specific document, attaching to this
document, and then getting the Application object from this document.
</quote>


I think you could create a new excel instance and export data there, then
let the user to copy the worksheet to other existing excel instances if
needed.


Regards,
Walter Wang (wawang@online.microsoft.com, remove 'online.')
Microsoft Online Community Support

==================================================
When responding to posts, please "Reply to Group" via your newsreader so
that others may learn and benefit from your issue.
==================================================

This posting is provided "AS IS" with no warranties, and confers no rights.

J?rgen Ahrens

6/12/2007 6:47:00 AM

0

thanks for your help.
we will let our customer attach to excel objects with open documents...its
the only thing that makes sence...otherwise we open a new excel application.

jahrens


"Walter Wang [MSFT]" <wawang@online.microsoft.com> wrote in message
news:gK3OxTCrHHA.3656@TK2MSFTNGHUB02.phx.gbl...
> Hi jahrens,
>
>
> Unfortunately it's not possible without knowing the document path first:
>
> #How To Attach to a Running Instance of an Office Application
> http://support.microsoft.com/...
>
> <quote>
> Theoretically, you can iterate the ROT for each individual instance, but
> Office applications do not register themselves if another instance is
> already in the ROT because the moniker for itself is always the same, and
> cannot be distinguished. This means that you cannot attach to any instance
> except for the first. However, because Office applications also register
> their documents in the ROT, you can successfully attach to other instances
> by iterating the ROT looking for a specific document, attaching to this
> document, and then getting the Application object from this document.
> </quote>
>
>
> I think you could create a new excel instance and export data there, then
> let the user to copy the worksheet to other existing excel instances if
> needed.
>
>
> Regards,
> Walter Wang (wawang@online.microsoft.com, remove 'online.')
> Microsoft Online Community Support
>
> ==================================================
> When responding to posts, please "Reply to Group" via your newsreader so
> that others may learn and benefit from your issue.
> ==================================================
>
> This posting is provided "AS IS" with no warranties, and confers no
> rights.
>


wawang

6/12/2007 12:49:00 PM

0

Hi jahrens,

Thanks for the update.

As the KB described, based on how Office currently uses the ROT and
moniker, I think your approach is the best one.

Please feel free to let me know if you have any other questions.

Have a nice day!


Regards,
Walter Wang (wawang@online.microsoft.com, remove 'online.')
Microsoft Online Community Support

==================================================
When responding to posts, please "Reply to Group" via your newsreader so
that others may learn and benefit from your issue.
==================================================

This posting is provided "AS IS" with no warranties, and confers no rights.