C 使檔案型別與程式關聯

2021-04-14 02:06:00 字數 4857 閱讀 9768

要註冊 自定義檔案型別,包括檔案關聯圖示,檔案關聯應用程式等,這些操作都是通過修改登錄檔來完成.

1.為便程式碼清晰,首先將註冊需要的資訊封裝到filetypereginfo類中.

public

class

filetypereginfo

public

filetypereginfo(

string

extendname)}

2.編寫註冊檔案型別的類.

//////

filetyperegister 用於註冊自定義的檔案型別。

///

public

class

filetyperegister

string

relationname 

=reginfo.extendname.substring(

1, reginfo.extendname.length -1

).toupper() +"

_filetype";

registrykey filetypekey 

=registry.classesroot.createsubkey(reginfo.extendname);

filetypekey.setvalue(

"", relationname);

filetypekey.close();

registrykey relationkey 

=registry.classesroot.createsubkey(relationname);

relationkey.setvalue(

"", reginfo.description);

registrykey iconkey 

=relationkey.createsubkey(

"defaulticon");

iconkey.setvalue(

"", reginfo.icopath);

registrykey shellkey 

=relationkey.createsubkey(

"shell");

registrykey openkey 

=shellkey.createsubkey(

"open");

registrykey commandkey 

=openkey.createsubkey(

"command");

commandkey.setvalue(

"", reginfo.exepath +"

%1");relationkey.close();

}///

///getfiletypereginfo 得到指定檔案型別關聯資訊

///

public

static

filetypereginfo getfiletypereginfo(

string

extendname)

filetypereginfo reginfo 

=new

filetypereginfo(extendname);

string

relationname 

=extendname.substring(

1, extendname.length -1

).toupper() +"

_filetype";

registrykey relationkey 

=registry.classesroot.opensubkey(relationname);

reginfo.description 

=relationkey.getvalue(

"").tostring();

registrykey iconkey 

=relationkey.opensubkey(

"defaulticon");

reginfo.icopath 

=iconkey.getvalue(

"").tostring();

registrykey shellkey 

=relationkey.opensubkey(

"shell");

registrykey openkey 

=shellkey.opensubkey(

"open");

registrykey commandkey 

=openkey.opensubkey(

"command");

string

temp 

=commandkey.getvalue(

"").tostring();

reginfo.exepath 

=temp.substring(

0, temp.length -3

);return

reginfo;

}///

///updatefiletypereginfo 更新指定檔案型別關聯資訊

///

public

static

bool

updatefiletypereginfo(filetypereginfo reginfo)

string

extendname 

=reginfo.extendname;

string

relationname 

=extendname.substring(

1, extendname.length -1

).toupper() +"

_filetype";

registrykey relationkey 

=registry.classesroot.opensubkey(relationname, 

true

);relationkey.setvalue(

"", reginfo.description);

registrykey iconkey 

=relationkey.opensubkey(

"defaulticon", 

true

);iconkey.setvalue(

"", reginfo.icopath);

registrykey shellkey 

=relationkey.opensubkey(

"shell");

registrykey openkey 

=shellkey.opensubkey(

"open");

registrykey commandkey 

=openkey.opensubkey(

"command", 

true

);commandkey.setvalue(

"", reginfo.exepath +"

%1");relationkey.close();

return

true;}

//////

filetyperegistered 指定檔案型別是否已經註冊

///

public

static

bool

filetyperegistered(

string

extendname)

return

false;}

#endregion}

3.注意上段程式碼中commandkey.setvalue("" ,reginfo.exepath + " %1") ;其中" %1"表示將被雙擊的檔案的路徑傳給目標應用程式,這樣在雙擊a.xcf檔案時,xcodefactory才知道要開啟哪個檔案,所以應用程式的main方法要被改寫為帶有引數的形式,如下所示:

[stathread]

static

void

main(

string

args)

mainform.xcffilepath 

=new

mainform());

}   

4.通過檔案的副檔名取得 與副檔名相對應的檔案型別的圖示

[dllimport(

"shell32.dll")]

static

extern

intshgetfileinfo(

string

pszpath, 

uint

dwfileattributes, 

refshfileinfo psfi, 

uint

cbfileinfo, 

uint

uflags);

//////

要用到的乙個結構   

///

struct

shfileinfo

//////

從副檔名得到小圖示   

///

///檔名或副檔名

///圖示

static

public

icon seticon(

string

filename)

return

ic;}

5.總結

由於擔心破壞登錄檔,所以以上程式碼我並沒有做測試,但我仍然檢視了一下我的登錄檔中的內容,我用的是win2k,從登錄檔看到,並沒有看到本文所寫的shell,open,command等鍵,具體是什麼結構我也沒看出來,估計檔案關聯與作業系統的不同也有關係,這篇文章暫且寄存在此,等以後需要時再做詳細研究.

參考文章: http://www.gissky.com/develop/showarticle.asp?sid=21&id=1523 及http://topic.csdn.net/t/20060921/22/5039676.html

測試篇 c 檔案型別關聯啟動程式

我的應用場景是windows服務掛載了我的程式之後,按啟動,它就修改登錄檔.但是,原本就是一件很簡單的事情,貌似出現了不可思議的事情.我的許可權已經是系統級別的,因為是服務程式嘛 我在修改登錄檔上面cad的.vlx字尾名時,想在 預設 的新增 關聯的程式 結果死都新增不上.最後手動刪除一次,就可以了...

註冊檔案型別,關聯檔案

bool function registerfiletype lpctstr houzhui,lpctstr fmiaoshu,lpctstr wmiaoshu,lpctstr filepath hkey hkey null dword dwdip 0 lptstr newreg new tchar...

註冊檔案型別,並關聯程式(三)

雙擊乙個txt檔案,就能用記事本開啟,因為txt檔案關聯了記事本程式。想讓你自定義的檔案型別也通過雙擊就能直接呼叫你的程式並開啟?ok,首先我們找到第一期,看到其中的這行 registry.setvalue hkey classes root myguo shell open command d b...