.NET Forum / .NET Framework / Interop / June 2007
Attach to all running Excel processes
|
|
Thread rating:  |
Jörgen Ahrens - 04 Jun 2007 15:55 GMT 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
Walter Wang [MSFT] - 05 Jun 2007 06:53 GMT 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/kb/316126 <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.aspx#notif 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/default.aspx. ==================================================
This posting is provided "AS IS" with no warranties, and confers no rights.
Walter Wang [MSFT] - 08 Jun 2007 03:46 GMT 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 - 08 Jun 2007 08:52 GMT 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
Walter Wang [MSFT] - 11 Jun 2007 13:34 GMT 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/kb/238975/
<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 - 12 Jun 2007 07:46 GMT 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
> Hi jahrens, > [quoted text clipped - 29 lines] > This posting is provided "AS IS" with no warranties, and confers no > rights. Walter Wang [MSFT] - 12 Jun 2007 13:48 GMT 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.
Free MagazinesGet these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...
|
|
|