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

}


你可能感兴趣的:(Excel)