获取已经打开的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;

}


posted @ 2007-12-17 19:10  riancy  阅读(774)  评论(0编辑  收藏  举报