青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

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

將EXE程序的設置保存在EXE文件本身

Posted on 2009-10-25 16:54 S.l.e!ep.¢% 閱讀(599) 評論(0)  編輯 收藏 引用 所屬分類: VC
?

?因為是隨便一想就想出的方法,沒來得及用搜索引擎了解相關的情況,老神仙們見笑了。

??? 通常,程序把一些設置,配置保存在一個專門的文件中或者注冊表中,但在一些情況下,這樣非常不方便。比如偷OICQ號的那種程序(沒用過,也叫不上名來),提前設置好郵箱,然后放在別人機子上運行,通過某種方法取得OICQ密碼,最后把密碼發往指定信箱。把設置的郵箱保存在一個配置文件中一起放到別人機子上,就不如保存在執行文件本身中用起來方便。這只是舉個例子,在一些情況下,把配置,或者一些信息保存在可執行文件本身中是很有用處的。
??? 下面我通過一個例子,來講一種實現的方法,這種方法簡單易用。
??? 兩個程序,一個叫 SettingInMe ,一個叫 SetYou 。SettingInMe 讀取程序中的一個字符串,并把這個字符串的內容,用一個 MessageBox 顯示出來,SettingInMe 相當于讀取設置的程序,那個字符串就相當于我們的設置。SetYou 設置那個SettingInMe 中的字符串,相當于設置另一個程序中的設置或者參數。運行 SettingInMe 可以看到程序中原來的設置。退出 SettingInMe ,運行放在同一文件夾下的 SetYou 隨便輸入一些字符,然后退出 SetYou ,再運行 SettingInMe 看看,就會發現里面的設置被改了。
??? 大家可以先下載這兩個可執行文件試一下。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用來存放參數的空間長度,不要超過。

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

??? 申請了一個全局變量 MagicStr ,我們要把設置放在它的里面,SettingInMe 會使用這個全局變量中的內容做為設置。程序編譯之后,這個全局變量會在 EXE 文件中占相同的空間,只要設置程序 SetYou 能找到這個全局變量的在文件中的位置,然后寫入相應的內容,就可以達到我們的目的。由于全局變量在編譯好的 EXE 文件中也要占相同的空間,覆蓋其中的內容,只是改變了全局變量的值,并不會破壞可執行程序。在這里我們用這個全局變量的前55個字節的內容,做為搜索串,來標明這個全局變量在文件中的位置,這個搜索串之后的256個字節,用來存放設置。關于這個,后面將有更多的討論。
??? 下面看一下 SetYou 如何找到這個全局變量和設置它的內容,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!";
//字符串長度55,字符串的結束符1,共56字節

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;

//這種效率不好,不過比較直觀,
//如果一次讀入1024字節,然后在內存中進行比較...
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[]的長度不要超過256。
//在對話框中輸入的串要是超過256,
//GetDlgItemText() 會截取范圍內部分。
EndDialog(hwndDlg,TRUE);
break;
case IDCANCEL:
PostQuitMessage(0);
break;
}
break;
}
return 0;
}

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

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

下載SettingInMe和SetYou的源程序?
下載SettingInMe的可執行文件
下載SetYou的可執行文件



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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产精品高清久久久| 在线亚洲精品| 亚洲大片在线| 国产欧美一区二区三区国产幕精品| 免费欧美日韩国产三级电影| 一区二区三区成人精品| 日韩午夜在线播放| 亚洲精品久久久久久久久久久久久| 美女视频一区免费观看| 美女视频黄免费的久久| 最新高清无码专区| 一区二区三区四区五区在线 | 亚洲欧美综合v| 午夜亚洲一区| 麻豆成人在线观看| 亚洲青色在线| 午夜电影亚洲| 久热这里只精品99re8久| 蜜臀91精品一区二区三区| 欧美不卡视频一区发布| 欧美视频一区二区三区四区| 国产精品成人一区二区网站软件| 欧美午夜视频在线观看| 国产欧美一区二区三区沐欲| 国模精品一区二区三区| 亚洲剧情一区二区| 欧美在线999| 亚洲第一在线| 亚洲一区影音先锋| 久久久在线视频| 欧美网站大全在线观看| 狠狠色丁香久久婷婷综合_中| 亚洲黄色成人久久久| 亚洲一区不卡| 免费毛片一区二区三区久久久| 亚洲精品综合久久中文字幕| 午夜日韩在线观看| 欧美成人精品一区二区三区| 国产日韩精品久久| 一区二区三区av| 欧美va亚洲va日韩∨a综合色| 在线视频精品一| 欧美精品一区二区视频| 一区二区三区在线视频播放| 午夜精品999| 日韩一级在线| 欧美激情在线有限公司| 在线观看欧美日韩| 欧美一区三区三区高中清蜜桃| 亚洲精品一区二区三区蜜桃久| 久久国产乱子精品免费女| 国产精品白丝jk黑袜喷水| 亚洲免费av网站| 亚洲国产高清一区| 开元免费观看欧美电视剧网站| 国产日韩视频一区二区三区| 亚洲一区免费| 亚洲精品中文字幕女同| 欧美刺激性大交免费视频| 18成人免费观看视频| 久久亚洲春色中文字幕| 欧美亚洲在线视频| 99v久久综合狠狠综合久久| 麻豆成人精品| 久久精品91久久久久久再现| 国产精品夜色7777狼人 | 久久成人av少妇免费| 国产欧美精品日韩精品| 先锋资源久久| 午夜精品久久久久| 国产精品一区在线播放| 欧美一区二区三区在线观看| 亚洲欧美激情视频| 国产精品自拍一区| 久久都是精品| 久久久www成人免费无遮挡大片| 韩国av一区二区三区四区| 久久青青草原一区二区| 老司机精品导航| 亚洲九九九在线观看| 亚洲精品资源| 国产美女精品在线| 看片网站欧美日韩| 久久免费的精品国产v∧| 亚洲第一精品在线| 亚洲人成网站色ww在线| 欧美日韩一区二区免费视频| 亚洲一区二区精品在线| 午夜伦理片一区| 亚洲黄色免费| 正在播放欧美视频| 国内精品国语自产拍在线观看| 欧美成人精品在线观看| 欧美—级a级欧美特级ar全黄| 亚洲一区国产一区| 久久人人爽人人| 亚洲新中文字幕| 欧美中文字幕视频| 亚洲人成网在线播放| 亚洲天堂成人| 亚洲国产专区校园欧美| 亚洲一区二区精品在线观看| 一区二区三区在线视频观看| 一本色道久久综合| 激情综合五月天| 一区二区三区精品视频在线观看| 国户精品久久久久久久久久久不卡 | 蜜桃av一区二区三区| 亚洲一区二区在线观看视频| 久久成人18免费观看| 亚洲一区二区三区免费视频| 久久精品夜色噜噜亚洲a∨| 亚洲精品少妇30p| 性色一区二区三区| 在线亚洲国产精品网站| 久久精品一区四区| 亚洲午夜一区二区| 欧美成人影音| 久久精品99无色码中文字幕| 日韩视频国产视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲日本激情| 亚洲老板91色精品久久| 日韩一区二区精品视频| 亚洲人线精品午夜| 亚洲乱码一区二区| 亚洲老板91色精品久久| 最新日韩在线视频| 亚洲视频在线播放| 午夜精品久久久久久久99水蜜桃| 亚洲视频一二区| 欧美在线视频不卡| 欧美黄色影院| 亚洲在线1234| 麻豆精品网站| 国产视频一区二区在线观看 | 嫩草国产精品入口| 欧美日韩亚洲三区| 一区二区三区在线免费观看| 亚洲视频电影图片偷拍一区| 欧美一区二区三区精品| 亚洲国产精品va在看黑人| 亚洲一级片在线看| 美女脱光内衣内裤视频久久影院| 欧美激情一区二区三区成人| 国产日韩欧美一区二区三区四区| 亚洲欧洲精品一区二区三区不卡 | 亚洲午夜久久久| 欧美在线电影| 亚洲综合精品四区| 欧美高清视频在线播放| 国产一区二区三区免费不卡| 中文国产成人精品| 欧美激情a∨在线视频播放| 一本高清dvd不卡在线观看| 欧美一级免费视频| 亚洲一区3d动漫同人无遮挡| 欧美日韩精品国产| 99re8这里有精品热视频免费| 欧美激情性爽国产精品17p| 性欧美长视频| 在线播放视频一区| 亚洲成色777777女色窝| 美日韩丰满少妇在线观看| 原创国产精品91| 美女日韩欧美| 欧美精品综合| 欧美在线免费看| 久久精品国产一区二区电影| 在线观看视频免费一区二区三区| 美国成人毛片| 欧美精品久久天天躁| 亚洲校园激情| 欧美大成色www永久网站婷| 一区二区激情小说| 欧美一区二区日韩| 99国内精品久久| 亚洲欧美日本日韩| 亚洲靠逼com| 久久精品国产一区二区三区| 在线视频欧美精品| 久久人人97超碰精品888 | 国产精品av免费在线观看| 欧美福利视频一区| 欧美在线观看视频一区二区| 久久夜色精品国产噜噜av| 亚洲一区二区成人| 欧美国产精品久久| 女人天堂亚洲aⅴ在线观看| 国产精品你懂的在线欣赏| 亚洲国产裸拍裸体视频在线观看乱了中文 | 午夜视频在线观看一区| 欧美激情第五页| 欧美主播一区二区三区美女 久久精品人| 六月丁香综合| 欧美成人一区二区在线| 国产亚洲高清视频| 影音先锋久久久| 久久美女艺术照精彩视频福利播放| 99re6这里只有精品视频在线观看 99re6这里只有精品 |