博文
VC中的常用的20个方法 (2006-10-15 10:45:00)
摘要:VC中的常用的20个方法
一、打开CD-ROM
mciSendString("Set cdAudio door open wait",NULL,0,NULL);
二、关闭CD_ROM
mciSendString("Set cdAudio door closed wait",NULL,0,NULL);
三、关闭计算机
OSVERSIONINFO OsVersionInfo; //包含操作系统版本信息的数据结构
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OsVersionInfo); //获取操作系统版本信息
if(OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
//Windows98,调用ExitWindowsEx()函数重新启动计算机
DWORD dwReserved;
ExitWindowsEx(EWX_REBOOT,dwReserved); //可以改变第一个参数,实现注销用户、
//关机、关闭电源等操作
// 退出前的一些处理程序
}
四、重启计算机
typedef int (CALLBACK *SHUTDOWNDLG)(int); //显示关机对话框函数的指针
HINSTANCE hInst = LoadLibrary("shell32.dll"); //装入shell32.dll
SHUTDOWNDLG ShutDownDialog; //指向shell32.dll库中显示关机对话框函数的指针
if(hInst != NULL)
{
//获得函数的地址并调用之
ShutDownDialog = (SHUTDOWNDLG)GetProc......
FileMapServer_FileMapClient(2006-10-12 13:56:00)
摘要:
// FileMapServerDlg.h : header file
//
#define WM_MYMESSAGE WM_USER+1
#if !defined(AFX_FILEMAPSERVERDLG_H__212D073F_1A13_43B5_B431_0B5546BD2DB5__INCLUDED_)
#define AFX_FILEMAPSERVERDLG_H__212D073F_1A13_43B5_B431_0B5546BD2DB5__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/////////////////////////////////////////////////////////////////////////////
// CFileMapServerDlg dialog
typedef struct _UserInfo{
char name[20];
char age[20];
char telecode[20];
char address[20];
}UserInfo;
class CFileMapServerDlg : public CDialog
{
// Construction
public:
CFileMapServerDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CFileMapServerDlg)
enum { IDD = IDD_FILEMAPSERVER_DIALOG };
CString m_name;
CString m_age;
CString m_telecode;
CString m_address;
UserInfo m_info;
HANDLE m_hMapObject;
LPVOID m_hMapView;
//}}AFX_DATA
// ......
DDE实现进程间数据通信的实现(2006-10-12 10:38:00)
摘要:Visual C++进程间数据通信的实现
在Windows系统中,各个应用程序(进程)之间常常需要交换、传递数据,这就要解决进程间的数据通信问题。在最初的16位Windows3.x系统中,所有Windows应用程序共享单一地址,任何进程都能够对这一共享地址空间的数据进行读写操作。随着Windwos98、WindowsNT、Windows2000等32位的操作系统的出现,规定每个进程都有自己的地址空间,一个Windows进程不能存取另一个进程的私有数据,也就是说,虽然两个进程可以用具有相同值的指针寻址,但所读写的只是它们各自的数据,这样就减少了进程之间的相互干扰。那么上述技术的采用是否意味着各个应用程序之间不能进行数据交换了呢?答案当然是否定的,强大的Windows系统早已为我们设计了很多方案来解决进行间的通信问题,这里我们只探讨如何通过动态数据交换(DDE)方法实现进程间的数据通信。
本实例程序功能如下,服务器端有两个数据项,一个是输入的字符串,另一个是定时增加的整数。运行该程序的两个实例后,两个程序就可以建立DDE连接,实现数据的传递,并将另外一个实例传送过来的数据显示出来。下图为程序编译运行后的效果图:
图一、DDE方法实现进程间数据通信程序的界面效果图
一、实现方法
自从微软推出Windows操作系统以来,动态数据交换(DDE)就已经成为Windows的部分,并且很多Windwos应用程序都使用了DDE技术来实现进程之间的数据交换。DDE是建立在Windows内部消息系统、全局和共享全局内存基础上的一种协议,用来协调Windows应用程序之间的数据交换和命令调用,它已经成为应用程序之间通信的一种常用方法。
DDE应用程序可以分为四种类型:客户类型、服务器类型、客户/服务器类型和监视器。DDE会话发生在客户应用程序和服务器应用程序之间。客户应用程序从服务器应用程序请求数据或服务,服务器应用程序响应客户应用程序的数据或服务请求。客户/服务器应用程序是既可以发出请求,又可以提供信息,监视器应用程序则是用语调试的目的。
DDE协议使用三级树型命名:服务(SERVICE)、主题(TOPIC)和......
进程查看-ProcessInfoDlg(2006-10-12 10:14:00)
摘要://////////////////////////////////////////////
// InfoDlg.h : header file
#if !defined(AFX_INFODLG_H__DCEFCEEC_BB17_45D2_ABB1_EEFA7805B27C__INCLUDED_)
#define AFX_INFODLG_H__DCEFCEEC_BB17_45D2_ABB1_EEFA7805B27C__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/////////////////////////////////////////////////////////////////////////////
// CInfoDlg dialog
class CInfoDlg : public CDialog
{
// Construction
public:
CInfoDlg(CWnd* pParent = NULL); // standard constructor
DWORD dwSize,cntUsage,processID,defaultHeapID,moduleID,cntThreads,parentProcessID,dwFlags;
long classBase;
// Dialog Data
//{{AFX_DATA(CInfoDlg)
enum { IDD = IDD_INFORMATION };
CString m_strExeFile;
//}}AFX_DATA
// Overri......
drawLine-多线程画线(2006-10-09 21:54:00)
摘要:// drawLineView.h : interface of the CDrawLineView class
//
/////////////////////////////////////////////////////////////////////////////
#include <afxmt.h>
#if !defined(AFX_DRAWLINEVIEW_H__4E81C72C_AC7A_46F7_AEC0_D20264EFB297__INCLUDED_)
#define AFX_DRAWLINEVIEW_H__4E81C72C_AC7A_46F7_AEC0_D20264EFB297__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define THREAD_NUM 3//线程个数
typedef struct{
int m_nID;//标识是第几个启动的线程
HWND m_hWnd;//为了画图,需传入视图类CDrawLineView的窗口句柄
}PARAM;
UINT DrawLine(LPVOID);//线程入口函数
class CDrawLineView : public CView
{
protected: // create from serialization only
CDrawLineView();
DECLARE_DYNCREATE(CDrawLineView)
// Attributes
public:
CDrawLineDoc* GetDocument();
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDrawLineView)
public:
virtual void OnDraw(CDC* pDC);......
MutilThread例子-4窗口显示(2006-10-09 21:20:00)
摘要:
// Multi1.cpp : 多线程例子
//
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <process.h>
typedef struct
{
HWND hwnd ;
int cxClient ;
int cyClient ;
int cyChar ;
BOOL bKill ;
}PARAMS, *PPARAMS;
HANDLE hThread[4];
unsigned long __stdcall Thread1 (PVOID pvoid);
unsigned long __stdcall Thread2 (PVOID pvoid);
unsigned long __stdcall Thread3 (PVOID pvoid);
unsigned long __stdcall Thread4 (PVOID pvoid);
LRESULT APIENTRY WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static char szAppName[] = "MultiThread" ;
HWND hwnd ;
MSG msg ;
WNDCLASSEX wndclass ;
wndclass.cbSize = sizeof (wndclass) ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ; /////
wndclass.cbClsExtra = 0 ;
......
我的CAN_mex(2006-10-09 20:35:00)
摘要:
/* $Revision: 1.3 $ */
// Automatically generated by MATLAB Project Wizard version 1.0
//
// This is the gateway routine for a MATLAB Math/Graphics Library-based
// C MATLAB MEX File.
/*
本文的实例的开发和运行环境为 V i s u a l++6.0
和 Matlab 6.5,为了方便读者阅读,将yplot.c 文件
的主要程序代码源代码整理如下
link:
kernel32.lib user32.lib gdi32.lib winspool.lib
libmx.lib libmex.lib libmatlb.lib libmat.lib
>>myplot(1:1000,randn(1,1000))
*/
#include "mex.h"
#include "windows.h"
#include "HKCAN.h"
//////////////////////////////////////////////////CAN变量定义////////////////
DWORD dwReadThreadID_can; //thread id
DWORD dwSendThreadID_can; //thread id
BOOL ReadThreadFlag_can=1; //thread flag
BOOL SendThreadFlag_can=1; //thread flag
DWORD dwShowCanThreadID; //thread id
BOOL ShowCanThreadFlag=1; //thread flag
BOOL bInitFlag;
HANDLE hReadEvent_port1[2]; //event handle
HANDLE hReadFrameThread_can; //thread handle ......
C语法点滴(2006-10-09 19:26:00)
摘要:C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串。以下是用itoa()函数将整数转 换为字符串的一个例子:
# include
void main (void)
{
int num = 100;
char str[25];
itoa(num, str, 10);
printf("The number 'num' is %d and the string 'str' is %s. \n" ,
num, str);
}
itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是要写入转换结果的目标字符串,第三个参数是转移数字时所用 的基数。在上例中,转换基数为10。10:十进制;2:二进制...
下列函数可以将整数转换为字符串:
----------------------------------------------------------
函数名 作 用
----------------------------------------------------------
itoa() 将整型值转换为字符串
itoa() 将长整型值转换为字符串
ultoa() 将无符号长整型值转换为字符串
......
用VC++6.0实现PC机与单片机之间串行通信的方法(2006-10-08 20:45:00)
摘要:用VC++6.0实现PC机与单片机之间串行通信的方法
摘 要 详细介绍了在Windows环境下应用VC++实现PC机与单片机的几种串行通信方法,给出了用Visual C++6.0编写的PC机程序和用C51编写的单片机通信程序。经实际应用系统运行稳定可靠。
--------------------------------------------------------------------------------
工业控制领域(如DCS系统),经常涉及到串行通信问题。为了实现微机和单片机之间的数据交换,人们用各种不同方法实现串行通信,如DOS下采用汇编语言或C语言,但在Windows 环境下却存在一些困难和不足。在Windows操作系统已经占据统治地位的情况下(何况有些系统根本不支持DOS如Windows2000)开发Windows 环境下串行通信技术就显得日益重要。
VC++6.0是微软公司于1998年推出的一种开发环境,以其强大的功能,友好的界面,32位面向对象的程序设计及Active X的灵活性而受广大软件开发者的青睐,被广泛应用于各个领域。应用VC++开发串行通信目前通常有如下几种方法:一是利用Windows API通信函数;二是利用VC的标准通信函数_inp、_inpw、_inpd、_outp、_outpw、_outpd等直接对串口进行操作;三是使用Microsoft Visual C++的通信控件(MSComm);四是利用第三方编写的通信类。以上几种方法中第一种使用面较广,但由于比较复杂,专业化程度较高,使用较困难;第二种需要了解硬件电路结构原理;第三种方法看来较简单,只需要对串口进行简单配置,但是由于使用令人费解的VARIANT 类,使用也不是很容易;第四种方法是利用一种用于串行通信的CSerial类(这种类是由第三方提供),只要理解这种类的几个成员函数,就能方便的使用。笔者利用CSerial类很方便地实现了在固定式EBM气溶胶灭火系统分区启动器(单片机系统)与上位机的通信。以下将结合实例,给出实现串行通信的几种方法。
1 Windows API通信函数方法
与通信有关的Windows API函数共有26个,但主要有关的有:
CreateFile() 用 “comn”(n为串口号)作为文件名就可以打开串口。
......
Visual C++线程同步技术剖析 (2006-10-07 12:46:00)
摘要:Visual C++线程同步技术剖析
摘要: 多线程同步技术是计算机软件开发的重要技术,本文对多线程的各种同步技术的原理和实现进行了初步探讨。
关键词: VC++6.0; 线程同步;临界区;事件;互斥;信号量; 正文
使线程同步
在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解。正常情况下对这种处理结果的了解应当在其处理任务完成后进行。
如果不采取适当的措施,其他线程往往会在线程处理任务结束前就去访问处理结果,这就很有可能得到有关处理结果的错误了解。例如,多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题。如果一个线程负责改变此变量的值,而其他线程负责同时读取变量内容,则不能保证读取到的数据是经过写线程修改后的。
为了确保读线程读取到的是经过修改的变量,就必须在向变量写入数据时禁止其他线程对其的任何访问,直至赋值过程结束后再解除对其他线程的访问限制。象这种保证线程能了解其他线程任务处理结束后的处理结果而采取的保护措施即为线程同步。
线程同步是一个非常大的话题,包括方方面面的内容。从大的方面讲,线程的同步可分用户模式的线程同步和内核对象的线程同步两大类。用户模式中线程的同步方法主要有原子访问和临界区等方法。其特点是同步速度特别快,适合于对线程运行速度有严格要求的场合。
内核对象的线程同步则主要由事件、等待定时器、信号量以及信号灯等内核对象构成。由于这种同步机制使用了内核对象,使用时必须将线程从用户模式切换到内核模式,而这种转换一般要耗费近千个CPU周期,因此同步速度较慢,但在适用性上却要远优于用户模式的线程同步方式。
临界区
临界区......