本節是對《基於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 等待客戶請求到...