• <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++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              45 隨筆 :: 15 文章 :: 26 評論 :: 0 Trackbacks

            #

             

            網上關于MFC規則DLL的創建和使用的資料比較多,其實也就那兩三篇轉過來轉過去:)
            但是好像都只是用自己寫的MFC主程序調用MFC DLL,涉及到DLL的資源問題時都會提及三種解決方法:
            1)    AFX_MANAGE_STATE(AfxGetStaticModuleState());
            2)    AfxGetResourceHandle(); 
            AfxSetResourceHandle();
            3)    在主程序中使用方法2;
            如果是自己寫的MFC主程序自然三種方法都可以,但是如果不是這種情況呢
            ?比如:
            1)    主程序是SDK寫的,然后調用MFC DLL
            2)    主程序根本就不是我們自己寫的,MFC DLL只是作為一個HOOK DLL注入主程序中
            3)    主程序是用其他GUI庫寫的
            在這幾種情況下上述的2)、
            3)兩種方法是無法使用的,想想為什么?
            只有方法1)可行,當然我們也可以使用如下的方法:
            _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());的方法只能等函數的作用空間結束之后才恢復資源句柄。由于可執行文件必須重畫工具條等原因,因此建議只要有可能就必須恢復資源句柄,否則可能會遇到許多問題。比如說,如果用戶移動DLL的對話框,而此時資源句柄仍然為DLL的資源,那么程序就會崩潰。最好的恢復句柄的時機在對話框響應WM_INITDIALOG消息的時候,因為這時對話框的模板等已經讀出了。
            不知道這段話的結論是怎樣得出來的,而所謂的恢復句柄的方法我也不知道他是怎么恢復的。實際測試的結果是根本不需要考慮這個,即使是單線程主程序,MFC DLL在主程序的主線程內執行;如果MFC DLL是在單獨的一個線程內執行,則更加不需要考慮這個問題;如果主程序是SDK程序則根本不需要考慮這個問題,因為SDK程序都是直接操作句柄的。
            如果覺得有錯那就使用我提供的另外一種方法,或者使用花括號吧,呵呵。

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

            n久沒有寫過了,轉載一篇,呵呵。不喜歡轉載,但這篇文章確實還不錯,只是不知道為什么找不到原文出處。
            以下為轉載全文。修改了一些細節。對cppblog崩潰了,這是啥所見即所得排版啊,唉,暈倒。

            這幾天寫的程序應用到多繼承。

            以前對多繼承的概念非常清晰,可是很久沒用就有點模糊了。重新研究一下,刷新下記憶。

            假設我們有下面的代碼:

            #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;
            }

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

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

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

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

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

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

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

            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,那么目標(這里是b)也將被置為NULL,否則目標將指向源的地址并向下偏移8個字節,正好就是上圖所示BVTAB位置。至于為什么要用ebp-38h作緩存,這是編譯器的算法問題了。等以后有時間再研究。

            接下來看一個比較古怪的問題,這個也是我寫這篇文章的初衷:
            根據上面的多繼承定義,如果給出一個類B的實例b,我們是否可以求出D的實例?

            為什么要問這個問題。因為存在下面的可能性:
            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;
               }
            }

            猛一看很值得懷疑。但仔細想想,這是可能的,事實也證明了這一點。因為編譯器了解這DB這兩個類相互之間的關系(也就是偏移量),因此它會做相應的轉換。同樣,設置斷點,查看匯編:
            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,那么目標(這里是d2)也為NULL。否則目標取源的地址并向上偏移8個字節,這樣正好指向D的實例位置。同樣,為啥需要ebp-13Ch做緩存,待查。

            前一段時間因為擔心.NET中將interface轉成相應的類會有問題。今天對C++多重繼承的復習徹底消除了疑云。

             

             

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

            畢業已經整整一年,又到一年鳳凰花開的時候。

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

            嗯 表白啦^^
            其實喜歡了好久好久,就是不敢說出口,也許是因為她太優秀了吧^^,而我... :(
            躺床上給她發短信說喜歡她...
            預料中的答案,沒有肯定欣然接受也沒有斷然拒絕...
            心情比以前好多啦^^
            posted @ 2010-05-18 20:34 runsisi 閱讀(656) | 評論 (7)編輯 收藏

            下 了 個 10.04,原來 還 滿 懷期待,真 正 裝 上 ,覺得比 fedora還 是 差太 多 了 .
            fedora的 缺點 就 是 軟件少 了 點 ,不 太 穩定 .
            害我 把fedora格了 ,郁悶...
            等 再過半個 月 裝 fedora13算 啦 ..

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

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

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

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

            懷疑是硬盤的問題,重新裝了一遍fedora,將分區重新分了一下,將所有的電影電視劇都刪了,總共100多G的東西,同時把GNOME也裝上去了,因為擔心是因為kdm的原因導致不能引導圖形登錄界面。又編譯了一遍內核,用gdm還是無法引導登錄界面,郁悶。
            暫時還沒有裝ubuntu,硬盤里只有一個linux mint的盤,有時間再試試。

            yum更新時出了點問題,在更新的時候去吃飯了,等回來一看估計系統又待機了,我這筆記本不知道是啥問題,待機后只能重啟,重啟后繼續更新就出了依賴問題,不知道是我沒有執行yum-complete-transaction的原因還是別的,但總感覺是yum自己的問題,這些包又是不能刪除的,刪除了就會連帶刪除幾乎整個系統,網上碰到一個外國人出現了同樣的問題,但也沒有解決方法。問題如下:

            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

            奇怪的是這些依賴的包明明都已經裝好了的,在網上沒有找到任何有意義的東西。

            我的解決方法如下

            去下載有依賴問題的軟件包自己手動更新。
            比如rpm
            -libs-4.7.1-6.fc12.i386.rpm,然后執行:
            rpm 
            -Uvh --nodeps --force rpm-libs-4.7.1-6.fc12.i386.rpm
            進行強制安裝即可,以后就不會出現依賴問題了。
            至于怎么下載這些更新包,顯然可以去相應的源服務器手動下載,如http://mirrors.163.com
            更新時還有一個sip-devel的包出現conflict的錯誤,不知道什么原因,也直接手動更新force過去了。

            庫之間的依賴問題應該是linux在桌面應用不可能超越windows的一大原因吧,源的存在解決了依賴問題,但又導致了對網絡的依賴性。

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

            和上篇文章一樣,只不過是適合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 閱讀(441) | 評論 (1)編輯 收藏

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

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

            編譯audacious-mac-0.3.10出了點小問題,應該是因為這個包是針對audacious低版本的原因,代碼有點小錯誤,gcc會報初始化參數太多。
            下面是我生成的patch,也可以自己找到mac.cpp這個文件注釋掉4個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,

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



            runsisi@HUST

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

            昨天編譯的Virtualbox有一個問題,虛擬機設置的共享文件夾不能使用,根本就找不到網絡地址,這可是個big problem!
            沒有找到有效的解決方法,不知道是我的rpwt還是配置問題。不過我在主機配置了一個ftp服務器,好歹也能把虛擬機里下的東西傳到主機上了。另外發現一個問題,虛擬機無法使用橋接方式上網,配置成橋接網絡的話,啟動時會報錯,是另外兩個模塊沒有加載的原因,把昨天的腳本修改了一下,如下,將它復制粘貼保存為vbox,并chmod成可執行,覆蓋/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 閱讀(857) | 評論 (0)編輯 收藏

            僅列出標題
            共5頁: 1 2 3 4 5 
            亚洲欧美一区二区三区久久| 久久久久国产精品人妻 | 久久国产成人午夜aⅴ影院| 国内精品久久久久久久影视麻豆 | 久久无码人妻精品一区二区三区| 久久精品国产WWW456C0M| 久久香蕉超碰97国产精品| 国产精品成人99久久久久91gav| 一本色道久久综合狠狠躁篇 | 久久人做人爽一区二区三区| 久久午夜电影网| 午夜精品久久久久久久久| 久久亚洲中文字幕精品一区| 99久久婷婷国产综合亚洲| 亚洲精品美女久久777777| 亚洲精品tv久久久久久久久久| 久久天天躁狠狠躁夜夜网站| 国产免费久久精品99re丫y| 成人亚洲欧美久久久久| 日本道色综合久久影院| 国产午夜精品久久久久免费视| 久久AV高潮AV无码AV| 久久青青色综合| 中文字幕久久精品| 久久青青草原亚洲av无码| 久久精品www| 久久香蕉综合色一综合色88| 色婷婷综合久久久久中文一区二区| 亚洲日韩欧美一区久久久久我| 国产精品久久久久久久久久免费| 久久99国产精品尤物| 国产午夜福利精品久久2021 | 区久久AAA片69亚洲| 久久久久亚洲AV片无码下载蜜桃| 国内精品久久久久影院老司| 久久久精品久久久久特色影视| 久久久久久噜噜精品免费直播| 国产女人aaa级久久久级| 久久久免费观成人影院| 18禁黄久久久AAA片| 久久AV高潮AV无码AV|