最近在做一個專案,具體是勾住某個軟體的另存為操作,對另存為出來的檔案進行別的處理
思路是用鉤子勾住了軟體另存為時使用的GetSaveFileNameW API
GetSaveFileNameW的原型如下
BOOL GetSaveFileName(LPOPENFILENAME Ipofn)
在我們成功勾住了GetSaveFileName,然后讀lpofn里面的內容時,詭異的事情發生了。
lpofn里面的lpstrFile存放的是檔案全路徑,但是只有到檔案名部分,沒有后綴。
比如,另存為的檔案是F:\Doc\test.doc,但是lpofn->lpstrFile內容只有F:\Doc\test這部分,沒有后綴。
按理說GetSaveFileName是寫好的API,即使是不同的應用程式,但是在使用這個API之后,回傳應該是一樣的啊,為啥這個程式會缺斤少兩呢。
然后我們又勾住NtCreateFile,生成檔案時又變成帶后綴的完整路徑了,百思不得其解,還望各位大牛不吝賜教
uj5u.com熱心網友回復:
那lpstrFileTitle 成員含有這個檔案后綴名嗎?uj5u.com熱心網友回復:
這個值是空的
uj5u.com熱心網友回復:
系統 不顯示 擴展 名 ?uj5u.com熱心網友回復:
好像WIN7之后都不走這個API了吧,還在用XP?uj5u.com熱心網友回復:
確實,再Vista之后的系統都不用這個API了
就是開發的軟體需要兼容舊作業系統,所以要用到。
后來搞明白是啥了。檢查GetSaveFileName的OPENFILENAME結構體,發現里面有個以NULL分隔包含多個后綴名的字串lpstrFilter,并且在nFileExtension = 0以及nFilterIndex != 0的時候,通過將lpstrFilter字串的地址移動nFilterIndex * 2次的 strlen(lpstrFilter) ,就可以得到本次另存為檔案的后綴。
將得到的后綴和lpstrFile拼接之后,就可以得到完整的檔案名。
因為這個后綴名lpstrFilter是以null隔開,兩個null結尾,所以一開始用APImonitor只能開到第一個后綴,后面的內容都看不到。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/30275.html
標籤:界面
上一篇:程式打不開是什么
下一篇:請教下JPEG壓縮的組幀形式?
