基於Ifilter介面的文件解析 2

2021-06-16 14:54:31 字數 2236 閱讀 8985

本節是對《基於ifilter介面的文件解析》的補充,根據loadfilter的原理重寫該函式,重寫後不需要安裝office軟體,只需取出相應的ifilter元件,通過自行進行登錄檔註冊就可以了。

loadfilter的流程如下(以.pdf為例,開啟登錄檔):

1. 在hkey_local_machine\software\classes\  找到.pdf,  .pdf中子鍵persistenthandler 值為

2. 在hkey_local_machine\software\clsid中查詢, 找到含有persistentaddinsregistered的結點,persistentaddinsregistered含有結點。

為ifilter介面的guid, 取出該結點的值。

3. 在hkey_local_machine\software\clsid查詢結點, 該結點中子節點inprocserver32的預設值即為pdf ifilter dll的位址。

4. 後續任務就是對該dll進行註冊和 load,詳見 。

根據讀登錄檔的流程定義了

finddllpath

函式來進行dll路徑的查詢:

hresult finddllpath (lpwstr filename ,lpwstr dllpath ,lpwstr filterclass )

swprintf_s( regpath ,_t ("%s%s\\%s" ),

_t( "software\\classes\\clsid\\" ),filterclass ,

_t ("persistentaddinsregistered\\" ));

hr = readregkey (regpath ,filterclass );

if ( failed (hr ))

swprintf_s( regpath ,_t ("%s%s\\%s" ),

_t( "software\\classes\\clsid\\" ),filterclass ,

_t( "inprocserver32" ));

wchar_t buffervalue [maxbuffer ]=;

hr = readregkey (regpath ,buffervalue );

if ( failed (hr ))

if (expandenvironmentstrings (buffervalue ,dllpath ,maxbuffer )==0)

return s_ok;

}hresult readregkey(lpwstr regpath,lpwstr regkey)

}else

regclosekey(hkey);

return s_ok;

}

在讀取完登錄檔內的dll元件路徑後,對該路徑進行類廠註冊。

hresult myloadifilter (lpwstr dllname ,lpvoid * spfilter , lpwstr filterclass )

}; clsid iid_iunknown =

};clsid filterclsid ;

hresult hr = clsidfromstring ((lpolestr )filterclass ,& filterclsid);

if ( failed (hr ))

ccomptr< iclassfactory > pclassfactory ;

hmodule hmoudle =loadlibrary (dllname );

if ( hmoudle !=null )

hr = g_dllgetclassobject ((refclsid )filterclsid ,(refiid )ifilterguid ,(void **)& pclassfactory);

if ( failed (hr ))

wchar_t outerror [maxbuffer ]=;

swprintf_s (outerror ,_t ("%s address--------%d"), _t( "pclassfactory" ),pclassfactory );

}else

hr = pclassfactory ->createinstance (null , iid_iunknown , (void **)spfilter );

return hr;

}

最後就是對文件的解析部分見上節部分。

基於Ifilter介面的文件解析

ifilter介面是windows自帶的文件解析的介面,windows search,sql 檢索,share point等使用的都是該介面,目前該介面在win7 和 xp系統中都可使用。ifilter介面派生於iunknow,所以自帶函式queryinte ce,addeef,release,其主...

C 基於介面的排序

需要注意的是int32,int16 string,decimal等資料型別已經實現了icomparable介面 因此對於複雜的資料型別進行排序的時候才考慮讓資料型別繼承自icomparable介面。icomparable介面只有乙個方法compareto。因此還要實現compareto方法。comp...

基於字元介面的聊天程式1 0

編譯器 vs2013 community vc6.0 執行亦可,但要注意函式的更新,如更安全的函式,etc 伺服器端程式流程 1 載入套接字型檔 2 建立套接字 socket 3 將套接字繫結到乙個本地位址和埠上 bind 4 將套接字設為監聽模式,準備接收客戶請求 listen 5 等待客戶請求到...