VC 遠端注入動態庫的實現(6 2)

2021-08-05 23:38:40 字數 2817 閱讀 1386

顯示當前程序的基本原理是獲取當前程序的「快照

」,之後遍歷快照中的所有程序,並把程序名稱在

ccombobox

中顯示出來。

為注入程式對應的對話方塊類新增名為showprocesses()函式,該函式完成顯示當前程序的功能。

在showprocesses()函式中,呼叫

createtoolhelp32snapshot()

函式實現獲取當前程序「快照」的功能。該函式可以獲取程序、堆、模組和執行緒的快照。

handle winapi createtoolhelp32snapshot(

dword dwflags,

dword th32processid

createtoolhelp32snapshot()函式的第乙個引數指定了要獲取誰的快照;第二個引數指定了包含在快照中的程序

id,如果要獲取的是堆或者模組的快照,該引數則指定了堆或者模組所在的程序

id,如果要獲取的是程序的快照,則可以忽略該引數。函式的返回值是快照的控制代碼。 0

。hsnapshot

是獲取到的程序快照控制代碼。

通過process32first()函式和

process32next()

函式遍歷快照中的程序,並且把程序的資訊儲存到

processentry32

結構的物件中。

process32first()函式的作用是在程序快照中找到第乙個程序;

process32next()

函式的作用是在程序快照中找到下乙個程序。

bool winapi process32first(

_in_    handle           hsnapshot,

_inout_ lpprocessentry32 lppe

bool winapi process32next(

_in_  handle           hsnapshot,

_out_ lpprocessentry32 lppe

其中,第乙個引數是程序快照的控制代碼;第二個引數是processentry32結構的指標,用來儲存找到的程序資訊。

遍歷快照中的程序並顯示的**如下所示:

processentry32 pe32;

pe32.dwsize = sizeof(processentry32);

int index = 0;

process32first(hsnapshot, &pe32);do

m_processesname.insertstring(index, pe32.szexefile);

index++;

} while (process32next(hsnapshot, &pe32));

其中,pe32是

processentry32

結構的物件,在使用該結構的物件時,必須首先結構中表示結構大小的成員變數

dwsize

進行賦值;通過

process32first()

函式獲取快照中的第乙個程序,

hsnapshot

是在「3.2.1

獲取當前程序「快照」」中得到的快照控制代碼;通過

do...while

語句遍歷「快照」中的所有程序,並且把程序的資訊儲存在

pe32

中;m_processesname

是圖3-1

中組合框控制項的變數,新增該變數的方法為在

vs2015

的「資源編輯器」中選中

ccombobox

組合框控制項,之後在右鍵選單中選擇「新增變數」,接下來在「新增成員變數嚮導」對話方塊中將「類別」設定為「

control

」,「變數名」設定為「

m_processesname

」,如圖

3-2所示。

圖3-2 為組合框控制項新增變數

在do...while語句中,通過

m_processesname

呼叫ccombobox

類的成員函式

insertstring()

將在「快照」中獲取到的程序資訊pe32.szexefile「插入」到組合框的下拉列表中,ccombobox::insertstring()函式的第乙個引數表示插入內容在組合框下拉列表中的索引,第二個引數表示插入的內容。

在遍歷了「快照」中的所有程序之後,需要將「快照」控制代碼關閉。

closehandle(hsnapshot);

3.2.4 設定控制項初始顯示的內容

(1)設定組合框初始顯示的內容

m_processesname.setcursel(0);

其中,ccombobox::setcursel()函式的作用是設定組合框控制項的顯示內容,其函式為組合框列表中顯示內容的索引,

0表示在組合框中顯示其列表框中第乙個內容。

(2)設定編輯框初始顯示的內容

在圖3-1中,

編輯框控制項cedit用於輸入要注入的動態庫名稱。在編寫的程式中,要注入的動態庫名稱是「

mfc_extent_dll_test.dll

」,因此將該控制項初始顯示的內容設定為動態庫的名稱。

m_dllname.setwindowtextw(_t("mfc_extent_dll_test.dll"));

其中,m_dllname是編輯框控制項

cedit

對應的變數,新增的方法如「3.2.2遍歷程序並顯示」中介紹的方法。通過m_dllname

呼叫cedit::setwindowtextw()

函式設定其初始顯示的內容。

vc 關於動態庫的哪些知識

專案開發都是分模組的,所以常常需要些個動態庫方便別人呼叫。這兩天因為專案整合,因為是組長負責整合我只需要跟進就可以,模組有問題需要及時調整的。所以上班的時候有零碎的時間。就看看公司的一些 然後有感而發,就把動多型庫的知識看了一下。下面是一些心得 都是從乙個文章摘抄的一些東西,pdf我會上傳的 1.靜...

如何優雅實現屬性的動態注入

這是在實際開發專案中遇到的乙個問題。從資料庫查詢返回的 list map string,object 的集合。並且返回的列名是中文的,專案也沒有使用mybatis 直接使用的jdbctemplate.並且欄位還超級多,這樣將資料轉換的時候如果乙個乙個的注入就會讓 臭長臭長的,所以才有了動態注入。我這...

vc 簡單的vector動態陣列實現

1 ifndef myvector 2 define myvector 3 include 4 define success 1 成功 5 define errors 1 失敗 6 define malloc error 2 申請記憶體失敗 7 define index error 3 錯誤的索引號...