亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

NET Framework 用C#創建SHELL擴展

2024-07-21 02:29:44
字體:
來源:轉載
供稿:網友

一、前言

.net平臺是微軟公司推出的作為未來軟件運行和開發的環境,c#是微軟力薦的在.net平臺下開發應用軟件的首選語言。本文將討論在.net環境下如何使用c#語言開發windows shell擴展問題。如今windows家族已發展到xp世代了,想必每個程序員都對shell extension不會感到陌生吧,在這里我不想花太多的時間介紹shell extension的原理知識,本文中將通過一個實例介紹用c#創建一個shell extension,在此過程中也會簡單介紹一些shell extension的原理知識(如果想詳細了解shell擴展原理知識,請參閱msdn)

二、開發環境

(1)、windows2000 專業版。
(2)
、visual studio.net beta 2.0或正式版1.0

三、原理介紹

本實例實現一個shellexecuteex win32調用的鉤子操作,windows explorer常常會用到這個調用,如打開、編輯、打印等等shell操作都要用到這個調用。在windows注冊表hklm/software/microsoft/windows/currentversion/explorer/shellexecutehooks項下安裝了所有實現shell擴展的組件信息。當windows explorer執行shell操作前,先在注冊中查找到已注冊的shell擴展組件,并將其實例化,每個shell擴展組件必須至少實現了ishellexecutehook接口,此接口提供了一個execute()函數,explorer將通過組件實例對象調用execute()函數,如此函數返回為s_false繼續后面的操作,如返回s_ok則停止后面的所有操作。根據以上原理,本實例要實現shell擴展就必須要實現一個支持ishellexecutehook接口的com組件。

接口聲明

c#不能像c++那樣用一句#include "shlguid.h"語句就可以完成ishellexecutehook接口聲明,它必須要求在程序中聲明接口的具體信息,聲明如下:

[comimpor,interfacetype(cominterfacetype.interfaceisiunknown), guid("000214fb-0000-0000-c000-000000000046")]
/* guid("000214fb-0000-0000-c000-000000000046")
相當于shlguid.h中的define_shlguid(iid_ishellexecutehookw, 0x000214fbl, 0, 0); */
public interface ishellexecutehook{
[preservesig()] /*
允許返回值為
com hresult */
int execute(shellexecuteinfo sei);
}

結構聲明

execute()方法中有一個shellexecuteinfo結構體參數sei,接下來要聲明結構體:
[structlayout(layoutkind.sequential)]
public class shellexecuteinfo {
public int cbsize;
public int fmask;
public int hwnd;
[marshalas(unmanagedtype.lpwstr)]
public string lpverb; /*
動作,如edit,open,print... */
[marshalas(unmanagedtype.lpwstr)]
public string lpfile; /*
根據lpverb的值而定,常為文件名
*/
[marshalas(unmanagedtype.lpwstr)]
public string lpparameters; /*
參數字符串
*/
[marshalas(unmanagedtype.lpwstr)]
public string lpdirectory; /*
路徑名
*/
public int nshow;
public int hinstapp;
public int lpidlist;
public string lpclass;
public int hkeyclass;
public int dwhotkey;
public int hicon;
public int hprocess;
}

shellexecuteinfo結構體的元素是不是夠多的,它們的具體說明就不一一介紹了,如果你有空的話可以看看msdn。

四、實現步驟

介紹了isellexecutehook接口的聲明以及shellexecuteinfo結構體的聲明后,我們就著手實現這個應用實例,這個實例很簡單,每當explorer對一個shell對象執行某動作前將會彈出一個對話框,在其上顯示執行的動作內容、對象名以及參數內容。

打開vs.net,按下面步驟工作:

1.新建一個空項目(項目名:extenshell)。

2.添加一個新類(類名:extenshell.cs)。
  
3.
將下面代碼作為extenshell.cs的內容。

   /* extenshell.cs */
   using system;
   using system.reflection;
   using system.runtime.interopservices;
   using system.windows.forms;

   [assembly: assemblykeyfile(@"../../eskey.snk")] /*密鑰文件*/
   namespace shellextension
   {
     //
接口聲明。

     [comimport,interfacetype(cominterfacetype.interfaceisiunknown), guid("000214fb-0000-0000-c000-000000000046")]
        /* guid("000214fb-0000-0000-c000-000000000046")
相當于shlguid.h中的define_shlguid(iid_ishellexecutehookw, 0x000214fbl, 0, 0); */
     public interface ishellexecutehook
     {
         [preservesig()] /*
允許返回值為
com hresult */
         int execute(shellexecuteinfo sei);
     }

     //結構聲明。
     [structlayout(layoutkind.sequential)]
     public class shellexecuteinfo
     {
         public int cbsize;
         public int fmask;
         public int hwnd;
         [marshalas(unmanagedtype.lpwstr)]
         public string lpverb;
         [marshalas(unmanagedtype.lpwstr)]
         public string lpfile;
         [marshalas(unmanagedtype.lpwstr)]
         public string lpparameters;
         [marshalas(unmanagedtype.lpwstr)]
         public string lpdirectory;
         public int nshow;
         public int hinstapp;
         public int lpidlist;
         public string lpclass;
         public int hkeyclass;
         public int dwhotkey;
         public int hicon;
         public int hprocess;
      }

      [guid("027f9368-a83e-42cc-85b2-1dc5e23c4608"), comvisible(true)]
         /*
guid生成工具創建一個新的guid作為類對象的guid標識。 */
      public class extenshell : ishellexecutehook
      {
           private int s_ok=0;
           private int s_false=1;
           public int execute(shellexecuteinfo sei)
           {
               try
               {
                   messagebox.show(null, "[ verb ]: " + sei.lpverb + "/n[ file ]: " + sei.lpfile + "/n[ parameters ]:" + sei.lpparameters + "/n[ directory ]:" + sei.lpdirectory , "shellextensionhook",messageboxbuttons.ok, messageboxicon.information);

               }
               catch(exception e)
               {
                   console.error.writeline("unknown exception : " + e.tostring());
               }

               return s_false;
               //
如果返回值為s_okshell將停止對shell對象的以后的所有動作。
            }
       }
  }

4. 在命令行上運行:sn -k eskey.snk ( sn.exe c:/programe files/microsoft.net/frameworksdk/bin下可以找到 ),將eskey.snk添加到項目中。
 
    5.
打開<項目> --> <屬性>,將輸出類型改成類庫。
 
 
    6.
編譯完成。
 
    7.
.net可控代碼生成的com組件注冊后要到assembly目錄中尋找實體執行,故應將編譯好的extenshell.dll文件拷貝到c:/winnt/assembly目錄中?!?span lang=en-us>

8. 注冊組件。在命令行上運行:regasm {項目路徑}/bin/debug/extenshell.dll。( regasm.exec:/winnt/microsoft.net/framework/v1.0.2914下可以找到)
 

    9.
最后,在hklm/software/microsoft/windows/currentversion/explorer/shellexecutehooks項下新建一個字符串值,其名為{027f9368-a83e-42cc-85b2-1dc5e23c4608},值可以為空也可以加入一串描述性文字。

五、結 束

    這是一個簡單的shell擴展的例子,雖然不是一個完整的應用,但是作者想通過此實例向讀者介紹shell擴展和.net平臺下的com組件開發技術,希望它能起拋磚引玉的作用。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色琪琪综合男人的天堂aⅴ视频| 国产精品99久久久久久www| 国产日韩av在线播放| 亚洲第一av网| 欧美精品videosex牲欧美| 中国日韩欧美久久久久久久久| 国产精品jizz在线观看麻豆| 亚洲欧美日韩精品| 日韩男女性生活视频| 欧美国产日韩一区二区在线观看| 色妞色视频一区二区三区四区| 中文字幕av一区中文字幕天堂| 国产精品丝袜白浆摸在线| 九九热这里只有精品6| 91亚洲精品在线| 国产精品人成电影在线观看| 国产免费一区二区三区在线观看| 国产成人精品视频在线| 色狠狠av一区二区三区香蕉蜜桃| 国产一区视频在线播放| 国产成人极品视频| 久热精品视频在线免费观看| 亚洲激情视频在线观看| 91精品久久久久久久久中文字幕| 国产成人精品一区二区| 午夜欧美大片免费观看| 91麻豆国产语对白在线观看| 亚洲级视频在线观看免费1级| 亚洲精品av在线| 国内精品久久久久影院 日本资源| 久久免费成人精品视频| 国内精品免费午夜毛片| 日本久久亚洲电影| 欧美精品久久久久久久免费观看| 亚洲欧洲一区二区三区久久| 91成品人片a无限观看| 欧美性xxxx极品hd欧美风情| 亚洲精品wwww| 中国日韩欧美久久久久久久久| 国产精品嫩草视频| 国产精品视频久| 日韩欧美成人区| 自拍偷拍亚洲欧美| 久久视频在线免费观看| 国产丝袜一区二区三区| 8090理伦午夜在线电影| 国产精品美女无圣光视频| 亚洲黄一区二区| 91国产精品电影| 色综合久久天天综线观看| yellow中文字幕久久| 一区二区三区 在线观看视| 成人国内精品久久久久一区| 国产精品福利久久久| 久久久久久av| 亚洲性夜色噜噜噜7777| 91在线直播亚洲| 欧美与黑人午夜性猛交久久久| 国产成人aa精品一区在线播放| 亚洲缚视频在线观看| 亚洲999一在线观看www| 国产极品精品在线观看| 欧美色欧美亚洲高清在线视频| 亚洲最大激情中文字幕| 亚洲成人在线网| 色爱av美腿丝袜综合粉嫩av| 97免费视频在线| 亚洲嫩模很污视频| 福利视频导航一区| 国产精品影片在线观看| 国产亚洲激情在线| 亚洲精品乱码久久久久久金桔影视| 亚洲视频999| 国产精品久久久久久久久久久新郎| 国产va免费精品高清在线| 高清一区二区三区日本久| 亚洲综合精品伊人久久| 久久中文字幕一区| 久久久久久久久久久国产| 亚洲欧美日韩高清| 亚洲欧美在线第一页| 欧美激情欧美激情| 国产视频精品一区二区三区| 欧美极品第一页| 国产精品夫妻激情| 日本精品久久中文字幕佐佐木| 国语对白做受69| 色777狠狠综合秋免鲁丝| 日本成人免费在线| 亚洲尤物视频网| 国产精品精品久久久久久| 欧美极品第一页| 国产91亚洲精品| 欧美激情xxxx性bbbb| 国产精品爱久久久久久久| 最近更新的2019中文字幕| 日韩久久免费电影| 亚洲香蕉伊综合在人在线视看| 亚洲一区中文字幕在线观看| 亚洲国产精品电影在线观看| 宅男66日本亚洲欧美视频| 国产精品成av人在线视午夜片| 亚洲国产婷婷香蕉久久久久久| 中文字幕亚洲二区| www高清在线视频日韩欧美| 日韩视频永久免费观看| 亚洲人成电影网站色xx| 国产激情久久久| 九九热精品视频| 日本成人激情视频| 亚洲天堂久久av| 亚洲区bt下载| 国产精品jvid在线观看蜜臀| 日韩免费高清在线观看| 精品亚洲一区二区三区在线播放| 2020国产精品视频| 亚洲成色999久久网站| 亚洲小视频在线观看| 91精品久久久久久久久久另类| 亚洲精品国产福利| 日韩精品久久久久| 国产精品欧美激情在线播放| 亚洲欧美中文日韩在线| 国产美女精品免费电影| 久久久久久久国产| 亚洲va码欧洲m码| 欧美自拍视频在线| 亚洲激情久久久| 国产裸体写真av一区二区| 久久精品美女视频网站| 青青久久av北条麻妃海外网| 欧美另类第一页| 久久久精品一区| 国产精品久久久久久久app| 国产精品com| 国产亚洲一级高清| 亚洲国产成人一区| 成人亲热视频网站| 一区三区二区视频| 国产精品18久久久久久麻辣| 久久中文字幕视频| 国产精品视频一区二区三区四| 91福利视频在线观看| 欧美最猛性xxxx| 中文字幕国产亚洲2019| 欧美激情第一页xxx| 亚洲欧洲在线免费| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美亚洲国产成人精品| 国产91精品不卡视频| 国产成人综合精品| 日韩最新中文字幕电影免费看| 国产免费一区二区三区在线能观看| 日韩欧美亚洲国产一区| 91嫩草在线视频| 欧美激情精品久久久久久大尺度| 97国产一区二区精品久久呦| 中文字幕精品视频| 欧美黄色小视频| 91精品在线看| 亚洲一区二区三区乱码aⅴ蜜桃女| www.日韩av.com| 久久电影一区二区| 日本高清不卡在线|