• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
            簡(jiǎn)單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
            ?

            ?因?yàn)槭请S便一想就想出的方法,沒(méi)來(lái)得及用搜索引擎了解相關(guān)的情況,老神仙們見笑了。

            ??? 通常,程序把一些設(shè)置,配置保存在一個(gè)專門的文件中或者注冊(cè)表中,但在一些情況下,這樣非常不方便。比如偷OICQ號(hào)的那種程序(沒(méi)用過(guò),也叫不上名來(lái)),提前設(shè)置好郵箱,然后放在別人機(jī)子上運(yùn)行,通過(guò)某種方法取得OICQ密碼,最后把密碼發(fā)往指定信箱。把設(shè)置的郵箱保存在一個(gè)配置文件中一起放到別人機(jī)子上,就不如保存在執(zhí)行文件本身中用起來(lái)方便。這只是舉個(gè)例子,在一些情況下,把配置,或者一些信息保存在可執(zhí)行文件本身中是很有用處的。
            ??? 下面我通過(guò)一個(gè)例子,來(lái)講一種實(shí)現(xiàn)的方法,這種方法簡(jiǎn)單易用。
            ??? 兩個(gè)程序,一個(gè)叫 SettingInMe ,一個(gè)叫 SetYou 。SettingInMe 讀取程序中的一個(gè)字符串,并把這個(gè)字符串的內(nèi)容,用一個(gè) MessageBox 顯示出來(lái),SettingInMe 相當(dāng)于讀取設(shè)置的程序,那個(gè)字符串就相當(dāng)于我們的設(shè)置。SetYou 設(shè)置那個(gè)SettingInMe 中的字符串,相當(dāng)于設(shè)置另一個(gè)程序中的設(shè)置或者參數(shù)。運(yùn)行 SettingInMe 可以看到程序中原來(lái)的設(shè)置。退出 SettingInMe ,運(yùn)行放在同一文件夾下的 SetYou 隨便輸入一些字符,然后退出 SetYou ,再運(yùn)行 SettingInMe 看看,就會(huì)發(fā)現(xiàn)里面的設(shè)置被改了。
            ??? 大家可以先下載這兩個(gè)可執(zhí)行文件試一下。SettingInMe.exeSetYou.exe
            ??? 首先看一下 SettingInMe 的源程序。

            SettingInMe
            ___________________________________________________________________
            #include <windows.h>
            #include <stdio.h>
            #define cbMatchStr 55 //strlen("I'm JIURL,My HomePage is http://jiurl.yeah.net. Salute!")

            char MagicStr[cbMatchStr+256]="I'm JIURL,My HomePage is http://jiurl.yeah.net. Salute!http://jiurl.yeah.net\n\nhttp://jiurl.nease.net\n\njiurl@mail.china.com";
            //256用來(lái)存放參數(shù)的空間長(zhǎng)度,不要超過(guò)。

            int APIENTRY WinMain(HINSTANCE hInstance,
            HINSTANCE hPrevInstance,
            LPSTR lpCmdLine,
            int nCmdShow)
            {
            char* lpText = MagicStr+cbMatchStr;
            MessageBox(NULL,lpText,"Yes!",NULL);
            return 0;
            }

            ??? 申請(qǐng)了一個(gè)全局變量 MagicStr ,我們要把設(shè)置放在它的里面,SettingInMe 會(huì)使用這個(gè)全局變量中的內(nèi)容做為設(shè)置。程序編譯之后,這個(gè)全局變量會(huì)在 EXE 文件中占相同的空間,只要設(shè)置程序 SetYou 能找到這個(gè)全局變量的在文件中的位置,然后寫入相應(yīng)的內(nèi)容,就可以達(dá)到我們的目的。由于全局變量在編譯好的 EXE 文件中也要占相同的空間,覆蓋其中的內(nèi)容,只是改變了全局變量的值,并不會(huì)破壞可執(zhí)行程序。在這里我們用這個(gè)全局變量的前55個(gè)字節(jié)的內(nèi)容,做為搜索串,來(lái)標(biāo)明這個(gè)全局變量在文件中的位置,這個(gè)搜索串之后的256個(gè)字節(jié),用來(lái)存放設(shè)置。關(guān)于這個(gè),后面將有更多的討論。
            ??? 下面看一下 SetYou 如何找到這個(gè)全局變量和設(shè)置它的內(nèi)容,SetYou 的源程序。

            SetYou
            ___________________________________________________________________
            #include <windows.h>
            #include <stdio.h>
            #include "resource.h"

            INT_PTR CALLBACK DialogProc(HWND,UINT,WPARAM,LPARAM);
            char SetStr[256];

            #define cbMatchStr 55//strlen("I'm JIURL,My HomePage is http://jiurl.yeah.net. Salute!")

            int APIENTRY WinMain(HINSTANCE hInstance,
            HINSTANCE hPrevInstance,
            LPSTR lpCmdLine,
            int nCmdShow)
            {
            HANDLE hFile;
            char Err[256];
            char MatchStr[cbMatchStr+1]="I'm JIURL,My HomePage is http://jiurl.yeah.net. Salute!";
            //字符串長(zhǎng)度55,字符串的結(jié)束符1,共56字節(jié)

            hFile = CreateFile("SettingInMe.exe",GENERIC_WRITE|GENERIC_READ,0,
            NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
            //SettingInMe.exe 和 本程序要在同一目錄下
            if(hFile==INVALID_HANDLE_VALUE)
            {
            sprintf(Err,"CreatFile Error: 0x%08x !",GetLastError());
            MessageBox(NULL,Err,"CoNgRaTuLaTiOn!",NULL);
            return 0;
            }

            char Data;
            DWORD nRead;
            int retval;
            int i=0;

            //這種效率不好,不過(guò)比較直觀,
            //如果一次讀入1024字節(jié),然后在內(nèi)存中進(jìn)行比較...
            while(1)
            {
            retval = ReadFile(hFile,&Data,1,&nRead,NULL);
            if(retval==0||nRead==0)
            {
            MessageBox(NULL,"Not Found Place to Set","CoNgRaTuLaTiOn!",NULL);
            break;
            }

            if(Data==MatchStr[i])i++;
            else i=0;

            if(i==cbMatchStr)
            {
            DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, (DLGPROC)DialogProc);

            retval = WriteFile(hFile,SetStr,strlen(SetStr),
            &nRead,NULL);
            if(retval!=0)
            MessageBox(NULL,"Set OK!","Yes!",NULL);
            else
            {
            sprintf(Err,"WriteFile Error: 0x%08x !",GetLastError());
            MessageBox(NULL,Err,"CoNgRaTuLaTiOn!",NULL);
            }
            break;
            }
            }

            MessageBox(NULL,"OVER","OVER",NULL);

            CloseHandle(hFile);
            return 0;
            }

            INT_PTR CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,
            WPARAM wParam,LPARAM lParam)
            {?
            switch(uMsg)
            {
            case WM_COMMAND:
            switch(wParam)
            {
            case IDOK:
            GetDlgItemText(hwndDlg,IDC_IN,SetStr,sizeof(SetStr));
            //SetStr[]的長(zhǎng)度不要超過(guò)256。
            //在對(duì)話框中輸入的串要是超過(guò)256,
            //GetDlgItemText() 會(huì)截取范圍內(nèi)部分。
            EndDialog(hwndDlg,TRUE);
            break;
            case IDCANCEL:
            PostQuitMessage(0);
            break;
            }
            break;
            }
            return 0;
            }

            ??? SetYou 首先用 CreateFile 打開相同文件夾下的 SettingInMe.exe 然后開始一個(gè)字節(jié)一個(gè)字節(jié)的讀文件中的內(nèi)容,每讀一個(gè)字節(jié),就把這個(gè)字節(jié)和用來(lái)標(biāo)明全局變量位置的那個(gè)全局變量開始處的字符串進(jìn)行比較,如此一直讀到文件結(jié)束。讀到一個(gè)字節(jié),比較是否和標(biāo)志串中第i個(gè)(最開始是0)相同,相同的話,就把i++;接著讀和比較(再比較就是標(biāo)志串中的第二個(gè)字節(jié)了),又相同,又i++,又...直到一部分相同之后,有一個(gè)不同,把i重新設(shè)為0,然后接著讀文件,向后尋找。或者所讀內(nèi)容和整個(gè)標(biāo)志串都相同,我們找到了要找的那個(gè)全局變量。找到全局變量之后,我們可以用 WriteFile 來(lái)改變這個(gè)全局變量中的內(nèi)容。在 SetYou 這個(gè)程序中,會(huì)彈出一個(gè)對(duì)話框,來(lái)取得輸入串。在 SetYou 中 WriteFile(hFile,SetStr,strlen(SetStr)),最后那個(gè)參數(shù)是個(gè)strlen,也就是說(shuō)只會(huì)覆蓋設(shè)置串中前面的部分。如果這里的參數(shù)是256(也就是sizeof(SetStr))的話,就會(huì)覆蓋整個(gè)設(shè)置。

            ??? 這樣,我們?cè)谝粋€(gè)程序中靜態(tài)申請(qǐng)一個(gè)全局變量,來(lái)在EXE文件中保留一定的空間,來(lái)作為保存設(shè)置,配置,參數(shù),信息的空間。并在這個(gè)空間的開始處放一個(gè)標(biāo)志串,用來(lái)查找。另一個(gè)程序,查找那個(gè)標(biāo)志串,找到這個(gè)全局變量的空間,對(duì)其相應(yīng)位置進(jìn)行設(shè)置,就實(shí)現(xiàn)了將EXE程序的設(shè)置保存在EXE文件本身。
            ??? 需要說(shuō)明的是,程序一旦編譯之后,EXE文件中的內(nèi)容就固定了,所以文件中要不然有其他地方和標(biāo)志串一樣,要不然沒(méi)有其他地方和標(biāo)志串一樣。如果有地方和標(biāo)志串內(nèi)容一樣的話,只要換個(gè)標(biāo)志串就可以了。只要標(biāo)志串有一定長(zhǎng)度,要和其他內(nèi)容不一樣是很容易的。更進(jìn)一步說(shuō),編譯之后,EXE文件內(nèi)容固定,全局變量在EXE文件中的位置也是固定的,只要能找到這個(gè)位置,是沒(méi)有必要有一個(gè)標(biāo)志串的,本文例子用標(biāo)志串,只是為了便于說(shuō)明和理解。
            ??? 最后總結(jié)一下,程序中靜態(tài)申請(qǐng)一塊全局空間,使用這個(gè)空間中的內(nèi)容作為參數(shù),設(shè)置,配置或者某些信息。在編譯生成的EXE文件中就相應(yīng)的也存在相同大小的一個(gè)空間。在另一個(gè)程序中打開這個(gè)程序的EXE文件,用某種方法找到這塊空間在EXE文件中的位置,就可以進(jìn)行設(shè)置。
            ??? 唉,這篇文章寫的真爛啊,大家湊合看吧。本來(lái)還說(shuō)拿它得個(gè)諾貝爾文學(xué)獎(jiǎng)玩玩,看來(lái)也沒(méi)戲了。

            下載SettingInMe和SetYou的源程序?
            下載SettingInMe的可執(zhí)行文件
            下載SetYou的可執(zhí)行文件



            Trackback: http://tb.donews.net/TrackBack.aspx?PostId=1044749

            国产成人精品综合久久久| 国产免费久久精品99久久| 日产久久强奸免费的看| 久久精品国产一区二区| 欧美亚洲国产精品久久| 色偷偷偷久久伊人大杳蕉| 好久久免费视频高清| 久久久久久A亚洲欧洲AV冫| 亚洲午夜精品久久久久久app| 精品久久久中文字幕人妻| 久久久久久久99精品免费观看| 久久国产视频网| 99久久婷婷国产综合亚洲| 性欧美大战久久久久久久| 狠狠色丁香婷婷综合久久来| 伊人色综合久久天天人守人婷| 丁香五月网久久综合| 久久青青草视频| 日本精品久久久久久久久免费| 国产亚洲色婷婷久久99精品| 亚洲乱码日产精品a级毛片久久| 国产精品视频久久| 久久精品国产第一区二区三区| 热99RE久久精品这里都是精品免费| 久久99精品国产麻豆宅宅| 浪潮AV色综合久久天堂| 久久精品一本到99热免费| 久久久久国产亚洲AV麻豆| 国产99久久久国产精品~~牛| 久久久久亚洲av无码专区喷水| 色偷偷88欧美精品久久久| 久久久久久国产精品美女 | 国产午夜精品久久久久九九| 日韩久久久久久中文人妻| 亚洲国产精品无码久久久蜜芽 | 91精品日韩人妻无码久久不卡 | 久久亚洲精品成人无码网站| 欧美激情精品久久久久久久九九九| 一本伊大人香蕉久久网手机| 久久亚洲欧美日本精品| 99久久精品费精品国产|