終於用VC MFC做了乙個真正的程式

2021-04-01 01:19:52 字數 3116 閱讀 8338

花了兩天多的時間做了乙個「信使服務」程式,呵呵,以前在網上見到過,居然要花錢註冊的。其實就是用了那個***messagebuffersend函式,再用乙個***messagenameadd函式把隨便乙個名字加進去,就可以把自己的身份隱藏了。以前在學校的時候由於用的是固定ip,經常收到的很多廣告就是用這種方式傳送的。有時候在課堂上老師正在講課,突然就冒出這麼乙個視窗來,十分氣人,所以我們一般都把messenger服務給遮蔽掉,嘿嘿,現在我居然做起這個東西來。

通過命令列方式用*** send命令就可以發這種訊息,不過會暴露你的計算機名,因為它沒有選擇名字的引數,而使用***messagebuffersend則可以使用你計算機上的任意乙個「名字」,那個名字又叫「訊息別名」,似乎跟計算機名不一樣,但是預設的「訊息別名」就是計算機名。開始的時候以為可以隨便給***messagebuffersend的from引數賦值,網上很多人也這樣說,但我試了總是出錯。後來才發現那個名字必須是計算機上已經有的「訊息別名」之一。那我怎麼才能隨便用乙個名字呢?於是就必須用到***messagenameadd函式,這個函式可以增加乙個隨便起的訊息別名,接著就可以把這個名字傳給***messagebuffersend來傳送了。

***messagebuffersend的原型是:

***_api_status***messagebuffersend(

lpcwstrservername,

lpcwstrmsgname,

lpcwstrfromname,

lpbytebuf,

dwordbuflen

);

開始的時候以為第乙個引數servername就是目標的名字,後來才知道原來是要執行這個函式的伺服器的名字,因為這個函式一般用於區域網管理,有時候需要控制某台伺服器來執行程式。如果在本機上執行,把這個引數設成null就可以了。以***開頭的很多函式都有這個引數。

第二個引數msgname,在網上看到很多人說這個就是指向要發的訊息字串的指標,跟第4個引數buf是一樣的。我試了很錯次都是失敗的。後來在某個地方看到乙個牛人的解釋才知道這個msgname的意思根本就不是「訊息字串的名字」,而是目標機器的「訊息別名」!一般就是目標的計算機名了,如果那台計算機還有其他訊息別名的話,這個也可以是其中乙個,不過發訊息的那台機器也要知道該別名指的是那台計算機才行。

第三個引數最折騰人了,總以為隨便起乙個名字就可以了,後來跟蹤了錯誤資訊,說沒有找到這個名字,想起以前用*** send玩的時候還用過乙個*** name,通過*** name *** /add就可以增加乙個名字***,然後用*** send 就可以給***發訊息了。既然說沒找到這個名字,是不是那個名字還沒通過*** name來加進去呢?於是我就用了最古老的一種方法,通過system()函式執行*** name命令,把隨意輸入的名字加進去,再用那個名字發訊息,哈哈,成功了。不過要彈出那個黑黑的cmd 視窗比較難看。再到msdn看看,有個***nameadd函式,正好可以幹這種事情,呵呵,搞定。

lpcwstr與lpbyte也比較難受。lpcwstr的意思是「常量寬字串」,因為***系列函式使用的都是unicode。那怎麼把cstring轉換成這個東西呢?cstring本身可以被看作lpctstr,即「常量t字串」,呵呵,t字元就是那種「騎牆」字元,你定義了_unicode,它就表示w,寬字元,沒有定義_unicode,它就表示一般的8位元字元,為了同時相容ascii版本和unicode版本,定義字串的時候最好都用t字元。那怎麼把cstring轉換成寬字串呢?在網上看到有人說用一些巨集就可以了。那些巨集是在atlconv.h裡面定義的,包括:

atl string conversion macros

a2bstrole2at2aw2a

a2coleole2bstrt2bstrw2bstr

a2ctole2cat2caw2ca

a2cwole2ctt2colew2cole

a2oleole2cwt2cww2ct

a2tole2tt2olew2ole

a2wole2wt2ww2t

uses_conversion;

然後就可以很方便地在這些型別之間轉換了。例如要把cstring str轉換成lpcwstr lpw,只要:

#include

uses_conversion;

lpcwstr lpw=t2w(str);

這樣,前三個引數就可以搞定了。

第四個引數是lpbyte,這又是一種奇怪的型別,從字面上看是指向byte型別的指標。在c裡面是沒有byte型別的,跟它最象的就是unsigned char型別了,實際上就是它。那怎麼把cstring轉換成這個呢?首先,要把cstring轉換成lpcwstr,因為***用的都是unicode,裡面的字串編碼必須是unicode;接著,由於lpcwstr的每個字元是16bit,不符合lpbyte的要求,所以還必須強制轉換成lpbyte。這樣,可以寫成:

lpbyte=(lpbyte)t2w(cstring);

不過還是分步轉換好一點:

lpcwstr=t2w(cstring);

lpbyte=(lpbyte)lpcwstr;

因為後面乙個引數buflen要用到lpcwstr的長度。buflen是以位元組來計算的buf的長度,通過wcslen(lpcwstr)可以得到lpcwstr的字元個數,然後每個字元的長度是sizeof(wchar_t)位元組,那麼lpcwstr的長度就是wcslen(lpcwstr)*sizeof(wchar_t)位元組。

我想用cstring的getlength()函式來做,但是總是失敗,不知道為什麼。cstring.getlength()*sizeof(tchar)總是長度不夠,後面有乙個或幾個字元截斷了。

到這裡,輸入的東西就搞定了,搞定了這個,後面的**、區域網計算機列表就問題不大了。下次再把心得寫出來

用三年做了乙個夢

在醒來的那個瞬間,才知道這一切都只是乙個美夢,只是這個夢太幸福了,讓我捨不得清醒。用三年做了乙個夢,已經幸福得夠久了,該睜開眼睛面對現實了。在那一千多天裡,每一分每一秒都是那麼的幸福,即使偶爾會有不愉快的時候,也會很快過去。這是我一直盼望的生活,期待著生命中的每一天都能如此度過,我願意用一切來交換,...

用WPF 做了乙個簡單的太陽系

這次主要的目的是為了學習它的3d動畫方法,只用了xaml,沒有寫 先是上網查了查行星資料,做了8個大行星和乙個月亮在裡面,不過發現如果真的按實際比例畫的話,太不容易 了,就比如太陽半徑 是地球的109倍,距離更大,近25000倍,在圖上會除了太陽其他都像畫素點那麼小,於是只好把距離按10mkm作為乙...

做了乙個奇怪的夢

中秋的早上,睡夢中,鬧鐘訂的是7點。模糊中做夢了,居然回到初中的教室了,然後英語老師 劉平 抽查我英語知識,先問了我個介詞的什麼東西,沒答上來,後來問了個be動詞的東西。這個我會,高興死了,剛說了幾句他就說知道了。你坐下吧。英語是學了又放了,沒有堅持下來。所以挺杯具的,雖然看英語文件沒什麼問題,但口...