获取已经打开的Excel进程中的文件资源属性

本文介绍了一种通过调用OLEDB API实现的方法,用于检测指定的.xls文件是否正在被Excel程序打开。通过获取运行对象表并枚举其中的Excel应用程序实例及其工作簿,可以判断文件是否处于打开状态。

今天注册了blog,先来一篇简单实用的文章吧~

以前大家可能碰到过这样的需求,
要求程序检查.xls文件有没有被Excel打开着,我想很多朋友都会想到利用系统api.获得进程窗体的句柄等...

前面一段时间,正好碰到了这样需求,所以调查了一下,其实oledb公开了一些api,可供我们使用.

如代码

[DllImport("ole32.dll")]
public static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot);

[DllImport(
"ole32.dll")]
public static extern int CreateBindCtx(int reserved, out IBindCtx ppbc);

 

private Hashtable GetRunningObjectTable()
{
    Hashtable result 
= new Hashtable();

    IntPtr numFetched 
= IntPtr.Zero;
    IRunningObjectTable runningObjectTable;
    IEnumMoniker monikerEnumerator;
    IMoniker[] monikers 
= new IMoniker[1];

    GetRunningObjectTable(
0out runningObjectTable);
    runningObjectTable.EnumRunning(
out monikerEnumerator);
    monikerEnumerator.Reset();

    
while (monikerEnumerator.Next(1, monikers, numFetched) == 0)
    
{
        IBindCtx ctx;
        CreateBindCtx(
0out ctx);

        
string runningObjectName;
        monikers[
0].GetDisplayName(ctx, nullout runningObjectName);

        
object runningObjectVal;
        runningObjectTable.GetObject(monikers[
0], out
        runningObjectVal);
        result[runningObjectName] 
= runningObjectVal;
    }

    
return result;
}


private bool XlsIsOpen(string fileName)
{
    
bool XlsIsOpen = false;
    Hashtable rot 
= GetRunningObjectTable();

    
bool isOk = false;
    
foreach (object o in rot.Values)
    
{
        
if (isOk)
        
{
            
break;
        }

        Excel.Application a 
= o as Excel.Application;
        
if (a != null)
        
{
            Excel.Workbooks wbooks 
= a.Workbooks;
            
foreach (Excel.Workbook wb in wbooks)
            
{
                
if (wb.Name == fileName)
                
{
                    XlsIsOpen 
= true;
                    isOk 
= true;
                    
break;
                }

            }

            
//a.DisplayAlerts = false;
            
//a.Quit();
        }

    }

    
return XlsIsOpen;

}


转载于:https://www.cnblogs.com/wangsu/archive/2007/12/17/1003509.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值