您好,登錄后才能下訂單哦!
開發(fā)的程序有一個導(dǎo)出功能,導(dǎo)出前會有一個簡單的選擇目錄的步驟。簡單啊,簡個對話框,點確定不就完事了?沒想到的是,這個“簡單”的動作整整耗了我一天的時間。
最初出現(xiàn)的問題是,在win10上,有一些目錄是被嚴(yán)格控制寫入的,比如C:\,用戶選擇了這樣的目錄之后,導(dǎo)出就會報錯。這也簡單啊,用戶選擇目錄之后,對這個目錄做一個簡單的測試,寫一個空白文件進(jìn)去,寫成功了就說明這個目錄可用,寫入失敗就說明這個目錄沒有權(quán)限寫入唄,區(qū)區(qū)三五行代碼,so easy...
類似的代碼如下:
var
sl:TStringList;
begin
sl:=TStringList.Create;
try
sl.SaveToFile('C:\datatest.txt');
except
(說明沒權(quán)限,重新讓用戶再選一個目錄)
end;
sl.Free;
end;
意想不到的問題來了,用戶選擇了C盤根目錄這樣注定會寫入失敗的路徑時,這段代碼運行的結(jié)果竟然說寫入是成功的!但是對應(yīng)的目錄上實際上是沒有這個文件的,太詭異了。在SaveToFie之后用FileExists函數(shù)來檢測,也是說磁盤上已經(jīng)有這個文件了,寫入成功。以為自己眼花,打開文件瀏覽器再核對一次,的的確確是沒有這文件,我。。。。
接下來各種調(diào)整(此處省略掉一萬字。。。),比如說生怕寫入動作一定要釋放變量后才真正執(zhí)行,就在寫入后趕緊將TStringlist給free掉,或者改成了用函數(shù)對TextFile的文件操作,強制刷入磁盤,結(jié)果無一例外,還是和之前一樣。
不信邪于是新建了一個工程來試,結(jié)果跌大眼鏡,這段代碼在新工程里可以正確無誤的執(zhí)行。看來問題出現(xiàn)在工程設(shè)置上,因為我這個工程是從舊版本升級來的,估計有一些設(shè)置沒有配上。對工具仔細(xì)比對了兩個dproj文件,在差異處沒看出什么道道來,又在菜單project——option里面看,也是一無所獲。準(zhǔn)備關(guān)掉option對話框的時候,隨手把manifest的設(shè)置點了一下,原來是none,改成了auto generate。關(guān)掉了再運行,居然正確了,瞎貓竟然碰到了死老鼠!
查了一下manifest的作用,原來Application manifest相當(dāng)于程序的配置和說明,在XP的時候提出,在Vista的時候做了改進(jìn)。估計我之前的程序從老版本Delphi升級過來,manifest部分沒有設(shè)置,所以win10將程序作為老式程序,在兼容模式下運行了,老程序是可以寫入C盤根目錄的,當(dāng)然是假的寫入,只在本進(jìn)程內(nèi)可見。當(dāng)我檢測到可以寫入,但真正調(diào)用Excel來導(dǎo)出的時候就報錯了。當(dāng)我生成manifest,運行在真實模式的時候,終于得出了真正的結(jié)果。而那個新工程因為是新版本Delphi建立的,默認(rèn)就設(shè)置了manifest,所以運行一切正常。
挖掘到了manifest這個寶藏,還順便解決了困擾我的一些問題。比如說,在里面勾選允許run time themes,工具欄上面的圖標(biāo)顯示也正常了,不會在顯示在偏上的位置。DPI(manifest自動生成之后,這一項也會自動選上)選擇系統(tǒng)識別或者顯示器識別,原來在高分辨率下顯示模糊的程序也清晰了,perfect!
下面是一篇有關(guān)windows程序manifest說明的文章:
http://www.softwareace.cn/?p=1207
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。