• <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>

            runsisi

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              45 隨筆 :: 15 文章 :: 26 評(píng)論 :: 0 Trackbacks

            #

             

            網(wǎng)上關(guān)于MFC規(guī)則DLL的創(chuàng)建和使用的資料比較多,其實(shí)也就那兩三篇轉(zhuǎn)過(guò)來(lái)轉(zhuǎn)過(guò)去:)
            但是好像都只是用自己寫(xiě)的MFC主程序調(diào)用MFC DLL,涉及到DLL的資源問(wèn)題時(shí)都會(huì)提及三種解決方法:
            1)    AFX_MANAGE_STATE(AfxGetStaticModuleState());
            2)    AfxGetResourceHandle(); 
            AfxSetResourceHandle();
            3)    在主程序中使用方法2;
            如果是自己寫(xiě)的MFC主程序自然三種方法都可以,但是如果不是這種情況呢
            ?比如:
            1)    主程序是SDK寫(xiě)的,然后調(diào)用MFC DLL
            2)    主程序根本就不是我們自己寫(xiě)的,MFC DLL只是作為一個(gè)HOOK DLL注入主程序中
            3)    主程序是用其他GUI庫(kù)寫(xiě)的
            在這幾種情況下上述的2)、
            3)兩種方法是無(wú)法使用的,想想為什么?
            只有方法1)可行,當(dāng)然我們也可以使用如下的方法:
            _AFX_THREAD_STATE
            * pThreadState = AfxGetThreadState();
            AFX_MODULE_STATE
            * pOldModState = pThreadState->m_pModuleState;
            //Ur code here?
            pThreadState->m_pModuleState = pOldModState;
            為什么使用MFC DLL
            ? 呵呵。
            有的文章里有這樣一段話:
            AFX_MANAGE_STATE(AfxGetStaticModuleState());的方法只能等函數(shù)的作用空間結(jié)束之后才恢復(fù)資源句柄。由于可執(zhí)行文件必須重畫(huà)工具條等原因,因此建議只要有可能就必須恢復(fù)資源句柄,否則可能會(huì)遇到許多問(wèn)題。比如說(shuō),如果用戶移動(dòng)DLL的對(duì)話框,而此時(shí)資源句柄仍然為DLL的資源,那么程序就會(huì)崩潰。最好的恢復(fù)句柄的時(shí)機(jī)在對(duì)話框響應(yīng)WM_INITDIALOG消息的時(shí)候,因?yàn)檫@時(shí)對(duì)話框的模板等已經(jīng)讀出了。
            不知道這段話的結(jié)論是怎樣得出來(lái)的,而所謂的恢復(fù)句柄的方法我也不知道他是怎么恢復(fù)的。實(shí)際測(cè)試的結(jié)果是根本不需要考慮這個(gè),即使是單線程主程序,MFC DLL在主程序的主線程內(nèi)執(zhí)行;如果MFC DLL是在單獨(dú)的一個(gè)線程內(nèi)執(zhí)行,則更加不需要考慮這個(gè)問(wèn)題;如果主程序是SDK程序則根本不需要考慮這個(gè)問(wèn)題,因?yàn)镾DK程序都是直接操作句柄的。
            如果覺(jué)得有錯(cuò)那就使用我提供的另外一種方法,或者使用花括號(hào)吧,呵呵。

            runsisi@HUST
            posted @ 2010-09-17 18:41 runsisi 閱讀(381) | 評(píng)論 (0)編輯 收藏

            n久沒(méi)有寫(xiě)過(guò)了,轉(zhuǎn)載一篇,呵呵。不喜歡轉(zhuǎn)載,但這篇文章確實(shí)還不錯(cuò),只是不知道為什么找不到原文出處。
            以下為轉(zhuǎn)載全文。修改了一些細(xì)節(jié)。對(duì)cppblog崩潰了,這是啥所見(jiàn)即所得排版啊,唉,暈倒。

            這幾天寫(xiě)的程序應(yīng)用到多繼承。

            以前對(duì)多繼承的概念非常清晰,可是很久沒(méi)用就有點(diǎn)模糊了。重新研究一下,刷新下記憶。

            假設(shè)我們有下面的代碼:

            #include <stdio.h>

            class A
            {
            private:
               char data;
            public:
               A(){data = 'A';}
               virtual void Show(){printf("A\n");};
               virtual void DispA(){printf("a\n");};
            };

            class B
            {
            private:
               int data;
            public:
               B(){data = 'B';}
               virtual void Show(){printf("B\n");};
               virtual void DispB(){printf("b\n");};
            };

            class C
            {
            private:
               char data;
            public:
               C(){data = 'C';}
               virtual void Show(){printf("C\n");};
               virtual void DispC(){printf("c\n");};
            };

            class D : public A, public B, public C
            {
            public:
               char data;
            public:
               D(){data = 'D';}
               virtual void Show(){printf("D\n");};
               virtual void DispD(){printf("d\n");};
            };

            class E : public D
            {
            private:
               char data;
            public:
               E(){data = 'E';}
               virtual void Show(){printf("E\n");};
               virtual void DispE(){printf("e\n");};
            };

            int main()
            {
               D *d = new D;
               A *a = (A*)d;
               B *b = (B*)d;
               C *c = (C*)d;;

               d->Show();
               a->Show();
               b->Show();

               a->DispA();
               b->DispB();
               d->DispD();

               D *d1 = (D*)a;
               d1->Show();
               d1->DispD();
               D *d2 = (D*)b;
               d2->Show();
               d2->DispD();

               char x = d->data;
               return 0;
            }

            每個(gè)類(lèi)都有兩個(gè)虛擬函數(shù)Show()DispX()。類(lèi)A,B,C是基本類(lèi),而D是多繼承,最后E又繼承了D。那么對(duì)于類(lèi)E,它的內(nèi)存映像是怎樣的呢?為了解答這個(gè)問(wèn)題,我們回顧一下基本類(lèi)的內(nèi)存映像:

            + --------------+ <- this
            +    VTAB       +
            + --------------+
            +               +
            +    Data       +
            +               +
            + --------------+

            如果一個(gè)類(lèi)有虛擬函數(shù),那么它就有虛函數(shù)表(VTAB)。類(lèi)的第一個(gè)單元是一個(gè)指針,指向這個(gè)虛函數(shù)表。如果類(lèi)沒(méi)有虛函數(shù),并且它的祖先(所有父類(lèi))均沒(méi)有虛函數(shù),那么它的內(nèi)存映像和C的結(jié)構(gòu)一樣。所謂虛函數(shù)表就是一個(gè)數(shù)組,每個(gè)單元指向一個(gè)虛函數(shù)地址。
            如果類(lèi)Y是類(lèi)X的一個(gè)繼承,那么類(lèi)Y的內(nèi)存映像如下:

            + --------------+ <- this
            +   Y
            VTAB   +
            + --------------+
            +               +
            +   X
            Data   +
            +               +
            + --------------+
            +               +
            +   Y
            Data   +
            +               +
            + --------------+
            Y
            的虛函數(shù)表基本和X的相似。如果Y有新的虛函數(shù),那么就在VTAB的末尾加上一個(gè)。如果Y重新定義了原有的虛函數(shù),那么原的指針指向新的函數(shù)入口。這樣無(wú)論是內(nèi)存印象和虛函數(shù)表,Y都和X兼容。這樣當(dāng)執(zhí)行 X* x = (Y*)y;之后,x可以很好的被運(yùn)用,并且可以享受新的虛擬函數(shù)。

            現(xiàn)在看多重繼承:
            class D : public A, public B, public C
            {
               ....
            }
            它的內(nèi)存映像如下
            :  
            + --+ -----------------+ 00H <- this
            +   +    D
            VTAB     +
            + A + -----------------+ 04H
            +   +    A
            的 數(shù)據(jù)
                 +
            + --+ -----------------+ 08H
            +   +    B
            VTAB'    +
            + B + -----------------+ 0CH
            +   +    B
            的 數(shù)據(jù)
                 +
            + --+ -----------------+ 10H
            +   +    C
            VTAB'    +
            + C + -----------------+ 14H
            +   +    C
            的 數(shù)據(jù)
                 +
            + --+ -----------------+ 18H
            + D +    D
            的 數(shù)據(jù)
                 +
            + --+ -----------------+
            (因?yàn)閷?duì)齊于雙字,A~D的數(shù)據(jù)雖然只是一個(gè)char,但需要對(duì)齊到DWORD,所以占4字節(jié))

            對(duì)于A,它和單繼承沒(méi)有什么兩樣。BC被簡(jiǎn)單地放在A的后面。如果它們虛函數(shù)在D中被重新定義過(guò)(比如Show函數(shù)),那么它們需要使用新的VTAB,使被重定義的虛函數(shù)指到正確的位置上(這對(duì)于COM或類(lèi)似的技術(shù)是至關(guān)重要的)。最后,D的數(shù)據(jù)被放置到最后面。
            對(duì)于E的內(nèi)存映像問(wèn)題就可以不說(shuō)自明了。

            下面我們看一下C++是如何處理
               D *d;
               ......
               B *b = (B*)d;
            這樣的要求的。設(shè)置斷點(diǎn),進(jìn)入反匯編,你可以看到如下的匯編代碼:

            B *b = (B*)d;
            00401062  cmp         dword ptr [d],0
            00401066  je          main+73h (401073h)
            00401068  mov         eax,dword ptr [d]
            0040106B  add         eax,8
            0040106E  mov         dword ptr [ebp-38h],eax
            00401071  jmp         main+7Ah (40107Ah)
            00401073  mov         dword ptr [ebp-38h],0
            0040107A  mov         ecx,dword ptr [ebp-38h]
            0040107D  mov         dword ptr [b],ecx
            從上述匯編代碼可以看出:如果源(這里是d)是NULL,那么目標(biāo)(這里是b)也將被置為NULL,否則目標(biāo)將指向源的地址并向下偏移8個(gè)字節(jié),正好就是上圖所示BVTAB位置。至于為什么要用ebp-38h作緩存,這是編譯器的算法問(wèn)題了。等以后有時(shí)間再研究。

            接下來(lái)看一個(gè)比較古怪的問(wèn)題,這個(gè)也是我寫(xiě)這篇文章的初衷:
            根據(jù)上面的多繼承定義,如果給出一個(gè)類(lèi)B的實(shí)例b,我們是否可以求出D的實(shí)例?

            為什么要問(wèn)這個(gè)問(wèn)題。因?yàn)榇嬖谙旅娴目赡苄裕?/font>
            class B
            {
               ...
               virtual int GetTypeID()=0;
               ...
            };

            class D : public A, public B, public C
            {
               ...
               virtual int GetTypeID(){return 0;};
               ...
            };

            class Z : public X, public Y, public B
            {
               ...
               virtual int GetTypeID(){return 1;};
               ...
            };

            void MyFunc(B* b)
            {
               int t = b->GetTypeID();
               switch(t)
               {
               case 0:
                   DoSomething((D*)b); //
            可能嗎?

                   break;
               case 1:
                   DoSomething((Z*)b); //
            可能嗎?

                   break;
               default:
                   break;
               }
            }

            猛一看很值得懷疑。但仔細(xì)想想,這是可能的,事實(shí)也證明了這一點(diǎn)。因?yàn)榫幾g器了解這DB這兩個(gè)類(lèi)相互之間的關(guān)系(也就是偏移量),因此它會(huì)做相應(yīng)的轉(zhuǎn)換。同樣,設(shè)置斷點(diǎn),查看匯編:
            D *d2 = (D*)b;
            00419992  cmp         dword ptr [b],0
            00419996  je          main+196h (4199A6h)
            00419998  mov         eax,dword ptr [b]
            0041999B  sub         eax,8
            0041999E  mov         dword ptr [ebp-13Ch],eax
            004199A4  jmp         main+1A0h (4199B0h)
            004199A6  mov         dword ptr [ebp-13Ch],0
            004199B0  mov         ecx,dword ptr [ebp-13Ch]
            004199B6  mov         dword ptr [d2],ecx
            如果源(這里是b)為NULL,那么目標(biāo)(這里是d2)也為NULL。否則目標(biāo)取源的地址并向上偏移8個(gè)字節(jié),這樣正好指向D的實(shí)例位置。同樣,為啥需要ebp-13Ch做緩存,待查。

            前一段時(shí)間因?yàn)閾?dān)心.NET中將interface轉(zhuǎn)成相應(yīng)的類(lèi)會(huì)有問(wèn)題。今天對(duì)C++多重繼承的復(fù)習(xí)徹底消除了疑云。

             

             

            posted @ 2010-09-08 14:14 runsisi 閱讀(207) | 評(píng)論 (0)編輯 收藏

            畢業(yè)已經(jīng)整整一年,又到一年鳳凰花開(kāi)的時(shí)候。

            親愛(ài)的2010屆畢業(yè)生同學(xué)們:
                你們好!
                首先,為你們完成學(xué)業(yè)并即將踏上新的征途送上最美好的祝愿。
                同學(xué)們,在華中科技大學(xué)的這幾年里,你們一定有很多珍貴的記憶!
                你們真幸運(yùn),國(guó)家的盛世如此集中相伴在你們大學(xué)的記憶中。08奧運(yùn)留下的記憶,不
            僅是金牌數(shù)的第一,不僅是開(kāi)幕式的華麗,更是中華文化的魅力和民族向心力的顯示;六
            十年大慶留下的記憶,不僅是領(lǐng)袖的揮手,不僅是自主研制的先進(jìn)武器,不僅是女兵的微
            笑,不僅是隊(duì)伍的威武整齊,更是改革開(kāi)放的歷史和旗幟的威力;世博會(huì)留下的記憶,不
            僅是世博之夜水火相容的神奇,不僅是中國(guó)館的宏偉,不僅是異國(guó)場(chǎng)館的浪漫,更是中華
            的崛起,世界的驚異;你們一定記得某國(guó)總統(tǒng)的傲慢與無(wú)禮,你們也讓他記憶了你們的不
            屑與蔑視;同學(xué)們,伴隨著你們大學(xué)記憶的一定還有什錦八寶飯;還有一個(gè)G2的新詞,它
            將永遠(yuǎn)成為世界新的記憶。
                近幾年,國(guó)家頻發(fā)的災(zāi)難一定給你們留下深刻的記憶。汶川的顫抖,沒(méi)能抖落中國(guó)人
            民的堅(jiān)強(qiáng)與剛毅;玉樹(shù)的搖動(dòng),沒(méi)能撼動(dòng)漢藏人民的齊心與合力。留給你們記憶的不僅是
            大悲的哭泣,更是大愛(ài)的洗禮;西南的干旱或許使你們一樣感受渴與饑,留給你們記憶的
            ,不僅是大地的喘息,更是自然需要和諧、發(fā)展需要科學(xué)的道理。
                在華中大的這幾年,你們會(huì)留下一生中特殊的記憶。你一定記得剛進(jìn)大學(xué)的那幾分稚
            氣,父母親人送你報(bào)到時(shí)的情景歷歷;你或許記得“考前突擊而帶著忐忑不安的心情走向
            考場(chǎng)時(shí)的悲壯” ,你也會(huì)記得取得好成績(jī)時(shí)的欣喜;你或許記得這所并無(wú)悠久歷史的
            學(xué)校不斷追求卓越的故事;你或許記得裘法祖院士所代表的同濟(jì)傳奇以及大師離去時(shí)同濟(jì)
            校園中彌漫的悲痛與凝重氣息;你或許記得人文素質(zhì)講堂的擁擠,也記得在社團(tuán)中的奔放
            與隨意;你一定記得騎車(chē)登上“絕望坡”的喘息與快意;你也許記得青年園中令你陶醉的
            發(fā)香和桂香,眼睛湖畔令你流連忘返的圣潔或妖嬈;你或許“記得向喜歡的女孩表白被拒
            時(shí)內(nèi)心的煎熬”,也一定記得那初吻時(shí)的如醉如癡。可是,你是否還記得強(qiáng)磁場(chǎng)和光
            電國(guó)家實(shí)驗(yàn)室的建立?是否記得創(chuàng)新研究院和啟明學(xué)院的聳起?是否記得為你們領(lǐng)航的黨
            旗?是否記得人文講壇上精神矍鑠的先生叔子?是否記得傾聽(tīng)你們?cè)V說(shuō)的在線的“張媽媽
            ”?是否記得告訴你們撿起路上樹(shù)枝的劉玉老師?是否記得應(yīng)立新老師為你們修改過(guò)的簡(jiǎn)
            歷,但愿它能成為你們進(jìn)入職場(chǎng)的最初記憶。同學(xué)們,華中大校園里,太多的人和事需要
            你們記憶。
                請(qǐng)相信我,日后你們或許會(huì)改變今天的某些記憶。瑜園的梧桐,年年飛絮成“雨”,
            今天或許讓你覺(jué)得如淫雨霏霏,使你心情煩躁、郁悶。日后,你會(huì)覺(jué)得如果沒(méi)有梧桐之“
            雨”,瑜園將缺少滋潤(rùn),若沒(méi)有梧桐的遮蓋,華中大似乎缺少前輩的庇蔭,更少了歷史的
            沉積。你們一定還記得,學(xué)校的排名下降使你們生氣,未來(lái)或許你會(huì)覺(jué)得“不為排名所累
            ”更體現(xiàn)華中大的自信與定力。
                我知道,你們還有一些特別的記憶。你們一定記住了“俯臥撐”、“躲貓貓”、“喝
            開(kāi)水”,從熱鬧和愚蠢中,你們記憶了正義;你們記住了“打醬油”和“媽媽喊你回家吃
            飯”,從麻木和好笑中,你們記憶了責(zé)任和良知;你們一定記住了姐的狂放,哥的犀利。
            未來(lái)有一天,或許當(dāng)年的記憶會(huì)讓你們問(wèn)自己,曾經(jīng)是姐的娛樂(lè),還是哥的寂寞?
                親愛(ài)的同學(xué)們,你們?cè)谌A中科技大學(xué)的幾年給我留下了永恒的記憶。我記得你們?yōu)榱?br>士尋親千里,記得你們?cè)诠麻L(zhǎng)征路上的經(jīng)歷;我記得你們?cè)诟鞣N社團(tuán)的驕人成績(jī);我記
            得你們時(shí)而感到“無(wú)語(yǔ)”時(shí)而表現(xiàn)的焦慮,記得你們?yōu)橹袊?guó)的“常青藤”學(xué)校中無(wú)華中大
            一席而灰心喪氣;我記得某些同學(xué)為“學(xué)位門(mén)”、為光谷同濟(jì)醫(yī)院的選址而憤激;我記得
            你們剛剛對(duì)我的呼喊:“根叔,你為我們做成了什么?”——是啊,我也得時(shí)時(shí)拷問(wèn)自己
            的良心,到底為你們做了什么?還能為華中大學(xué)子做什么?
                我記得,你們都是小青年。我記得“吉丫頭”,那么平凡,卻格外美麗;我記得你們
            中間的胡政在國(guó)際權(quán)威期刊上發(fā)表多篇高水平論文,創(chuàng)造了本科生參與研究的奇跡;我記
            得“校歌男”,記得“選修課王子”,同樣是可愛(ài)的孩子。我記得沉迷于網(wǎng)絡(luò)游戲甚至頻
            臨退學(xué)的學(xué)生與我聊天時(shí)目光中透出的茫然與無(wú)助,他們還是華中大的孩子,他們更成為
            我心中抹不去的記憶。
                我記得你們的自行車(chē)和熱水瓶常常被偷,記得你們?yōu)閾屨甲欢冻龅钠D辛;記得你
            們?cè)诤涞亩焓帜_冰涼,記得你們?cè)谘谉岬南募緩匾闺y眠;記得食堂常常讓你們生氣,
            我當(dāng)然更記得自己說(shuō)過(guò)的話:“我們絕不賺學(xué)生一分錢(qián)”,也記得你們對(duì)此言并不滿意;
            但愿華中大尤其要有關(guān)于校園丑陋的記憶。只要我們共同記憶那些丑陋,總有一天,我們
            能將丑陋轉(zhuǎn)化成美麗。
                同學(xué)們,你們中的大多數(shù)人,即將背上你們的行李,甚至遠(yuǎn)離。請(qǐng)記住,最好不要再
            讓你們的父母為你們送行。“面對(duì)歲月的侵蝕,你們的煩惱可能會(huì)越來(lái)越多,考慮的問(wèn)題
            也可能會(huì)越來(lái)越現(xiàn)實(shí),角色的轉(zhuǎn)換可能會(huì)讓你們感覺(jué)到有些措手不及。”也許你會(huì)選
            擇“膠囊公寓”,或者不得不蝸居,成為蟻?zhàn)逯粏T。沒(méi)關(guān)系,成功更容易光顧磨難和艱
            辛,正如只有經(jīng)過(guò)泥濘的道路才會(huì)留下腳印。請(qǐng)記住,未來(lái)你們大概不再有批評(píng)上級(jí)的隨
            意,同事之間大概也不會(huì)有如同學(xué)之間簡(jiǎn)單的關(guān)系;請(qǐng)記住,別太多地抱怨,成功永遠(yuǎn)不
            屬于整天抱怨的人,抱怨也無(wú)濟(jì)于事;請(qǐng)記住,別沉迷于世界的虛擬,還得回到社會(huì)的現(xiàn)
            實(shí);請(qǐng)記住,“敢于競(jìng)爭(zhēng),善于轉(zhuǎn)化”,這是華中大的精神風(fēng)貌,也許是你們未來(lái)成功的
            真諦;請(qǐng)記住,華中大,你的母校。“什么是母校?就是那個(gè)你一天罵他八遍卻不許別人
            罵的地方”。多么樸實(shí)精辟!
                親愛(ài)的同學(xué)們,也許你們難以有那么多的記憶。如果問(wèn)你們關(guān)于一個(gè)字的記憶,那一
            定是“被”。我知道,你們不喜歡“被就業(yè)”、“被堅(jiān)強(qiáng)”,那就挺直你們的脊梁,挺起
            你們的胸膛,自己去就業(yè),堅(jiān)強(qiáng)而勇敢地到社會(huì)中去闖蕩。
                親愛(ài)的同學(xué)們,也許你們難以有那么多的記憶,也許你們很快就會(huì)忘記根叔的嘮叨與
            瑣細(xì)。盡管你們不喜歡“被”,根叔還是想強(qiáng)加給你們一個(gè)“被”:你們的未來(lái)“被”華
            中大記憶!
            posted @ 2010-06-23 13:14 runsisi 閱讀(266) | 評(píng)論 (0)編輯 收藏

            嗯 表白啦^^
            其實(shí)喜歡了好久好久,就是不敢說(shuō)出口,也許是因?yàn)樗珒?yōu)秀了吧^^,而我... :(
            躺床上給她發(fā)短信說(shuō)喜歡她...
            預(yù)料中的答案,沒(méi)有肯定欣然接受也沒(méi)有斷然拒絕...
            心情比以前好多啦^^
            posted @ 2010-05-18 20:34 runsisi 閱讀(640) | 評(píng)論 (7)編輯 收藏

            下 了 個(gè) 10.04,原來(lái) 還 滿 懷期待,真 正 裝 上 ,覺(jué)得比 fedora還 是 差太 多 了 .
            fedora的 缺點(diǎn) 就 是 軟件少 了 點(diǎn) ,不 太 穩(wěn)定 .
            害我 把fedora格了 ,郁悶...
            等 再過(guò)半個(gè) 月 裝 fedora13算 啦 ..

            posted @ 2010-05-01 14:38 runsisi 閱讀(169) | 評(píng)論 (0)編輯 收藏

                  今天川外公布錄取結(jié)果,從昨晚開(kāi)始不停的刷新,上午在公司由于沒(méi)有網(wǎng),過(guò)了沒(méi)
            多久就用手機(jī)上去看看。川外的效率也太低了點(diǎn),下午去了趟電腦城,然后又回來(lái)上了
            一節(jié)自然辯證法,還是沒(méi)有出來(lái),直到第二節(jié)課打鈴的時(shí)候又上去看了一次,這一次終
            于沒(méi)有讓我失望,結(jié)果出來(lái)了,懷著忐忑不安的心,翻到第二頁(yè)終于找到莎子的名字了,
            趕忙跑出去給她打了個(gè)電話。擔(dān)心了這么天,終于可以松口氣啦... gxgx ^^。
            posted @ 2010-04-16 19:28 runsisi 閱讀(3488) | 評(píng)論 (0)編輯 收藏

            有人在fedora12下成功編譯過(guò)內(nèi)核沒(méi)?有的給我留個(gè)言啊:)
            可以引導(dǎo)至字符界面,但死都啟動(dòng)不了圖形登錄界面,為了這個(gè)快折騰了我一個(gè)月了。
            在ubuntu隨便就編譯成功了,什么特殊的操作都不需要。

            本打算裝ubuntu編譯內(nèi)核,用fedora進(jìn)行日常使用,但至少裝了10遍ubuntu都不成功,總是裝到94%的地方安裝程序crash了,換linux mint也一樣,真的是郁悶了,最后雖然用fedora的grub可以引導(dǎo)裝的linux mint但總感覺(jué)有點(diǎn)不那個(gè),以前裝過(guò)那么多次的ubuntu什么問(wèn)題都沒(méi)出現(xiàn)過(guò),郁悶。
            順便說(shuō)一句,真的沒(méi)發(fā)現(xiàn)linux mint比ubuntu有什么改進(jìn)的地方,自帶的解碼器也沒(méi)幾個(gè),還是幾乎什么都放不了,還白白多占了300多M的iso空間。既然同樣是依賴源,顯然還是裝ubuntu要好。

            懷疑是硬盤(pán)的問(wèn)題,重新裝了一遍fedora,將分區(qū)重新分了一下,將所有的電影電視劇都刪了,總共100多G的東西,同時(shí)把GNOME也裝上去了,因?yàn)閾?dān)心是因?yàn)閗dm的原因?qū)е虏荒芤龑?dǎo)圖形登錄界面。又編譯了一遍內(nèi)核,用gdm還是無(wú)法引導(dǎo)登錄界面,郁悶。
            暫時(shí)還沒(méi)有裝ubuntu,硬盤(pán)里只有一個(gè)linux mint的盤(pán),有時(shí)間再試試。

            yum更新時(shí)出了點(diǎn)問(wèn)題,在更新的時(shí)候去吃飯了,等回來(lái)一看估計(jì)系統(tǒng)又待機(jī)了,我這筆記本不知道是啥問(wèn)題,待機(jī)后只能重啟,重啟后繼續(xù)更新就出了依賴問(wèn)題,不知道是我沒(méi)有執(zhí)行yum-complete-transaction的原因還是別的,但總感覺(jué)是yum自己的問(wèn)題,這些包又是不能刪除的,刪除了就會(huì)連帶刪除幾乎整個(gè)系統(tǒng),網(wǎng)上碰到一個(gè)外國(guó)人出現(xiàn)了同樣的問(wèn)題,但也沒(méi)有解決方法。問(wèn)題如下:

            Finished Dependency Resolution
            PackageKit
            -yum-0.5.4-0.1.20091029git.fc12.i686 from installed has depsolving problems
              
            --> Missing Dependency: PackageKit = 0.5.4-0.1.20091029git.fc12 is needed by package PackageKit-yum-0.5.4-0.1.20091029git.fc12.i686 (installed)
            rpm
            -libs-4.7.1-6.fc12.i686 from installed has depsolving problems
              
            --> Missing Dependency: rpm = 4.7.1-6.fc12 is needed by package rpm-libs-4.7.1-6.fc12.i686 (installed)
            1:perl-Pod-Escapes-1.04-82.fc12.i686 from installed has depsolving problems
              
            --> Missing Dependency: perl = 4:5.10.0-82.fc12 is needed by package 1:perl-Pod-Escapes-1.04-82.fc12.i686 (installed)
            3:perl-version-0.74-82.fc12.i686 from installed has depsolving problems
              
            --> Missing Dependency: perl = 4:5.10.0-82.fc12 is needed by package 3:perl-version-0.74-82.fc12.i686 (installed)
            Error: Missing Dependency: PackageKit 
            = 0.5.4-0.1.20091029git.fc12 is needed by package PackageKit-yum-0.5.4-0.1.20091029git.fc12.i686 (installed)
            Error: Missing Dependency: perl 
            = 4:5.10.0-82.fc12 is needed by package 3:perl-version-0.74-82.fc12.i686 (installed)
            Error: Missing Dependency: perl 
            = 4:5.10.0-82.fc12 is needed by package 1:perl-Pod-Escapes-1.04-82.fc12.i686 (installed)
            Error: Missing Dependency: rpm 
            = 4.7.1-6.fc12 is needed by package rpm-libs-4.7.1-6.fc12.i686 (installed)
             You could 
            try using --skip-broken to work around the problem
             You could 
            try running: package-cleanup --problems
                                    package
            -cleanup --dupes
                                    rpm 
            -Va --nofiles --nodigest

            奇怪的是這些依賴的包明明都已經(jīng)裝好了的,在網(wǎng)上沒(méi)有找到任何有意義的東西。

            我的解決方法如下

            去下載有依賴問(wèn)題的軟件包自己手動(dòng)更新。
            比如rpm
            -libs-4.7.1-6.fc12.i386.rpm,然后執(zhí)行:
            rpm 
            -Uvh --nodeps --force rpm-libs-4.7.1-6.fc12.i386.rpm
            進(jìn)行強(qiáng)制安裝即可,以后就不會(huì)出現(xiàn)依賴問(wèn)題了。
            至于怎么下載這些更新包,顯然可以去相應(yīng)的源服務(wù)器手動(dòng)下載,如http://mirrors.163.com。
            更新時(shí)還有一個(gè)sip-devel的包出現(xiàn)conflict的錯(cuò)誤,不知道什么原因,也直接手動(dòng)更新force過(guò)去了。

            庫(kù)之間的依賴問(wèn)題應(yīng)該是linux在桌面應(yīng)用不可能超越windows的一大原因吧,源的存在解決了依賴問(wèn)題,但又導(dǎo)致了對(duì)網(wǎng)絡(luò)的依賴性。

            runsisi@HUST
            posted @ 2010-02-12 12:36 runsisi 閱讀(591) | 評(píng)論 (0)編輯 收藏

            和上篇文章一樣,只不過(guò)是適合audacious 2.2版本

            diff -Nur audacious-mac-0.3.10.orig/src/mac.cpp audacious-mac-0.3.10.modified/src/mac.cpp
            --- audacious-mac-0.3.10.orig/src/mac.cpp    2007-10-15 17:21:33.000000000 +0800
            +++ audacious-mac-0.3.10.modified/src/mac.cpp    2010-02-06 21:38:34.276458793 +0800
            @@ 
            -11,7 +11,7 @@
             #include 
            <glib.h>
             
             
            const gchar *fmts[] = "mac""ape""apl", NULL };
            -
            +//modified by runsisi@163.com
             InputPlugin mac_plugin_info =
             
            {
                 NULL,
            @@ 
            -21,32 +21,28 @@
                 NULL,
                 mac_about,
                 NULL,
            +    NULL,
                 FALSE,
            +    FALSE,
            +    (gchar**)fmts,
            +    NULL,
                 NULL,
            +    mac_is_our_file_from_vfs,
                 NULL,
                 mac_play_file,
                 mac_stop,
                 mac_pause,
            -    mac_seek, 
            -    NULL,
            -    NULL,
            -    NULL,
            -    NULL,
            +    mac_seek,
            +    mac_mseek,
                 NULL,
                 NULL,
                 NULL,
                 NULL,
                 NULL,
                 mac_file_info_box,
            -    NULL,
                 mac_get_song_tuple,
                 NULL,
            -    NULL,
            -    mac_is_our_file_from_vfs,
            -    (gchar **)fmts,
            -    mac_mseek,
             }
            ;
            -
             InputPlugin 
            *mac_plugin_infolist[] = &mac_plugin_info, NULL };
             
             SIMPLE_INPUT_PLUGIN(mac_plugin_info, mac_plugin_infolist)
            @@ 
            -295,7 +291,7 @@
                          GTK_SIGNAL_FUNC(gtk_widget_destroyed), 
            &aboutbox);
             }
             
            -int mac_is_our_file_from_vfs(gchar *filename, VFSFile *file)
            +int mac_is_our_file_from_vfs(const gchar *filename, VFSFile *file)
             
            {
                 gchar magic[
            4];
                 
            const gchar *ext;
            @@ 
            -383,7 +379,7 @@
                 mac_mseek(playback, time 
            * 1000);
             }

             
            -Tuple *mac_get_song_tuple(gchar *uriname)
            +Tuple *mac_get_song_tuple(const gchar *uriname)
             
            {
                 
            int nRetVal = 0;
                 
            char *filename;
            diff 
            -Nur audacious-mac-0.3.10.orig/src/mac.h audacious-mac-0.3.10.modified/src/mac.h
            --- audacious-mac-0.3.10.orig/src/mac.h    2007-09-08 20:04:35.000000000 +0800
            +++ audacious-mac-0.3.10.modified/src/mac.h    2010-02-06 21:16:39.478580938 +0800
            @@ 
            -44,10 +44,10 @@
             #ifdef __cplusplus
             
            extern "C"{
             
            #endif
            -
            +//modified by runsisi@163.com
             static void mac_about();
             
            -static int mac_is_our_file_from_vfs(gchar *filename, VFSFile *file);
            +static int mac_is_our_file_from_vfs(const gchar *filename, VFSFile *file);
             
             
            static void mac_play_file(InputPlayback *data);
             
            @@ 
            -59,9 +59,9 @@
             
             
            static void mac_seek(InputPlayback *data, int time);
             
            -static Tuple *mac_get_song_tuple(gchar *filename);
            +static Tuple *mac_get_song_tuple(const gchar *filename);
             
            -void mac_file_info_box(char *filename);
            +void mac_file_info_box(const char *filename);
             
             #ifdef __cplusplus
             }


            runsisi@HUST
            posted @ 2010-02-08 21:30 runsisi 閱讀(431) | 評(píng)論 (1)編輯 收藏

            把ubuntu刪了,太傻瓜了,出了問(wèn)題幾乎從沒(méi)人想過(guò)要自己用下載工具下deb包,只知道apt-get,aptitude,新立得,看著都煩了,windows都沒(méi)這么傻瓜。
            重裝了一次fedora,自己到底出了什么問(wèn)題?沒(méi)事喜歡折騰,而起還是fedora用的好好的時(shí)候?,F(xiàn)在fedora也有ubuntu的病了,什么都是yum。
            說(shuō)實(shí)話fedora遠(yuǎn)遠(yuǎn)沒(méi)有ubuntu穩(wěn)定,這次更新后照樣還是出不來(lái)login screen,而且新的內(nèi)核根本就進(jìn)不去,只能控制臺(tái)登陸,但上次卻可以...

            在ubuntu和fedora下一直都是用rhythmbox聽(tīng)歌的,但放整張碟的那種ape是有問(wèn)題的,而且太龐大了,千千靜聽(tīng)多好:)。audacious沒(méi)有那亂七八糟的插件,用搜狗下了半天的源代碼都沒(méi)下全,而且默認(rèn)的皮膚不是一般的丑,幾乎就沒(méi)有看得清楚按鍵的皮膚,制作這種皮膚的人到底出了什么問(wèn)題?
            偶然發(fā)現(xiàn)sohu的mirror有rpmfusion的mirror,在那里下了一些插件,但沒(méi)有放ape的插件,只得自己編譯。

            編譯audacious-mac-0.3.10出了點(diǎn)小問(wèn)題,應(yīng)該是因?yàn)檫@個(gè)包是針對(duì)audacious低版本的原因,代碼有點(diǎn)小錯(cuò)誤,gcc會(huì)報(bào)初始化參數(shù)太多。
            下面是我生成的patch,也可以自己找到mac.cpp這個(gè)文件注釋掉4個(gè)NULL:
            注意,該patch只適用于audacious 2.1版本!

            diff -rNu audacious-mac-0.3.10.org/src/mac.cpp audacious-mac-0.3.10.modified/src/mac.cpp
            --- audacious-mac-0.3.10.org/src/mac.cpp    2010-01-18 12:16:19.983322369 +0800
            +++ audacious-mac-0.3.10.modified/src/mac.cpp    2010-01-18 12:13:48.000000000 +0800
            @@ 
            -12,6 +12,7 @@
             
             
            const gchar *fmts[] = { "mac""ape""apl", NULL };
             
            +//modified by runsisi@163.com
             InputPlugin mac_plugin_info =
             {
                 NULL,
            @@ 
            -36,12 +37,12 @@
                 NULL,
                 NULL,
                 NULL,
            -    NULL,
            +    //NULL,
                 mac_file_info_box,
            -    NULL,
            +    //NULL,
                 mac_get_song_tuple,
            -    NULL,
            -    NULL,
            +    //NULL,
            +    //NULL,
                 mac_is_our_file_from_vfs,
                 (gchar 
            **)fmts,
                 mac_mseek,

            注意:編譯這個(gè)插件之前需要編譯shared lib of Monkey's Audio Codec,audacious官方提供的mac-port已經(jīng)從sourceforge上撤了,請(qǐng)搜索mac-3.99-u4-b5(某個(gè)chinese的修改更新版)進(jìn)行編譯。
            注意:mac-3.99-u4-b5 本身也有一處代碼編譯通不過(guò),請(qǐng)自行修改,只要使用c語(yǔ)言的類(lèi)型轉(zhuǎn)換(char*)或c++轉(zhuǎn)換const_cast<char*>就可以了。
            都可以不考慮使用gstreamer了,smplayer+mplayer解決視頻,audacious解決音頻,比totem+rhythmbox的解決方案好太多了。



            runsisi@HUST

            posted @ 2010-01-17 15:33 runsisi 閱讀(809) | 評(píng)論 (2)編輯 收藏

            昨天編譯的Virtualbox有一個(gè)問(wèn)題,虛擬機(jī)設(shè)置的共享文件夾不能使用,根本就找不到網(wǎng)絡(luò)地址,這可是個(gè)big problem!
            沒(méi)有找到有效的解決方法,不知道是我的rpwt還是配置問(wèn)題。不過(guò)我在主機(jī)配置了一個(gè)ftp服務(wù)器,好歹也能把虛擬機(jī)里下的東西傳到主機(jī)上了。另外發(fā)現(xiàn)一個(gè)問(wèn)題,虛擬機(jī)無(wú)法使用橋接方式上網(wǎng),配置成橋接網(wǎng)絡(luò)的話,啟動(dòng)時(shí)會(huì)報(bào)錯(cuò),是另外兩個(gè)模塊沒(méi)有加載的原因,把昨天的腳本修改了一下,如下,將它復(fù)制粘貼保存為vbox,并chmod成可執(zhí)行,覆蓋/etc/init.d下的同名文件即可。

             #!/bin/bash
             
             #by runsisi@
            163.com 2010-01-11
             
            ### BEGIN INIT INFO
            # Provides: vbox
            # Required
            -Start: $syslog $local_fs
            # Required
            -Stop: $syslog $local_fs
            # Default
            -Start: 2 3 4 5
            # Default
            -Stop: 0 1 6
            # Short
            -Description: The Virtual Box kernel module
            # Description: The Virtual Box kernel module
            ### END INIT INFO

            running()
            {
                lsmod 
            | grep -"$1[^_-]"
            }

            start() 
            {
                    echo $
            "Starting Virtual Box. "
                    
            if ! running vboxdrv; then
                        
            if ! modprobe vboxdrv; then
                            echo $
            "Failed."
                            
            return 1
                        
            else
                            chown root.vboxusers 
            /dev/vboxdrv
                        fi
                    fi
                    
            if ! running vboxnetadp; then
                        
            if ! modprobe vboxnetadp ; then
                            echo  $
            "Failed."
                            
            return 1
                        
            else
                            chown root.vboxusers 
            /dev/vboxnetctl
                        fi
                    fi
                    
            if ! running vboxnetflt; then
                        
            if ! modprobe vboxnetflt; then
                            echo $
            "Failed."
                            
            return 1
                        fi
                    fi      
                
                    
            return 0
            }

            stop()
            {
                
            if running vboxnetadp; then
                    
            if ! rmmod vboxnetadp; then
                        echo $
            "Cannot unload module vboxnetadp"
                        
            return 1
                    fi
                fi
                
                
            if running vboxdrv; then
                    
            if running vboxnetflt; then
                        
            if ! rmmod vboxnetflt; then
                            echo $
            "Cannot unload module vboxnetflt"
                            
            return 1
                        fi
                    fi
                    
                    
            if ! rmmod vboxdrv; then
                        echo  $
            "Cannot unload module vboxdrv"
                        
            return 1
                    fi
                fi
                
                    
            return 0
            }

            status()
            {
                    
            if running vboxdrv; then
                        
            if running vboxnetflt; then
                            
            if running vboxnetadp; then
                                echo  $
            "VirtualBox kernel modules (vboxdrv, vboxnetflt and vboxnetadp) are loaded."
                            
            else
                                echo  $
            "VirtualBox kernel modules (vboxdrv and vboxnetflt) are loaded."
                            fi
                        
            else
                              echo  $
            "VirtualBox kernel module is loaded."
                        fi
                        
            return 0
                    
            else
                        echo  $
            "VirtualBox kernel module is not loaded."
                        
            return 3
                    fi
            }

            restart()
            {
                    stop
                    start
            }

            case $1 in
                    start)
                            start
                    ;;
                    stop)
                            stop
                    ;;
                    restart)
                            restart
                    ;;
                    status)
                    status                
                    ;;
                    
            *)

                    echo 
            "Usage: vbox {start|stop|restart|status}"
                    exit 
            3
            esac

            exit 
            0

             
            runsisi@HUST
            posted @ 2010-01-12 21:15 runsisi 閱讀(834) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題
            共5頁(yè): 1 2 3 4 5 
            久久青青草原亚洲av无码| 欧美大香线蕉线伊人久久| 久久福利青草精品资源站免费 | 国产精品免费久久久久久久久 | 国产69精品久久久久观看软件| 久久毛片免费看一区二区三区| 亚洲精品第一综合99久久| 日韩精品久久无码中文字幕| av午夜福利一片免费看久久| 久久强奷乱码老熟女| 久久人人爽人人爽人人AV| 久久亚洲国产中v天仙www| 日韩欧美亚洲综合久久| 99久久精品日本一区二区免费 | 秋霞久久国产精品电影院| 久久久这里有精品| 婷婷综合久久中文字幕| 色妞色综合久久夜夜| 国产99久久久国产精品~~牛| 超级97碰碰碰碰久久久久最新| 国内精品伊人久久久久| 久久精品国产精品亚洲精品| 91久久成人免费| 成人免费网站久久久| 99久久精品免费看国产一区二区三区 | 国产视频久久| 狠狠色丁香久久婷婷综合五月| 四虎亚洲国产成人久久精品| segui久久国产精品| 久久精品一区二区| 精品国际久久久久999波多野| 亚洲人成伊人成综合网久久久| 蜜桃麻豆www久久国产精品| 亚洲国产精品久久久久婷婷软件| 久久综合综合久久综合| 77777亚洲午夜久久多人| 欧美久久久久久精选9999| 久久久久久国产a免费观看不卡| 91久久福利国产成人精品| 国产激情久久久久影院| 老司机国内精品久久久久|