国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

跨進(jìn)程實(shí)現(xiàn)在Tree中快速定位節(jié)點(diǎn)

2024-07-21 02:15:57
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

    前些日子寫(xiě)軟件時(shí),需要實(shí)現(xiàn)一個(gè)功能,就是在tree中快速定位節(jié)點(diǎn),比如注冊(cè)表編輯器左邊的tree,只要給出tree中的節(jié)點(diǎn)路徑(以“/”分隔),就可以快速將樹(shù)展開(kāi),并將當(dāng)前節(jié)點(diǎn)定位到指定的節(jié)點(diǎn)。功能的實(shí)現(xiàn)并不難,但稍有些麻煩。原因在于,如果是本進(jìn)程中的tree,只要發(fā)消息就可以了,但如果是另外一個(gè)進(jìn)程中的tree,就要在那個(gè)進(jìn)程中申請(qǐng)內(nèi)存,將tree節(jié)點(diǎn)的文字復(fù)制到這塊內(nèi)存,然后再把這塊內(nèi)存的數(shù)據(jù)復(fù)制到本進(jìn)程的一塊內(nèi)存中,才能與指定的節(jié)點(diǎn)路徑相比較。由于這個(gè)功能還有一些可一般化的東西,所以就寫(xiě)了一個(gè)dll,只要給出tree的句柄和節(jié)點(diǎn)路徑,就可以展開(kāi)這顆樹(shù)并定位節(jié)點(diǎn)。



     dll源代碼如下:



/********************************************************************/



/* 文件名: tree.cpp                                                 */



/*                                                                  */



/* 功能: 標(biāo)準(zhǔn) dll ---- 跨進(jìn)程展開(kāi) systreeview32 中指定的節(jié)點(diǎn)        */



/*                                                                  */



/* 作者: 盧培培 (goodname008)           時(shí)間: 2005.02.18            */



/*                                                                  */



/* blog: http://blog.csdn.net/goodname008                           */



/********************************************************************/




 


#include "stdafx.h"



#include "tree.h"



#include "commctrl.h"



#include <string>




 


using namespace std;




 


bool apientry dllmain( handle hmodule, dword ul_reason_for_call, lpvoid lpreserved)



{



     switch (ul_reason_for_call)



     {



         case dll_process_attach:



         case dll_thread_attach:



         case dll_thread_detach:



         case dll_process_detach:



              break;



     }



    return true;



}




 


/********************************************************************/



/* 功  能: 跨進(jìn)程展開(kāi) systreeview32 中指定的節(jié)點(diǎn)



/*



/* 參  數(shù): htreewnd         systreeview32 的句柄



/*          lpszpath        systreeview32 中的節(jié)點(diǎn)路徑(忽略大小寫(xiě))



/*



/* 返回值: true             成功



/*         false            失敗(節(jié)點(diǎn)路徑不存在時(shí)會(huì)返回失敗, 但仍然展開(kāi))



/*



/* 說(shuō)  明: 在節(jié)點(diǎn)路徑不存在的情況下, 本函數(shù)會(huì)盡可能展開(kāi)存在的節(jié)點(diǎn)



/********************************************************************/



tree_api bool apientry expandtreenode(hwnd htreewnd, lpcstr lpszpath)



{



     string szpath = lpszpath;




 


     if (szpath.empty())



         return false;




 


     dword dwprocessid = null;



     getwindowthreadprocessid(htreewnd, &dwprocessid);



     if (!dwprocessid)



         return false;




 


     handle hprocess = null;



     hprocess = openprocess(process_vm_operation | process_vm_read | process_vm_write | process_query_information, false, dwprocessid);



     if (!hprocess)



         return false;




 


     tvitem tvitem, *pitem = null;



     zeromemory(&tvitem, sizeof(tvitem));



     pitem = (tvitem *)virtualallocex(hprocess, null, sizeof(tvitem), mem_commit, page_readwrite);




 


     tvitem.mask = tvif_text;



     tvitem.cchtextmax = 512;



     tvitem.psztext = (lpstr)virtualallocex(hprocess, null, 512, mem_commit, page_readwrite);



     tvitem.hitem = treeview_getroot(htreewnd);



     if (!tvitem.hitem)



         return false;




 


     string szpathnode;



     string::size_type nbackslashpos = -1;



     char szitemtext[512] = {'/0'};




 


     do



     {



         szpathnode = szpath.substr(nbackslashpos + 1, szpath.find('//', nbackslashpos + 1) - nbackslashpos - 1);



         do



         {



              if (!writeprocessmemory(hprocess, pitem, &tvitem, sizeof(tvitem), null))



                   return false;




 


              if (!treeview_getitem(htreewnd, pitem))



                   return false;




 


              if (!readprocessmemory(hprocess, tvitem.psztext, szitemtext, 512, null))



                   return false;




 


              if (lstrcmpi(szpathnode.c_str(), szitemtext) == 0)



              {



                   treeview_selectitem(htreewnd, tvitem.hitem);




 


                   if (treeview_expand(htreewnd, tvitem.hitem, tve_expand))



                   {



                       tvitem.hitem = treeview_getchild(htreewnd, tvitem.hitem);



                       if (!tvitem.hitem)



                            return false;



                   }



              }



              else



              {



                   tvitem.hitem = treeview_getnextsibling(htreewnd, tvitem.hitem);



                   if (!tvitem.hitem)



                       return false;



              }




 


         } while(lstrcmpi(szpathnode.c_str(), szitemtext) != 0);




 


         nbackslashpos = szpath.find('//', nbackslashpos + 1);




 


     } while(nbackslashpos != -1);




 


     virtualfreeex(hprocess, tvitem.psztext, null, mem_release);



     virtualfreeex(hprocess, pitem, null, mem_release);




 


     closehandle(hprocess);




 


     return true;



}




 


    頭文件源代碼:



#ifdef tree_exports



#define tree_api __declspec(dllexport)



#else



#define tree_api __declspec(dllimport)



#endif





tree_api bool apientry expandtreenode(hwnd htreewnd, lpcstr lpszpath);




 


    def文件如下:



library  tree




 


exports

expandtreenode     @1




    



   
調(diào)用例程就不再這里給出了,dll和vc的調(diào)用例程都是用.net環(huán)境寫(xiě)的。



    源代碼及調(diào)用例程的下載地址: http://csdngoodname008.51.net/tree.zip

*-------------------------------------------*



*  轉(zhuǎn)載請(qǐng)通知作者并注明出處,csdn歡迎您!   *



*  作者:盧培培(goodname008)              *



*  郵箱:[email protected]                *



*  專欄:http://blog.csdn.net/goodname008   *



*-------------------------------------------*

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 柘荣县| 迁安市| 鲁山县| 天长市| 巴东县| 敖汉旗| 屯昌县| 庐江县| 拉萨市| 潍坊市| 兴国县| 夏津县| 鹰潭市| 兴隆县| 萨迦县| 怀化市| 泰兴市| 广德县| 万宁市| 伽师县| 中超| 休宁县| 玉屏| 揭阳市| 永城市| 临泉县| 芒康县| 灵丘县| 怀化市| 汉沽区| 随州市| 明光市| 卢龙县| 洮南市| 三穗县| 博客| 临沂市| 汨罗市| 江油市| 措美县| 宜都市|