一、前言
(1)2012年经济不景气,身为软件工程师这次我体会到了找工作的难。
炎热的七月,找工作真是件费劲的事情;一个下午接到好几个电话,问到的问题真的另人头疼。
(2)由于从车载行业转到互联网行业,且想拿高工资,我经历了转行的困境;
(3)上一次找工作时的容易,和这次找工作的困难使我更加体会到了什么是失败和落魄;
(4)如果正在进行网络营销的培训,而又重新入职,这让我力不重心;
(5)有的公司先HR,等HR花了1小时,HR面完再推给技术主管,又是等半个小时,我等不及了,撇下走人好几次;
4.、熟悉opencv编程。
二、题目及答案
线程池的使用
1、COM中的类型库 typeLib
2、COM的双向机制 COM的调度
解决答案请看我的文章: <<http://blog.youkuaiyun.com/chenyujing1234/article/details/7753863>>
3、Direct UI 无窗口
4、反编译
5、COM与ATL的关系
解决答案请看我的文章:<<http://blog.youkuaiyun.com/chenyujing1234/article/details/7753930>>
6、COM中分发机制 dispatch
7、COM在电脑上的用例
8、COM做过什么东西
9、vector、list、map之间区别?
(1)vector 动态数组,多用于容器,增加删除操最好在结尾处使用;
中的元素是顺序存放的,所以随机访问很快,但是要插入和删除,这个时间复杂度就很高了,vector初始化时有一个capacity,如果元素个数超出capacity,那vector就会重新分配一个新的空间,并把旧值复制到新的空间中,释法原空间,这个也要耗费很多时间,所以如果你知道元素的最大值,最好用reserve()函数初始最大空间,避免重新分配空间造成的时间。
(2)list 双向链表, 多用于从中间增加删除的操作,可以随机访问;
元素在内存中是分散的不连续的,它使用指针left,right,指向前一个元素和后一个元素。所以要删除和添加只要动动指针,所以很快,但是因为是不连续的所以要访问一个元素,你只能遍历序列。
(3)map 二路平衡查找树,哈希结构,用来映射;
元素是一个pair类型,具有public成员first和second,第一个的类型是key_type,第二个的类型是mapped_type,
两个的类型可以相同,
map用来当做关联式数组.索引操作会创建新元素然后再对数值部分赋值.make_pair是用来构造该map中的元素的,insert操作,如果是具有同样键的map,
那么只会在map中存在一个这样的键,因为map不允许重复键,并且元素是自动排序好的,默认是用一个less_than函数对象来排序的,还有一个默认存储器allocator吧.
10、网络I/O模型有几种?
window 下的套接字以来两种方式执行I/O操作,阻塞IO 非阻塞IO,一般默认使用的是阻塞IO 即线程会等待不会把控制权利立刻返回给程序,这就意为一个线程在某一个时候只能够去执行一个IO操作。
如果服务端想和多个客户端同时进行通信的话就要使用多线程编程,但是会增加开销,如果采用非阻塞IO程序不会等待,会立刻返回结果但是在大部分情况下返回的结果是错误的,并返回一个WSAEWOULDBLOCK的错误,所以程序员要不断的检测函数返回的代码以判断一个套接字何时可供读写。
为了避免麻烦 winsock 提供了不同的套接字模型对IO进行管理 select (),WSAAsyncSelect(),WSAEventSelect(),Overlapped()。
Windows操作系统提供了选择模型、异步选择模型、事件选择模型、重叠I/O模型和完成端口共五种I/O模型。每一种模型均适用于一种特定的应用场景。编程人员应综合考虑到程序的扩展性和可移植性等因素,做出自己的选择。
(1)选择模式(Select)
选择模型是Winsock中最常见的I/O模型。之所以称其为“select模型”,是由于它的“中心思想”便是利用select函数,实现对I/O的管理!最初设计该模型时,主要面向的是某些使用Unix操作系统的计算机,它们采用的是 Berkeley套接字方案。select模型已集成到Winsock 1.1中,它使那些想避免在套接字调用过程中被无辜“锁定”的应用程序,采取一种有序的方式,同时进行对多个套接字的管理。
(2 ) 异步选择模式(WSAAsyncSelect)
使用异步选择模型,应用程序可在一个套接字上,接收以Windows消息为基础的网络事件通知。具体的做法是在建好一个套接字后,调用WSAAsyncSelect函数。
(3 )事件选择模式(WSAEventSelect)
WSAEventSelect和WSAAsyncSelect模型类似,它也允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知。对于WSAAsyncSelect模型采用的网络事件来说,它们均可原封不动地移植到事件选择模型上。在用事件选择模型开发的应用程序中,也能接收和处理所有那些事件。该模型最主要的差别在于网络事件会投递至一个事件对象句柄,而非投递至一个窗口例程。
(4 ) 重叠I/O模式(Overlapped I/O)
在Winsock中,相比我们迄今为止解释过的其他所有I/O模型,重叠I/O模型使应用程序能达到更佳的系统性能。重叠模型的基本设计原理便是让应用程序使用一个重叠的数据结构,一次投递一个或多个Winsock I/O请求。针对那些提交的请求,在它们完成之后,应用程序可为它们提供服务。该模型适用于除Windows CE之外的各种Windows平台。模型的总体设计以Win32重叠I/O机制为基础。那个机制可通过ReadFile和WriteFile两个函数,针对设备执行I/O操作。
(5 ) 完成端口模式(Completion Port)
“完成端口”模型是迄今为止最为复杂的一种I/O模型。然而,假若一个应用程序同时需要管理为数众多的套接字,那么采用这种模型,往往可以达到最佳的系统性能!但不幸的是,该模型只适用于Windows NT和Windows 2000操作系统。
因其设计的复杂性,只有在你的应用程序需要同时管理数百乃至上千个套接字的时候,而且希望随着系统内安装的CPU数量的增多,应用程序的性能也可以线性提升,才应考虑采用“完成端口”模型。要记住的一个基本准则是,假如要为Windows NT或Windows 2000开发高性能的服务器应用,同时希望为大量套接字I/O请求提供服务(Web服务器便是这方面的典型例子),那么I/O完成端口模型便是最佳选择!
11、IRQL、可分页内存这些基础要熟悉
12、熟悉OD/WINDBG/IDA等反编译或调试工具
13、Window XP的开机过程
参考<<windowsxp登陆过程>>
14、熟悉 directshow 应用开发, 有一年以上directshow开发经验;
15.熟悉cuda、filter开发,ffmpeg二次开发; 有window 本地播放器开发经验; 有 mpc二次开发经验或裁剪过mp,熟悉转码相关技术者优先;
.熟悉h264,mpeg2算法者优先; 熟悉 avi, mkv,rmvb等媒体文件格式者优先; 了解 rtp/rtcp/rtsp/rtmp 等流媒体网络协议者优先;
了解 windows media , real , flash 等主流媒体 sdk 应用开发者优先;对com, atl, wtl, stl ,mfc了解,且能熟练运用,有二年以上开发经验者优先。
16、
17、 malloc与new的区别
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
函数。
我们先看一看malloc/free和new/delete如何实现对象的动态内存管理
- class Obj
- {
- public :
- Obj(void){ cout << “Initialization” << endl; }
- ~Obj(void){ cout << “Destroy” << endl; }
- void Initialize(void){ cout << “Initialization” << endl; }
- void Destroy(void){ cout << “Destroy” << endl; }
- };
- void UseMallocFree(void)
- {
- Obj *a = (obj *)malloc(sizeof(obj)); // 申请动态内存
- a->Initialize(); // 初始化
- //…
- a->Destroy(); // 清除工作
- free(a); // 释放内存
- }
- void UseNewDelete(void)
- {
- Obj *a = new Obj; // 申请动态内存并且初始化
- //…
- delete a; // 清除并且释放内存
- }
malloc/free和new/delete是等价的。
malloc/free管理动态内存。
如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。---(还没用过)
如果用delete释放“malloc申请的动态内存”,理论上讲
程序不会出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。
*********************************************************************************************
总之:
new 是个操作符,和什么"+","-","="...有一样的地位.
malloc是个分配内存的函数,供你调用的.
new是保留字,不需要头文件支持.
malloc需要头文件库函数支持.
new 建立的是一个对象,
malloc分配的是一块内存.
new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间
malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针.
-精通 c/c++,熟悉 linux下的编程,计算机基础知识扎实;熟悉常用开源软件,热爱技术研究;
-具有较大型软件构架设计和实现经验优先;研读过常用开源软件源代码优先。
18、熟悉网络通讯底层的开发,有完成端口应用于大规模人数在线的实际项目经验;
19、熟悉TCP/IP协议;
20、熟悉P2P/P2SP软件工作原理者优先;
21、用驱动去禁止某个进程启动;禁止访问某个IP地址;
22、用驱动分析网络数据。
参考文章:<<NDIS网络数据监控程序NDISMonitor(1)-----驱动程序(编译过程与源码讲解)>>
23、NDIS驱动有做过吗?
参考文章:<<NDIS网络数据监控程序NDISMonitor(1)-----驱动程序(编译过程与源码讲解)>>
24、Win7驱动开发与XP驱动开发的区别?
25、设备驱动与非设备驱动的区别?
26、线程A与线程B共享一块共同的堆区内存,防止A把内存释放了,而B还去访问它的机制是什么?
采用COM的引用计数方法。
例子
(1)原理
以下是一个引用计数的类IReferenceCounted,请注意在Drop()里有delete this;这里的this指从IReferenceCounted继承的类,
说明在从IReferenceCounted继承的类当计数减为0时会把自己销毁掉。
- class IReferenceCounted
- {
- public:
- //! Constructor.
- IReferenceCounted():ReferenceCounter(1)
- {
- }
- //! Destructor.
- virtual ~IReferenceCounted()
- {
- }
- unsigned int GetReferenceCount() const
- {
- return ReferenceCounter;
- }
- virtual void Grab() { ++ReferenceCounter; }
- virtual bool Drop()
- {
- --ReferenceCounter;
- if (!ReferenceCounter)
- {
- delete this;
- return true;
- }
- return false;
- }
- protected:
- //! The reference counter. Mutable to do reference counting on const objects.
- unsigned int ReferenceCounter;
- };
(2)继承方法
- class GUI_EXPORTS_CLASS IObject : public IReferenceCounted
- {
- protected:
- IObject();
- virtual ~IObject();
- public:
- /** @brief 获取GUI的类标识名. */
- const char * GetClassName() const;
- protected:
- char m_strClassName[64]; ///< 类名称
- };
- class GUI_EXPORTS_CLASS IGUIBase : public IEventReceiver,public IObject
- {
- };
(3)使用方法
(3、1)在赋值时
- void GUIFrameAnimator::SetImageList(ImageList * pImgList)
- {
- SAFECALL(m_pImageList)->Drop();
- m_pImageList = pImgList;
- SAFECALL(m_pImageList)->Grab();
- }
(3、2)刚生成一个对象时
- pWndPage3 = FrameWork::PushWndPageFromXml(".\\page3.xml", true);
- pWndPage3->Grab();
(3、3)在操作时,进行保护
- void UIManage::ParseEventHandlerNodeAndSetEventCallBackToGUI(IGUIBase * pGUI, TiXmlNode * pGUIXmlNode)
- {
- if (pGUI && pGUIXmlNode)
- {
- pGUI->Grab();
- //.....
- pGUI->Drop();
- }
- }
27、捕获数据包的接收比发送复杂,什么原理?
28、两年前做的网络TCP/IP,能不能说一说?
29、VS上的汇编调试方法及必要性?
30、USB驱动里的等待是等待什么?
等待上一个IRP发出后的执行返回。
31、CodeCproject上的RDP源码。
32、win7下的凭据验证都是用com做的。
http://msdn.microsoft.com/zh-cn/magazine/cc163489.aspx
33、DLL注入
参考:<<DLL的远程注入技术>> 、 <<DLL注入技术>>
34、两个键盘驱动同时加载时,民生银行的键盘驱动就会无效。
35、 IoQueueWorkItem的使用
36、驱动中的电源管理。
37、如果想加一层虚拟USB驱动,那么该加在哪一层上?
38、HTTP数据包怎么在NDIO识别?
39、COM接口里直接调用DLL导出函数会有什么问题吗?
参数是一个自定义的结构,参数如果是系统类型。好像也没事。。。
我写com,参数从来都是用bstr的
40、用什么方法可以将该控件弄成com组件?
41、Javascript中调用COM的方法?在COM组件中调用JavaScript函数的方法?
参考我的文章<<在javascript中使用com组件的方法>>;<<在COM组件中调用JavaScript函数>>
42、static修饰局部变量、全局变量、全局函数、类函数各有什么意义?
参考文章<<static作用(修饰函数、局部变量、全局变量)>>
43、类默认的函数有几种?
44、写出CString类。
45、类与struct的区别是什么?
关于使用大括号初始化
class和struct如果定义了构造函数的话,都不能用大括号进行初始化
如果没有定义构造函数,struct可以用大括号初始化。
eg:A a = {1, 2, 3};
如果没有定义构造函数,且所有成员变量全是public的话,class可以用大括号初始化。
关于默认访问权限
class中默认的成员访问权限是private的,而struct中则是public的。
关于继承方式
class继承默认是private继承,而struct继承默认是public继承。
为什么在C++中存在struct?很多人都会想到这是为了让C++和C兼容,那么问题就是如何使用C++中的struct和C兼容起来。
讨论一下结构(struct)与类(class)的区别,你认为结构(struct)有些什么作用,可以完全用类(class)取代么??
---------------------------------------------------------------
首先,讨论这个问题应该仅从语法上讨论,如果讨论不同人之间编程风格上的差异,那这个问题是没有答案的。毕竟不同的人偏好不同。
从语法上,在C++中(只讨论C++中)。class和struct做类型定义时只有两点区别:
(一)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;
(二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。
除了这两点,class和struct基本就是一个东西。语法上没有任何其它区别。
不能因为学过C就总觉得连C++中struct和class都区别很大,下面列举的说明可能比较无聊,因为struct和class本来就是基本一样的东西,无需多说。但这些说明可能有助于澄清一些常见的关于struct和class的错误认识:
(1)都可以有成员函数;包括各类构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数;
(2)都可以有一大堆public/private/protected修饰符在里边;
(3)虽然这种风格不再被提倡,但语法上二者都可以使用大括号的方式初始化:A a = {1, 2, 3};不管A是个struct还是个class,前提是这个类/结构足够简单,比如所有的成员都是public的,所有的成员都是简单类型,没有显式声明的构造函数。
(4)都可以进行复杂的继承甚至多重继承,一个struct可以继承自一个class,反之亦可;一个struct可以同时继承5个class和5个struct,虽然这样做不太好。
(5)如果说class的设计需要注意OO的原则和风格,那么没任何理由说设计struct就不需要注意。
(6)再次说明,以上所有说法都是指在C++语言中,至于在C里的情况,C里是根本没有“class”,而C的struct从根本上也只是个包装数据的语法机制。
---------------------------------------------------------------
最后,作为语言的两个关键字,除去定义类型时有上述区别之外,另外还有一点点:“class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。
46、C++的四大特性?
(1)、抽象
eg:用c++的变量和函数可以将抽象后的时钟属性设置如下:
数据抽象:
int Hour,int Minute,int Second
功能抽象:
ShowTime(),SetTime()
(2)、封装
eg:
- class Clock
- {
- public:
- void SetTime(int NewH,int NewM,int NewS);
- void SetTime();
- private:
- int Hour,Minute,Second;
- };
将时钟的数据和功能封装起来,构成一个时钟类
(3)、继承
C++语言提供了继承机制,允许程序员在保持原有类特征的基础上,进行更具体,更详细的说明。
eg:
- class 学生 :public 人
- {
- ……
- };
(4)、多态
在c++语言中,这种多态性可以通过强制多态、重载多态、类型参数多态、包含多态4种形式来实现。
eg:2中的两个SetTime()函数
47、继承类?一个CBase、CDerice
48、
3、熟练使用windows和linux开发工具,可以在windows和linux进行软件开发;
5、熟悉TCP/IP,Http等协议,能利用Socket API进行编程,熟悉ACE或者Boost::asio者优先,
具有网络编程经验和大规模并发服务器编程经验者优先。
| ||
工作要求:
|
工作职责:
| ||
工作要求:
|
工作职责:
| ||
工作要求:
|
工作职责:
| ||
工作要求:
|
- 本科及以上学历,计算机相关专业,2年以上软件开发类工作经验;
- 精通C/C++、STL,熟悉网络编程;
- 熟练使用VC,了解MFC/ATL/WTL等界面开发框架和界面设计机制;
- 深刻理解windows操作系统的内存管理、文件系统、进程线程调度;
- 熟悉流媒体、数字音乐、Web开发、Flash开发之一更佳;
- 具备良好的分析、设计、表达能力。
- 计算机相关专业本科以上学历,具备Unix/Linux下C/C++ 4年以上开发经验;
- 精通TCP/IP协议,进程间通讯编程,熟悉Unix/Linux下常用架构设计方法;
- 熟悉Unix/Linux操作系统原理,常用工具;
- 熟悉Mysql/Oracle等数据库管理、开发,SQL调优;
- 精通面向对象设计,熟悉UML等建模工具;
- 要求精通C++,对Java有一定的理解和实践经验熟悉面向对象的大型分布式系统设计与开发,了解中间件的技术以及基于中间件的开发模式;
- 全面的软件知识结构(操作系统、软件工程、设计模式、数据结构、数据库系统、网络安全);
- 具备良好的分析解决问题能力,能独立承担任务和有系统进度把控能力;
- 责任心强,良好的对外沟通和团队协作能力,主动,好学;
- 有以下经验者优先:Mysql数据库相关优化经验;大容量通信系统开发经验。
- 计算机相关专业本科以上学历,具备Unix/Linux下C/C++ 4年以上开发经验;
- 精通TCP/IP协议,进程间通讯编程,熟悉Unix/Linux下常用架构设计方法;
- 熟悉Unix/Linux操作系统原理,常用工具;
- 熟悉Mysql/Oracle等数据库管理、开发,SQL调优;
- 精通面向对象设计,熟悉UML等建模工具;
- 要求精通C++,对Java有一定的理解和实践经验熟悉面向对象的大型分布式系统设计与开发,了解中间件的技术以及基于中间件的开发模式;
- 全面的软件知识结构(操作系统、软件工程、设计模式、数据结构、数据库系统、网络安全);
- 具备良好的分析解决问题能力,能独立承担任务和有系统进度把控能力;
- 责任心强,良好的对外沟通和团队协作能力,主动,好学;
- 有以下经验者优先:Mysql数据库相关优化经验;大容量通信系统开发经验。
- 熟练使用C/C++编程语言;
- 三年以上Windows驱动开发经验;
- 熟悉Windows底层开发,熟悉DDK开发环境,熟练使用ollydbg, windbg等调试环境;
- 熟悉windows网卡驱动,磁盘驱动,PCI驱动等;
- 了解虚拟化技术者优先;
- 熟悉tcpip者优先;
- 了解业界新技术优先。
SD4-FPS客户端开发工程师(深圳) | ||
工作地点:深圳 | 职位类别:技术类 | 招聘人数:1人 |
工作职责:
| ||
工作要求:
|
SNG01-视频内核技术高级研发工程师(深圳) | ||
工作地点:深圳 | 职位类别:技术类 | 招聘人数:1人 |
工作职责:
| ||
工作要求:
|
ECC05-移动电商后台C++高级开发工程师 | ||
工作地点:深圳 | 职位类别:技术类 | 招聘人数:1人 |
工作职责:
| ||
工作要求:
|
OMG10-腾讯视频Windows客户端研发(深圳) | ||
工作地点:深圳 | 职位类别:技术类 | 招聘人数:2人 |
工作职责:
| ||
工作要求:
|
2、熟练掌握C/C++,熟练使用STL容器和算法;
3、熟悉usb传输协议,mfc编程;
4.、熟悉opencv编程。
3、 深入了解windows内核。
4、有驱动开发相关经验.,熟悉DDK开发,熟练使用windbg、softice调试驱动。
5、责任心强,承受压力能力强,具有良好的沟通能力及团队精神 。
1、虚拟串口怎么实现,如果真实的串口有数据,那么内存共享怎么做?
参考我的文章<<winCE中实现虚拟串口的方法>>
2、TCPMP的音频与视频的同步方法;
3、做的东西很多,但都不深入;
4、camera经7180出来的视频数据是什么格式的?
5、WCE的启动过程是什么?
6、用什么样的GPS