博文

SendMessage 进程间简单通信问题 vc++(2006-09-25 11:58:00)

摘要:SendMessage进程间简单通信问题 vc++
本例以两个VC Dialog application 为例用SendMessage进行两进程间简单通信: 主要API:FindWindow(LPCTSTR lpClassName,    LPCTSTR lpWindowName  ) //通过进程名得到进程handle SendMessage(UINT message, WPARAM wParam = 0, LPARAM lParam = 0) //The result of the message processing; its value depends on the message sent. 主程序 Server :其他均为默认. MFC 建立一Dialog 应用程序,工程名字:Server 添加一Button控件command,并与之对应的函数OnCommand 在ServerDlg.h里添加自己的消息:#define WM_COMM WM_USER+10 函数 OnCommand 添加代码: {  CString str="Client";
 CWnd *pWnd=CWnd::FindWindow(NULL,str);
 if(pWnd)
  pWnd->SendMessage(WM_COMM,0,0);//通过SendMessage的后两个参数 //WPARAM wParam, LPARAM lParam传递信息
  else MessageBox("FindWindow NULL"); } MFC另 建立一Dialog 应用程序,工程名字:Client 在 其 OnInitDialog里最后添加代码SetWindowText("Client"); 在Client.h里添加自己的消息:#define WM_COMM WM_USER+10 添加消息映射: BEGIN_MESSAGE_MAP(CSenderDlg, CDialog)
 //{{AFX_MSG_MAP(CSenderDlg)
 ON_WM_SYSCOMMAND()
 ON_W......

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

VC++中进程间相互通信的十一种方法 (2006-09-25 11:46:00)

摘要: VC++中进程间相互通信的十一种方法 出处:VC源动力 

进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:

  一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方

  另一个是地址空间,它包含所有的可执行模块或DLL模块的代码和数据。它还包含动态分配的空间。如线程堆栈和堆分配空间。每个进程被赋予它自己的虚拟地址空间,当进程中的一个线程正在运行时,该线程可以访问只属于它的进程的内存。属于其它进程的内存则是隐藏的,并不能被正在运行的线程访问。

  为了能在两个进程之间进行通讯,由以下几种方法可供参考:

  1、剪贴板Clipboard: 在16位时代常使用的方式,CWnd中提供支持

  2、窗口消息 标准的Windows消息以及专用的WM_COPYDATA消息 SENDMESSAGE()接收端必须有一个窗口

  3、使用共享内存方式(Shared Memory)

  a.设定一块共享内存区域

HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCSTR)

   产生一个file-mapping核心对象

LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAcess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap
);

  得到共享内存的指针

  b.找出共享内存

  决定这块内存要以点对点(peer to peer)的形式呈现每个进程都必须有相同的能力,产生共享内存并将它初始化。每个进程都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的错误代码是ERROR_ALREADY_EXIS......

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

自己敲的一个简单Thread例子 (vc6)(2006-09-24 22:37:00)

摘要://Demo1.cpp
//#include "stdafx.h"
#include "iostream.h"
//#include"process.h"//CreateThread(),ExitThread(),CloseHandle()
#include "windows.h"
#include "stdio.h" /////////////////////////////////////线程 例子1////////////////////////
/*
BOOL repeat=TRUE; //几个线程共享全局变量repeat
DWORD WINAPI MyThread1(LPVOID lpParameter)
{
 while(repeat)
 {
  printf("How are you? -----1-------MyThread1\n");
  Sleep(5); ////
 }
 DWORD exitCode;
 ExitThread(exitCode);
 
 return 0;
} DWORD WINAPI MyThread2(LPVOID lpParameter)
{
 while(repeat)
 {
  printf("Very Well! ------2------MyThread2\n");
  Sleep(1);///
 }
 DWORD exitCode;
 ExitThread(exitCode);
 
 return 0;
} DWORD WINAPI KillThread(LPVOID lpParameter)
{
 repeat=FALSE;
 return 0;
} int main(int argc,char* argv[])
{
 HANDLE ha......

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

USB摄像头编程(2006-09-24 21:44:00)

摘要:USB摄像头编程 (vcer.net)   注意包含头文件qedit.h,dshow.h 几个函数如下,其中有一些全局变量,程序写的充忙,也就不整理了。参考了一些资料。 BOOL initVideo(void) { AM_MEDIA_TYPE   amt; CoInitialize(NULL);                                     // COM的初期化         // ---- 输入计算的准备 ----         // 搜索输入装置         IBaseFilter  *pbf = NULL;         IMoniker * pMoniker = NULL;     ULONG cFetched;     // 制作装置的各个部分     CoCreateInstance( CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,                             &nbs......

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

在工具条中加入组合框控件(2006-09-24 21:42:00)

摘要:在工具条中加入组合框控件 vcer.net 代码内容 首先打开VC的工具条资源编辑器,如图一所示,在要加入组合框的地方加一个空按纽,如图一所示的第四个按纽,分配一个ID号,在本文的实例中为IDC_COMBOX。 工具条应该封装为一个类,组合框控件应该作为这个类的一个成员变量。生成一个以CToolBar为基类的的新类CComboToolBar,这可以用VC的类向导(ClassWizard)来实现,先生成一个以CToolBarCtrl为基类的新类CComboToolBar,然后在文件编辑器中打开ComboToolBar.h和ComboToolBar.cpp文件,把CComboToolBar基类改为CToolBar。新类生成后,加入成员变量CComboBox m_combobox。 然后把CMainFrame类中的工具条成员变量m_wndToolBar的类型由CToolBar改为CComboToolBar。编辑应用程序向导已经生成好的函数int CMainFrame::OnCreate (LPCREATESTRUCT lpCreateStruct),这个函数通常用来产生工具条和状态条,在创建工具条的函数后加入以下代码: CRect rect; //设置组合框的宽度,四个参数依次为控件在工具条中的索引号、ID号、风格、宽度 m_wndToolBar.SetButtonInfo(4, IDC_COMBOX, TBBS_SEPARATOR, 160 ); //得到组合框的位置 m_wndToolBar.GetItemRect(4, &rect); //设置组合框的高度 rect.bottom += 100; //COMBO HEIGHT; //创建组合框,四个参数依次为窗口风格、组合框位置、父窗口、ID号 if(!m_wndToolBar.m_combobox.Create (CBS_DROPDOWN|WS_VISIBLE|WS_TABSTOP|CBS_AUTOHSCROLL,rect, &m_wndToolBar, IDC_COMBOX))     return -1; //在组合框中加入字符串 m_wndToolBar.m_combobox.AddString("......

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

全屏显示视图的代码 vc(2006-09-24 21:39:00)

摘要:开启全屏显示的代码: void CViewerFrame::FullScreenShow()
{
 GetWindowPlacement(&m_OldWndPlacement);
 CRect WindowRect;
 GetWindowRect(&WindowRect);
 CRect ClientRect;
 RepositionBars(0,0xffff,AFX_IDW_PANE_FIRST,reposQuery,&ClientRect);
 ClientToScreen(&ClientRect);
 
 int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
 int nFullHeight=GetSystemMetrics(SM_CYSCREEN);
 m_FullScreenRect.left=WindowRect.left-ClientRect.left-1;
 m_FullScreenRect.top=WindowRect.top-ClientRect.top-1;
 m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth+2;
 m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeight+2;
 m_FullScreen=TRUE;
 
 WINDOWPLACEMENT wndpl;
 wndpl.length=sizeof(WINDOWPLACEMENT);
 wndpl.flags=0;
 wndpl.showCmd=SW_SHOWNORMAL;
 wndpl.rcNormalPosition=m_FullScreenRect;
 
 ShowWindow(SW......

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

vc常见控件推荐(2006-09-24 21:37:00)

摘要:VC 控件 教程

  1 常见控件推荐 以下向大家推荐一些比较有用的控件: 1.1 MsChart控件 控件名称:Microsoft Chart Control 6.0 (sp4) 控件类:CMsChart 控件简介:MsChart是微软制作的功能强大的图表工具,用它可以很方便的建立各种图表,包括各种二维、三维的饼图、折线图、直方图、折线图、面积图等。 应用图例: 图40 MsChart控件应用图例 1.2 DataGrid控件 控件名称:Microsoft DataGrid Control 6.0 (sp5) 控件类:CDataGrid 控件简介:DataGrid控件是由微软提供的数据表格控件,需要与ADODC控件配合使用。通过使用DataGrid控件,可以很方便地实现数据表记录的浏览、增加、删除和修改功能。 应用图例: 图41 DataGrid控件应用图例 1.3 MsComm控件 控件名称:Microsoft Communications Control version 6.0 控件类:CMsComm 控件简介:MSComm 控件提供了一系列标准通讯属性和方法,使用它可以建立起应用程序与串行端口的联接。 应用图例: 图42 MsComm控件应用图例 以上画面来源于笔者自行制作的手机通讯软件FreePhone,其底层采用MsComm控件,感兴趣的读者可以参见http://bluejoe.yeah.net。 1.4 Web浏览器控件 控件名称:Web浏览器控件 控件类:CWebBrowser2 控件简介:Web浏览器相信大家再也熟悉不过了,IE浏览器就内嵌了一个Web浏览器控件,这也就是为什么腾讯浏览器与IE如此相似的原因。通过使用Web浏览器控件,可以很方便地实现网页页面的浏览和显示。 应用图例: 图43 Web浏览器控件应用图例 1.5 ActiveMovie控件 控件名称:ActiveMovie Control Object 控件类:CActiveMovie3 控件简介:ActiveMovie是Microsoft公司开发的视频播放控件。该控件内嵌了Microsoft MPEG音频解码器和Microsoft MPEG视频解码器,播......

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

生死MFC程序:MFC 封装(2006-09-24 21:34:00)

摘要:生死MFC程序 (白乔) 关键词  MFC 封装
摘要
正文 MFC将大部分函数都进行了封装,程序员只要改写部分重要的virtual函数即可,这往往使初学者摸不着头脑,连个WinMain函数都看不到,程序从哪开始从哪结束?基本的条理搞不清,永远也不会有提高。下面简单讲下基运行过程. 1,CMyWinApp theApp  程序从这里开始 2,_tWinMain()   在APPMODUL.CPP 它实际上只调用AfxWinMain函数 3,AfxWinMain()   WINAMIN.CPP,去掉一些次要信息,它作的事就是: int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { int nReturnCode = -1; CWinThread* pThread = AfxGetThread(); CWinApp* pApp = AfxGetApp();  ->实际上就是取得CMyWinApp对象指针 AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow) pApp->InitApplication() pThread->InitInstance() pThread->Run(); AfxWinTerm(); return nReturnCode; } 其中: AfxGetApp();   AFXWIN.CPP中 InitApplication()  AFXWIN.CPP中 InitInstance()   AFXWIN.CPP中 实际上AfxWinMainy就是调用: CWinApp::InitApplication 因为我们程序没有改写它 CMyWinApp::InitInstance  我们改写了它且必须改写它,为什么?看源码就能证明一切 BOOL CWinApp::InitIns......

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

预编译头文件(precompiled header)(2006-09-24 21:31:00)

摘要:预编译头文件 (vcer.net)
正文 今天在改一个很大的程序,慢慢看,慢慢改。突然发现一个.c文件,里面什么也没有, 就几个头文件,我一看,我靠,这不是把简单的问题搞复杂了吗,随手删掉那个c文件。 结果不能编译了,我靠: fatal error C1083: Cannot open precompiled header file: \'Debug/v13_3.pch\': No such file or directory 怎么rebuild all都不行。 上网查了一下,才搞懂了: ----------------总结------ 如果工程很大,头文件很多,而有几个头文件又是经常要用的,那么 1。把这些头文件全部写到一个头文件里面去,比如写到preh.h 2。写一个preh.c,里面只一句话:#include "preh.h" 3。对于preh.c,在project setting里面设置creat precompiled headers,对于其他 .c文件,设置use precompiled header file // 哈哈 我试了一下,效果很明显,不用precompiled header,编译一次我可以去上个厕所,用 precompiled header,编译的时候,我可以站起来伸个懒腰,活动活动就差不多啦 ---------转载的文章---------- 预编译头的概念: 所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是 以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的 C/C++代码--------甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会 被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。注意生成预编 译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及 时清理那些没有用的预编译头文件。 也许你会问:现在的编译器都有Time stamp的功能,编译器在编译整个工程的时候,它 只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过 的文件。那么为什么还要预编译头文件呢?答案在......

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

白乔原创:VC之美化界面篇(2006-09-24 21:23:00)

摘要:   白乔原创:VC之美化界面篇 http://vcer.net/showTip.jsp?tipid=1046595482643 关键词界面美化
摘要 本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础: 1. 大致了解MFC框架的基本运作原理; 2. 熟悉Windows消息机制,熟悉MFC的消息映射和反射机制; 3. 熟悉OOP理论和技术; 本文根据笔者多年的开发经验,并结合简单的例子一一展开,希望对读者有所帮助。
  正文 1. 美化界面之开题篇 相信使用过《金山毒霸》、《瑞星杀毒》软件的读者应该还记得它们的精美界面:   图1 瑞星杀毒软件的精美界面 程序的功能如何如何强大是一回事,它的用户界面则是另一回事。千万不要忽视程序的用户界面,因为它是给用户最初最直接的印象,丑陋的界面、不友好的风格肯定会影响用户对软件程序的使用。 “受之以鱼,不若授之以渔”,本教程并不会向你推荐《瑞星杀毒软件》精美界面的具体实现,而只是向你推荐一些常用的美化方法。 2. 美化界面之基础篇 美化界面需要先熟悉Windows下的绘图操作,并明白Windows的幕后绘图操作,才能有的放矢,知道哪些可以使用,知道哪些可以避免…… 2.1 Windows下的绘图操作 熟悉DOS的读者可能就知道:DOS下面的图形操作很方便,进入图形模式,整个屏幕就是你的了,你希望在哪画个点,那个地方就会出现一个点,红的、或者黄的,随你的便。你也可以花点时间画个按钮,画个你自己的菜单,等等…… Windows本身就是图形界面,所以Windows下面的绘图操作功能更丰富、简单。要了解Windows下的绘图操作,要实现Windows界面的美化,就必须了解MFC封装的设备环境类和图形对象类。 2.1.1 设备环境类 Windows下的绘图操作说到底就是DC操作。DC(Device Context设备环境)对象是一个抽象的作图环境,可能是对应屏幕,也可能是对应打印机或其它。这个环境是设备无关的,所以你在对不同的设备输出时只需要使用不同的设备环境就行了,而作图方式可......

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