博文

WaitForSingleObject的用法(2006-10-07 12:35:00)

摘要:WaitForSingleObject的用法                      WaitForSingleObject的用法DWORD WaitForSingleObject(  HANDLE hHandle,  DWORD dwMilliseconds); 参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果时间是有信号状态返回WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT。 hHandle可以是下列对象的句柄:     Change notification 
Console input 
Event 
Job 
Memory resource notification 
Mutex 
Process 
Semaphore 
Thread 
Waitable timer WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回直才执行后面的代码。在这里举个例子: 先创建一个全局Event对象g_event:     CEvent g_event; 在程序中可以通过调用CEvent::SetEvent设置事件为有信号状态。 下面是一个线程函数MyThreadPro() UINT CFlushDlg::MyThreadProc( LPVOID pParam ) ......

阅读全文(64730) | 评论:8

C/C++面试经验总结(2006-10-01 15:19:00)

摘要:C/C++面试经验总结 (转) 文章来源:http://lijinghui.blog.bokee.net/
我前阵子去广州笔试了几家公司,颇有体会,现总结如下,望兄弟姐妹们能得到点什么。 1、要把c语言的基础打实 2、理解c++语言中一些概念以及它们之间的区别(需要深刻理解):        (1)局部变量 全局变量 静态变量 const常量 寄存器变量 宏定义的常量 static变量                   注:包括它们的内存分配区域,作用域,初始化等等        (2)理解malloc与new之间的区别,以及free与delete之间区别        (3)内联函数与宏定义的区别,它们各有什么优点        (4)内存分配有哪几种形式?分别为何?区别是什么?对编译速度影响是何?        (4)理解什么是重载、覆盖、隐藏,区别是何?可否举例?        (5)什么是多态?举个例子试试        (6)struct 和class有什么区别?c语言中的struct 和c++中的struct一样么?有什么区别?        (7)说说什么是野指针?野指针什么情况下出现?(没有初始化,delete后没有赋值为NULL)        (8)你熟悉预编译指令么?条件编译是用来做什么的?你会写么?        (9)sizeof()这个函数你理......

阅读全文(8991) | 评论:0

C/C++试题目大汇总 (2006-10-01 15:17:00)

摘要:C/C++ 程序设计员应聘常见面试试题深入剖析 1.引言

  本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面试题的内涵。文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见。

  许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?我们都觉得自己能,可是我们写出的strcpy很可能只能拿到10分中的2分。读者可从本文看到strcpy函数从2分到10分解答的例子,看看自己属于什么样的层次。此外,还有一些面试题考查面试者敏捷的思维能力。

  分析这些面试题,本身包含很强的趣味性;而作为一名研发人员,通过对这些面试题的深入剖析则可进一步增强自身的内功。

  2.找错题

  试题1:

void test1()
{
 char string[10];
 char* str1 = "0123456789";
 strcpy( string, str1 );
}
  试题2:

void test2()
{
 char string[10], str1[10];
 int i;
 for(i=0; i<10; i++)
 {
  str1[i] = 'a';
 }
 strcpy( string, str1 );
}
  试题3:

void test3(char* str1)
{
 char string[10];
 if( strlen( str1 ) <= 10 )
 {
  strcpy( string, str1 );
 }
}
  解答:

  试题1字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界;

  对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指......

阅读全文(181) | 评论:0

一个生成公章图片的简易工具(2006-09-30 19:53:00)

摘要:一个生成公章图片的简易工具

作者:金险飞

华中科技大学机械学院 下载源代码
  本例的运行结果图如下 一、功能与原理
    学习VC也没多久,将我做的这个小工具和大家分享一下。其主要功能就是可以自定义生成公章图形并保存为bmp图片,希望对大家有点用。具体实现的方法如下:

    步骤一:生成对话框工程,并加入相应的控件,图片的显示使用Picture控件;
    步骤二:定义生成图形所需要的参数;
    步骤三:通过参数定义,生成对应的Bitmap,再在Picture控件中显示该位图,具体实现参看源程序。
    步骤四:将生成的Bitmap保存为位图文件。

二、程序实现的关键点 (一)、需要对LOGFONT、LOGPEN和LOGBRUSH结构很了解,并能灵活应用,特别是在排列字体的过程中,对字体的旋转角度以及定位点的设置。 //绘制图章基本图形 void CMakeSealDlg::DrawSeal(CDC * MemDC) { int cx = 100; int cy = 100; POINT point; point.x = point.y = 5; LOGPEN logPen; logPen.lopnColor = ChooseColor(&m_nRadioColor); //绘制背景 logPen.lopnStyle = PS_NULL; logPen.lopnWidth = point; (*MemDC).SelectObject(CreatePenIndirect(&logPen)); (*MemDC).Rectangle(0,0,200,200); //设置绘笔 logPen.lopnStyle = PS_SOLID; (*MemDC).SelectObjec......

阅读全文(172) | 评论:0

DLL初学者指南(非MFC)(2006-09-30 19:52:00)

摘要:DLL初学者指南(非MFC)

环境: Visual C++ 2003, Windows
源代码下载:DLL_Project.rar -DLL Project的源代码及测试项目
原文出处: codeguru

本文只是(通过)编码让你看到并想知道代码是如何运行的。在本文中,假定你知道如何使用你的编译器特性,比如设置目录路径等等。 为了建立项目,请选择Win32 控制台项目(Win32 Console Application),并且在应用程序设置标签(the advanced tab)上,选择DLL和空项目选项。DLLs可能并不如你想像的那样难。首先写你的头文件(header file);称为DLLTutorial.h。这个文件与其它头文件一样,其中只是一些函数的原型。
#ifndef _DLL_TUTORIAL_H_
#define _DLL_TUTORIAL_H_
#include <iostream> #if defined DLL_EXPORT
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif extern "C"
{
DECLDIR int Add( int a, int b );
DECLDIR void Function( void );
}
#endif
前面两行指示编译器只包含这个文件一次。extern "C"告诉编译器该部分可以在C/C++中使用。 在VC++中这里有两个方法来导出函数:      1、使用__declspec,一个Microsoft定义的关键字。      2、创建一个模块定义文件(Module-Definition File即.DEF)。第一种方法稍稍比第二种方法简单些,但两种都工作得很好。 __declspec(dllexport)导出函数符号到在你的DLL中的一个存储类。当下面一行被定义时我定义DECLDIR来运行这个函数,
......

阅读全文(2519) | 评论:1

简单的文字识别 源代码(2006-09-28 21:58:00)

摘要:想要一个简单的文字识别vc源代码,从黑白图像中识别出文字,就是背景是白色,文字是黑色。只需简单识别英文26个大小写字母就够了。 
--------------------------------------------------------------------------------
 本回复被接受作为正确答案
   做过类似的程序,用摄像头采集类似于电话充值卡的图象,对其的卡号,密码区域进行识别,只识别数字。(0-9)但原理相同,你只需改一下字库即可使用。
   我先说下步骤:
   1. 字符和字符之间都有间隔,首先要根据间隔确定每个字符的区域(Rect).
   2. 然后一个一个象素地和标准字符比较。也就是比较 26 * 2 = 52 次,误差最小的,就认为是该字符。
(注:这种算法比较简单,易于理解,缺点就是效率不高,我用摄像头采集图象识别数字成功率为 98%以上。我曾请教过一位做这方面的专家,他称无论什么识别,影响识别的最重要因数就是源图象的质量。如果识别率不到 90% 请你仔细考虑源图象的采集质量,并重新考虑该方法的可行性。)
   附代码如下: /** 取得每个字符的边界***/
void CPOCRNuberDlg::GetCharRect(HBITMAP bit, RECT rect,int type, CDC* pDC )
{
    CString strTemp2;
    CBitmap bitmap;
    bitmap.m_hObject = CopyImage(bit,IMAGE_BITMAP,0,0,LR_MONOCHROME);     //CDC *pDC = GetDC();
    CDC mDC;
   
    mDC.CreateCompatibleDC( pDC );
&......

阅读全文(7682) | 评论:4

Windows下DLL编程技术及应用(2006-09-25 12:28:00)

摘要:Windows下DLL编程技术及应用 摘 要:
本文介绍了DLL技术在Windows编程中的基本运用方法及应用,给出了直接内存访问及端口I/O的两个实用DLL的全部源代码。
关键词: DLL Windows编程 内存访问 I/O

一 、引 言
由于Windows为微机提供了前所未有的标准用户界面、图形处理能力和简单灵便的操作,绝大多数程序编制人员都已转向或正在转向Windows编程。在许多用户设计的实际应用系统的编程任务中,常常要实现软件对硬件资源和内存资源的访问,例如端口I/O、DMA、中断、直接内存访问等等。若是编制DOS程序,这是轻而易举的事情,但要是编制Windows程序,尤其是WindowsNT环境下的程序,就会显得较困难。
因为Windows具有"与设备无关"的特性,不提倡与机器底层的东西打交道,如果直接用Windows的API函数或I/O读写指令进行访问和操作,程序运行时往往就会产生保护模式错误甚至死机,更严重的情况会导致系统崩溃。那么在Windows下怎样方便地解决上述问题呢?用DLL(Dynamic Link Libraries)技术就是良好途径之一。
DLL是Windows最重要的组成要素,Windows中的许多新功能、新特性都是通过DLL来实现的,因此掌握它、应用它是非常重要的。其实Windows本身就是由许多的DLL组成的,它最基本的三大组成模块Kernel、GDI和User都是DLL,它所有的库模块也都设计成DLL。凡是以.DLL、.DRV、.FON、.SYS和许多以.EXE为扩展名的系统文件都是DLL,要是打开Windows\System目录,就可以看到许多的DLL模块。尽管DLL在Ring3优先级下运行,仍是实现硬件接口的简便途径。DLL可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式,减少了编程设计上的不便;同时,一个DLL在内存中只有一个实例,使之能高效经济地使用内存;DLL实现的代码封装性,使得程序简洁明晰;此外还有一个最大的特点,即DLL的编制与具体的编程语言及编译器无关,只要遵守DLL的开发规范和编程策略,并安排正确的调用接口,不管用何种编程语言编制的DLL都具有通用性。例如在BC31中编制的DLL程序,可用于BC、VC、VB、Delphi等多种语言环境......

阅读全文(205) | 评论:0

Windows系统编程之进程间通信  (2006-09-25 12:12:00)

摘要: Windows系统编程之进程间通信  

作者:北极星2003
来源:看雪论坛
Windows 的IPC(进程间通信)机制主要是异步管道和命名管道。(至于其他的IPC方式,例如内存映射、邮槽等这里就不介绍了)
管道(pipe)是用于进程间通信的共享内存区域。创建管道的进程称为管道服务器,而连接到这个管道的进程称为管道客户端。一个进程向管道写入信息,而另外一个进程从管道读取信息。
异步管道是基于字符和半双工的(即单向),一般用于程序输入输出的重定向;命名管道则强大地多,它们是面向消息和全双工的,同时还允许网络通信,用于创建客户端/服务器系统。
一、异步管道(实现比较简单,直接通过实例来讲解)
实验目标:当前有sample.cpp, sample.exe, sample.in这三个文件,sample.exe为sample.cpp的执行程序,sample.cpp只是一个简单的程序示例(简单求和),如下:
代码: #include <iostream.h> int main() {   int a, b ;   while ( cin >> a >> b && ( a || b ) )     cout << a + b << endl ;   return 0; }
Sample.in文件是输入文件,内容:
32 433
542 657
0 0
要求根据sample.exe和它的输入数据,把输出数据重定向到sample.out
流程分析:实际这个实验中包含两个部分,把输入数据重定向到sample.exe 和把输出数......

阅读全文(214) | 评论:0

用WM_COPYDATA实现进程通信 vc(2006-09-25 12:04:00)

摘要:用WM_COPYDATA实现进程通信vc++技术
这个过于简单,实在凑不上几个字,所以干脆越简单越好吧! 用WM_COPYDATA的前提: 1,知道接收消息进程的句柄。 2,接收消息进程重载了WM_COPYDATA消息映射,能对其做出反应(否则不是发送端自作多情了?) 看过前提,得出结论:在自己写的两个进程间用WM_COPYDATA再好不过。 下面CODE几行就说明了一切。 获得句柄的方法,最简单的方法就是使用FindWindow,找窗口类,或者名,如果你觉得这样不把握,那就利用SetProp个窗口做个记号....(不说这些,跑踢儿了都) OK,开始写发送端代码: HWND hWnd = FindWindow(NULL,"MyApp"); if(hWnd!=NULL) {       COPYDATASTRUCT cpd; /*给COPYDATASTRUCT结构赋值*/       cpd.dwData = 0;       cpd.cbData = strlen("字符串");       cpd.lpData = (void*)"字符串";       ::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&cpd);//发送!       /*完事儿了!!*/ } 接收端重载ON_WM_COPYDATA消息映射函数(下面是手工所要加的,你最好还是用ClassWizard) afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct); ON_WM_COPYDATA()/*消息映射*/ BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
    &n......

阅读全文(3574) | 评论:0

Win 95下内存映射文件的工作原理及使用方法 (2006-09-25 12:00:00)

摘要:Win 95下内存映射文件的工作原理及使用方法


  一、引言
  WIN32 API为我们提供了一种进行文件操作的高效途径,即内存映射文件。内存映射文件允许我们在WIN32进程的虚拟地址空间中保留一段内存区域,把目标文件映射到这段虚拟内存之中。我们可以用存取内存数据的方式直接操作文件中的数据,就好像这些数据放在内存中一样。而实际上,我们并没有、也不需要调用API函数来读写文件,更不需要自己提供任何缓冲算法,操作系统将会为我们完成这些工作。使用内存映射文件能给程序开发工作提供极大的方便,程序的运行效率也非常高。
  内存映射文件在Windows NT和Windows95中的实现机制略有不同,下面主要介绍Windows95下内存映射文件的工作原理及使用方法。
  二、Windows95如何管理WIN32进程的内存空间
  内存映射文件的实现与Windows95的内存管理有密切的关系,因此先讨论一下Windows95在运行WIN32进程时的内存管理与划分。
  在Windows3.x下,所有Windows应用程序共享单一的地址空间,任何进程都能够对这一空间中属于其他进程的内存进行读写操作,甚至可以存取操作系统本身的重要数据。在这种环境中,编写不当的应用程序或者带有恶意的应用程序,就可能破坏其他程序的数据或代码,使得系统运行不正常,严重时甚至会导致系统崩溃。
  在实现了WIN32的操作系统Windows NT和Windows95中,每个WIN32进程拥有自己的地址空间,一个WIN32进程不能存取另一个进程地址空间的私有数据,两个进程可以用具有相同值的指针寻址,但所读写的只是它们各自的数据,这样就大大减少了进程之间的相互干扰,增强了系统的健壮性;另一方面,每个WIN32进程拥有4GB的地址空间,但并不代表它真正拥有4GB的实际物理内存,而只是操作系统利用CPU的内存分页功能提供的虚拟地址空间。在一般情况下,绝大多数虚拟地址并没有物理内存与之对应,在真正可以使用这些地址空间之前,还要由操作系统提供实际的物理内存。为虚拟地址提供实际物理内存的过程叫做&ldquo;提交&rdquo;(Commit)。在不同情况下,系统提交的物理内存的类型是不同的,可能是RAM,也可能是硬盘模拟的虚拟内存。......

阅读全文(123) | 评论:0