流浪の家

我要出去走一走
不想让自己变的太成熟


 
流浪の小孩 @ 2009-05-26 13:38

C#程序在运行中是如何使用接口的,如何访问接口函数,具体流程如下:
1、当调用一个接口的函数时,系统会去检查这个接口对应实例是什么;
2、找到这个实例后,再去找这个实例对应的实例类是什么(实例类,在虚函数一文里曾说明过);
3、根据这个实例类去检查该实例类是否和接口发生了捆绑(看是否实现了该接口,冒号后面就是);
4、好!如果实例类实现了该接口(发生了捆绑),那么它就在这个实例类中找到接口中所申明的方法的定义,然后执行该方法,然后结束。
5、如果没找到,它就继续往父类去找,直到找到第一个和接口捆绑的父类为止
6、找到后,它再检查这个父类里该方法是否是被定义为虚函数;
7、如果不是,他马上就执行这个方法,然后结束;
8、如果是,麻烦了,系统又要从头来过,去检查该最开始那个实例类里有否重载了父类里的这个虚函数

interface I

{

        voidFunc();

}

 

class A : I

{

        publicvirtualvoidFunc()

        {

                Console.WriteLine("Func In A");

        }

}

 

classB : A , I // 注意这里,用接口来实现类似多重继承的效果

{

        publicvoidFunc()

        {

                Console.WriteLine("Func In B");

        }

}   

 

class C : A

{

        publicoverridevoidFunc()

        {

                Console.WriteLine("Func In C");

        }

}

 

class D : A

{

        publicnewvoidFunc()

        {

                Console.WriteLine("Func In D");

        }

}

   

publicstaticvoidmain()

{

        I a = newA() ; //申明了接口a,并马上和一个类的实例发生关系了

        I b = newB() ; //申明了接口b,并马上和一个类的实例发生关系了

        I c = newC() ; //申明了接口c,并马上和一个类的实例发生关系了

        I d = newD() ; //申明了接口d,并马上和一个类的实例发生关系了

 

        //检查a的实例类A,发现A和接口I捆绑了,所以执行A的函数Func ,结果: Func In A

a.Func();

 

        // 检查b的实例类B,发现B和接口I捆绑了,所以执行B的函数Func(而不会去执行父类A的,尽管A

        // 实现I接口),结果: Func In B         

        b.Func();

 

        // 检查c的实例类C,发现其没有和接口I捆绑,系统继续找它的父类. 发现AI捆绑了,他就去找

        // 函数A,发现A是虚拟函数,系统又从头来找类的实例C,发现C重载(override)Func,好了,

        //上执行该函数. 结果是Func In C

        c.Func();

 

        // 检查d的实例类D,发现其没有和接口I捆绑,系统继续找它的父类. 发现AI捆绑了,他就去找

        // 函数A,发现A是虚拟函数,系统又从头来找类的实例D,但是D里没有重载(override)Func(而是

        // new覆盖了),所以又会到D的父类里找,所以还是执行AFunc(),结果是Func In A

        d.Func() ;      

}




 
流浪の小孩 @ 2009-03-27 08:59

Vista的UAC很烦人,为了越过这个瓶颈,需要使用Service来执行某些操作。 但是,Service和UI的沟通又是个问题。查询网络资料后的方案: Service端: 1.在startservice里添加如小代码 // set SECURITY_DESCRIPTOR SECURITY_DESCRIPTOR secutityDese; ::InitializeSecurityDescriptor(&secutityDese, SECURITY_DESCRIPTOR_REVISION); ::SetSecurityDescriptorDacl(&secutityDese,TRUE,NULL,FALSE); SECURITY_ATTRIBUTES securityAttr; // set SECURITY_ATTRIBUTES securityAttr.nLength = sizeof SECURITY_ATTRIBUTES; securityAttr.bInheritHandle = FALSE; securityAttr.lpSecurityDescriptor = &secutityDese; // event for FnF5 pressed g_hHandleWaitEvent[0] = ::CreateEvent( &securityAttr, // no security attributes FALSE, // manual reset event FALSE, // not-signalled TEXT("Global\{A9FBF998-F9E7-422b-9D4D-F6E38368DCF4}") ); 2.在Service开启的Thread中作whlie true循环 while(is_WMI_Continue) { dwWait = ::WaitForMultipleObjects(3, &g_hHandleWaitEvent[0], FALSE, 500); if ( WAIT_OBJECT_0 == dwWait ) { incBacklight(); } } Wnd端: 1. c#中引入OpenEvent和SetEvent的API /*Add by longlong 2009-03-26 For OpenEvent */ [DllImport("Kernel32.dll", SetLastError = true)] static extern IntPtr OpenEvent(uint dwDesiredAccess, bool bInheritHandle, string lpName); [DllImport("Kernel32.dll", EntryPoint = "SetEvent")] private static extern bool SetEvent(IntPtr hEvent); private const int EVENT_MODIFY_STATE = 0x0002; private const string strIncBackLight = "Global\{A9FBF998-F9E7-422b-9D4D-F6E38368DCF4}"; private const string strDecBackLight = "Global\{20A35CB2-3358-44fc-A48A-8B6990B348C9}"; /*End by longlong 2009-03-26 For OpenEvent */ 2.触发事件: IntPtr myEvent; myEvent = OpenEvent(EVENT_MODIFY_STATE, false, strIncBackLight); int err = Marshal.GetLastWin32Error(); if (myEvent.ToInt32() != 0) { bool success = SetEvent(myEvent); if (!success) ; } 相关联接: http://www.pinvoke.net/default.aspx/kernel32/OpenEvent.html OpenEvent的C#写法. http://blog.csdn.net/magictong/archive/2009/01/07/3726827.aspx 在Vista下使用Event 的方法.


 
流浪の小孩 @ 2009-03-05 14:05

使用BasedOn属性可继承其他的Style。



 
流浪の小孩 @ 2009-01-12 10:27

.NET Framework、System.Windows、标记和代码隐藏构成了 WPF 应用程序开发体验的基础。此外,WPF 还为创造具有丰富内容的用户体验提供了全面的功能。为了打包此内容并将其作为“应用程序”发送给用户,WPF 提供了一些类型和服务,它们统称为“应用程序模型”。该应用程序模型既支持开发独立应用程序,也支持开发浏览器承载的应用程序。
理解 Application 的一个关键概念在于,它为独立应用程序和浏览器承载的应用程序提供了一个通用的支持平台。例如,浏览器承载的应用程序可以使用前面的 XAML,以便在 XBAP 启动时自动导航到某个页面


 
流浪の小孩 @ 2008-12-22 11:28

目前做的一个WHS案子,其中的USB Maker用到一些Windows的API,写下来记得,不要丢了。
1。程序中需要在控制台输出:
Function A: system(cmdline);
Function B: ShellExecute(NULL, "cmdline")
Function C:使用管道,
SCURITY_ATTRIBUTES sa;

HANDLE hWrite, hRead;

sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&sa,0)) {
printf("Error On CreatePipe()\n");
return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if (!CreateProcess(NULL,"c:\windows\system32\cmd.exe /c ipconfig /all"
        ,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) {
        printf("Error on CreateProcess()\n");
        return FALSE;
}
CloseHandle(hWrite);

char buffer[4096] = {0};
DWORD bytesRead;
while (true) {
if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
Sleep(200);
}

printf("%s\n", buffer);
printf("%d", strlen(buffer));
return TRUE;


太忙了~~写不下去了



 
日历
网志分类
· 所有网志 (37)
· 流浪の心情 (3)
· 流浪的饭碗 (17)
· 流浪の感动 (1)
· 流浪の悟语 (1)
· 流浪の风景 (1)
· 流浪の路 (0)
· 流浪の影音 (13)
· 流浪の鞋 (1)
最新的评论
站内搜索
友情链接
· 我的歪酷 非非共享界
· 橘子の家
· 佳子的家

订阅 RSS

0012951

歪酷博客