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 阅读(366) | 评论 (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 阅读(201) | 评论 (0)编辑 收藏

毕业已经整整一年,又到一年凤凰花开的时候。

亲爱的2010届毕业生同学们:
    你们好!
    首先,为你们完成学业并即将踏上新的征途送上最美好的祝愿。
    同学们,在华中科技大学的这几年里,你们一定有很多珍贵的记忆!
    你们真幸运,国家的盛世如此集中相伴在你们大学的记忆中。08奥运留下的记忆,不
仅是金牌数的第一,不仅是开幕式的华丽,更是中华文化的魅力和民族向心力的显示;六
十年大庆留下的记忆,不仅是领袖的挥手,不仅是自主研制的先进武器,不仅是女兵的微
笑,不仅是队伍的威武整齐,更是改革开放的历史和旗帜的威力;世博会留下的记忆,不
仅是世博之夜水火相容的神奇,不仅是中国馆的宏伟,不仅是异国场馆的浪漫,更是中华
的崛起,世界的惊异;你们一定记得某国总统的傲慢与无礼,你们也让他记忆了你们的不
屑与蔑视;同学们,伴随着你们大学记忆的一定还有什锦八宝饭;还有一个G2的新词,它
将永远成为世界新的记忆。
    近几年,国家频发的灾难一定给你们留下深刻的记忆。汶川的颤抖,没能抖落中国人
民的坚强与刚毅;玉树的摇动,没能撼动汉藏人民的齐心与合力。留给你们记忆的不仅是
大悲的哭泣,更是大爱的洗礼;西南的干旱或许使你们一样感受渴与饥,留给你们记忆的
,不仅是大地的喘息,更是自然需要和谐、发展需要科学的道理。
    在华中大的这几年,你们会留下一生中特殊的记忆。你一定记得刚进大学的那几分稚
气,父母亲人送你报到时的情景历历;你或许记得“考前突击而带着忐忑不安的心情走向
考场时的悲壮” ,你也会记得取得好成绩时的欣喜;你或许记得这所并无悠久历史的
学校不断追求卓越的故事;你或许记得裘法祖院士所代表的同济传奇以及大师离去时同济
校园中弥漫的悲痛与凝重气息;你或许记得人文素质讲堂的拥挤,也记得在社团中的奔放
与随意;你一定记得骑车登上“绝望坡”的喘息与快意;你也许记得青年园中令你陶醉的
发香和桂香,眼睛湖畔令你流连忘返的圣洁或妖娆;你或许“记得向喜欢的女孩表白被拒
时内心的煎熬”,也一定记得那初吻时的如醉如痴。可是,你是否还记得强磁场和光
电国家实验室的建立?是否记得创新研究院和启明学院的耸起?是否记得为你们领航的党
旗?是否记得人文讲坛上精神矍铄的先生叔子?是否记得倾听你们诉说的在线的“张妈妈
”?是否记得告诉你们捡起路上树枝的刘玉老师?是否记得应立新老师为你们修改过的简
历,但愿它能成为你们进入职场的最初记忆。同学们,华中大校园里,太多的人和事需要
你们记忆。
    请相信我,日后你们或许会改变今天的某些记忆。瑜园的梧桐,年年飞絮成“雨”,
今天或许让你觉得如淫雨霏霏,使你心情烦躁、郁闷。日后,你会觉得如果没有梧桐之“
雨”,瑜园将缺少滋润,若没有梧桐的遮盖,华中大似乎缺少前辈的庇荫,更少了历史的
沉积。你们一定还记得,学校的排名下降使你们生气,未来或许你会觉得“不为排名所累
”更体现华中大的自信与定力。
    我知道,你们还有一些特别的记忆。你们一定记住了“俯卧撑”、“躲猫猫”、“喝
开水”,从热闹和愚蠢中,你们记忆了正义;你们记住了“打酱油”和“妈妈喊你回家吃
饭”,从麻木和好笑中,你们记忆了责任和良知;你们一定记住了姐的狂放,哥的犀利。
未来有一天,或许当年的记忆会让你们问自己,曾经是姐的娱乐,还是哥的寂寞?
    亲爱的同学们,你们在华中科技大学的几年给我留下了永恒的记忆。我记得你们为烈
士寻亲千里,记得你们在公德长征路上的经历;我记得你们在各种社团的骄人成绩;我记
得你们时而感到“无语”时而表现的焦虑,记得你们为中国的“常青藤”学校中无华中大
一席而灰心丧气;我记得某些同学为“学位门”、为光谷同济医院的选址而愤激;我记得
你们刚刚对我的呼喊:“根叔,你为我们做成了什么?”——是啊,我也得时时拷问自己
的良心,到底为你们做了什么?还能为华中大学子做什么?
    我记得,你们都是小青年。我记得“吉丫头”,那么平凡,却格外美丽;我记得你们
中间的胡政在国际权威期刊上发表多篇高水平论文,创造了本科生参与研究的奇迹;我记
得“校歌男”,记得“选修课王子”,同样是可爱的孩子。我记得沉迷于网络游戏甚至频
临退学的学生与我聊天时目光中透出的茫然与无助,他们还是华中大的孩子,他们更成为
我心中抹不去的记忆。
    我记得你们的自行车和热水瓶常常被偷,记得你们为抢占座位而付出的艰辛;记得你
们在寒冷的冬天手脚冰凉,记得你们在炎热的夏季彻夜难眠;记得食堂常常让你们生气,
我当然更记得自己说过的话:“我们绝不赚学生一分钱”,也记得你们对此言并不满意;
但愿华中大尤其要有关于校园丑陋的记忆。只要我们共同记忆那些丑陋,总有一天,我们
能将丑陋转化成美丽。
    同学们,你们中的大多数人,即将背上你们的行李,甚至远离。请记住,最好不要再
让你们的父母为你们送行。“面对岁月的侵蚀,你们的烦恼可能会越来越多,考虑的问题
也可能会越来越现实,角色的转换可能会让你们感觉到有些措手不及。”也许你会选
择“胶囊公寓”,或者不得不蜗居,成为蚁族之一员。没关系,成功更容易光顾磨难和艰
辛,正如只有经过泥泞的道路才会留下脚印。请记住,未来你们大概不再有批评上级的随
意,同事之间大概也不会有如同学之间简单的关系;请记住,别太多地抱怨,成功永远不
属于整天抱怨的人,抱怨也无济于事;请记住,别沉迷于世界的虚拟,还得回到社会的现
实;请记住,“敢于竞争,善于转化”,这是华中大的精神风貌,也许是你们未来成功的
真谛;请记住,华中大,你的母校。“什么是母校?就是那个你一天骂他八遍却不许别人
骂的地方”。多么朴实精辟!
    亲爱的同学们,也许你们难以有那么多的记忆。如果问你们关于一个字的记忆,那一
定是“被”。我知道,你们不喜欢“被就业”、“被坚强”,那就挺直你们的脊梁,挺起
你们的胸膛,自己去就业,坚强而勇敢地到社会中去闯荡。
    亲爱的同学们,也许你们难以有那么多的记忆,也许你们很快就会忘记根叔的唠叨与
琐细。尽管你们不喜欢“被”,根叔还是想强加给你们一个“被”:你们的未来“被”华
中大记忆!
posted @ 2010-06-23 13:14 runsisi 阅读(246) | 评论 (0)编辑 收藏

嗯 表白啦^^
其实喜欢了好久好久,就是不敢说出口,也许是因为她太优秀了吧^^,而我... :(
躺床上给她发短信说喜欢她...
预料中的答案,没有肯定欣然接受也没有断然拒绝...
心情比以前好多啦^^
posted @ 2010-05-18 20:34 runsisi 阅读(579) | 评论 (7)编辑 收藏

下 了 个 10.04,原来 还 满 怀期待,真 正 装 上 ,觉得比 fedora还 是 差太 多 了 .
fedora的 缺点 就 是 软件少 了 点 ,不 太 稳定 .
害我 把fedora格了 ,郁闷...
等 再过半个 月 装 fedora13算 啦 ..

posted @ 2010-05-01 14:38 runsisi 阅读(158) | 评论 (0)编辑 收藏

      今天川外公布录取结果,从昨晚开始不停的刷新,上午在公司由于没有网,过了没
多久就用手机上去看看。川外的效率也太低了点,下午去了趟电脑城,然后又回来上了
一节自然辩证法,还是没有出来,直到第二节课打铃的时候又上去看了一次,这一次终
于没有让我失望,结果出来了,怀着忐忑不安的心,翻到第二页终于找到莎子的名字了,
赶忙跑出去给她打了个电话。担心了这么天,终于可以松口气啦... gxgx ^^。
posted @ 2010-04-16 19:28 runsisi 阅读(3478) | 评论 (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 阅读(581) | 评论 (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 阅读(389) | 评论 (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 阅读(791) | 评论 (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 阅读(822) | 评论 (0)编辑 收藏

仅列出标题
共5页: 1 2 3 4 5