博文
VC6.0调用ASP.NET WebService实例(2009-04-12 12:50:00)
摘要:
开发平台:
WinXP SP3+IIS5.1+IE7+Visual Studio 2005+Visual Studio 6.0+ MS SOAP Toolkit 3.0
一.创建ASP.NET WebService
Visual Studio 2005à文件à新建à网站àASP.NET Web服务项目WebServiceDemo。
以下为Service.cs代码清单:
using System;
using System.Web;
using System.ComponentModel;
using System.Web.Services;
using System.Web.Services.Protocols;
[WebService(Namespace = "http://Fantasy/WebServiceDemo/")]
[System.Web.Services.Protocols.SoapRpcService]
public class Service : System.Web.Services.WebService
{
public Service()
{
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
[WebMethod]
public int AddNumbers(int NumberOne,int NumberTwo)
{
return NumberOne + NumberTwo;
}
}
生成à生成网站à发布网站。
二.为WebServiceDemo创建虚拟目录WebServiceDemo
开始à设置à控制面板à管理工具àInternet信息服务à默认网站à右击......
Xtreme Toolkit中的CXTPReportControl类(2009-04-06 22:02:00)
摘要:一.CXTPReportControl的Data Members(Protected:m_)
(Xtreme Toolkit Pro v12.0-> Report Control->Classes-> CXTPReportControl Class-> CXTPReportControl Data Members)
class CXTPReportControl : public CWnd;
The CXTPReportControl class provides an implementation of the Report control.
二.CXTPReportControl相关的几个Classes
(Xtreme Toolkit Pro v12.0-> Report Control->Classes-> CXTPReportControl Class)
class CXTPReportColumn;
Represents report column item with its properties and operations.
CXTPReportColumn* CXTPReportControl::GetFocusedColumn() const;
class CXTPReportColumns;
This class is a collection of report columns objects, each of which can be referred to by its zero-based index.
CXTPReportColumns* CXTPReportControl::GetColumns() const;
class CXTPReportHeader;
A report header is a part of the report window positioned above columns of text or numbers. It contains a title for each column, and it can be divided into parts. The user can drag the dividers that separate......
列表视图ListCtrl事件小结(2009-04-06 12:58:00)
摘要:Listview即Report风格的Listctrl。
一.向ListView添加Records
(1)CListCtrl::InsertColumn——Inserts a new column in a list view control.
int InsertColumn( int nCol, const LVCOLUMN* pColumn );
int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1 );
(2)CListCtrl::InsertItem——This method inserts an item into the list view control.
int InsertItem( const LVITEM* pItem );
int InsertItem( int nItem, LPCTSTR lpszItem );
int InsertItem( int nItem, LPCTSTR lpszItem, int nImage );
int InsertItem( UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam );
关于第四种InsertItem的参数ListView的LVITEM结构。参见MSDN:Platform SDK Document->User Interface Servies->Windows Common Controls->List-View Controls->List-View Control Structures->LVITEM.
(3)CListCtrl::SetItemText——This method changes the text of a list view item or subitem.
BOOL SetItemText( int nItem, int nSubItem, LPCTSTR lpszText );
(4)示例代......
VC拆分字符串(2009-03-30 13:55:00)
摘要:一._tcstok函数
在MFC中,一个CString str=“ab ac dd PM”,怎么把他分开成ab和ac和dd和PM这四个字符串,类似string的split的功能?
_tcstok声明头文件:<TCHAR.H>
char* _tcstok( char* strToken, const char* strDelimit );
该函数是可以从一个CString串中,根据提供的分隔符,截取并返回一个一个的Token;
参数:
strToken: 是一个要分析的串;这个串中包含一个或者多个Token,当然还有分隔符,也有可
能有其他的字符;
strDelimit: 是分隔符;根据分隔符把strToken中的Token分析出来;
//==============test1:_tcstok===============
//将以空格符为分隔符对str进行分割
CString str = _T("192.168.89.125");
TCHAR seps[] = _T(".");
TCHAR* token = _tcstok( (LPTSTR)(LPCTSTR)str, seps );
while( token != NULL )
{
printf("str=%s token=%s\n",str,token);
token = _tcstok( NULL, seps );
}
//==============test1:end==================
执行结果如下:
str=192 token=192
str=192 token=168
str=192 token=89
str=192 token=125
第一次调用的时候,函数会忽略出现在strToken串开始的分隔符,返回找到的Token指针,用空字符(NULL character )替换掉已经查找到的部分(包括分隔符)并把“新”串保存到一个Static变量中(系统来完成);
如果下次调......
菜单的事件响应和状态响应(2009-03-29 20:30:00)
摘要:ON_COMMAND是点了按钮或菜单项后的响应消息,
ON_UPDATE_COMMAND_UI是用来表示对应的按钮和菜单项的状态的响应消息.
比如WINDOWS自带的记事本程序,它的"格式"菜单下有个"自动换行",那么在编写记事本这个程序时,
对文本进行自动换行或不自动换行的操作就要放在ON_COMMAND消息响应函数里,而"自动换行"菜单项左边是否打勾的操作则放在ON_UPDATE_COMMAND_UI响应函数里.
下面新建一个单文档MFC工程,然后添加菜单demo|ShowSelect,其ID为ID_DEMO_SHOW。
右击“ShowSelect”进入ClassWizard,我们可以看到该菜单有两个待选消息响应:
1. COMMAND,对应ON_COMMAND消息
2. UPDATE_COMMAND_UI,对应ON_UPDATE_COMMAND_UI消息
选择Messages:COMMAND,然后“Add Function”,ON_COMMAND(ID_DEMO_SHOW, OnDemoShow)
选择Messages: UPDATE_COMMAND_UI,然后“Add Function”, ON_UPDATE_COMMAND_UI(ID_DEMO_SHOW, OnUpdateDemoShow)
现在添加简单的菜单事件响应:点击demo|ShowSelect菜单后,弹出对话框,提示“您刚才点击勾选了"demo|ShowSelect"菜单!”,同时使菜单条前打勾;再次点击此菜单后,提示“您刚才点击退选了\"demo|ShowSelect\"菜单!”,并且菜单条前的勾将消失。
为了记录菜单的点击情况,需要为MainFrm添加BOOL bCheck辅助变量,并初始化bCheck=FALSE;。
//一次勾选,二次退选
void CMainFrame::OnDemoShow()
{
// TODO: Add your command handler code here
&......
利用SendMessage函数向指定窗口发送消息(2009-03-17 15:35:00)
摘要:
1.新建一个Dialog based的MFC工程MSG
2.在资源管理器中打开对话框IDD_MSG_DIALOG,在其中放置一下控件:
(1)ID号为ID_SENDMSG的发送消息按钮(原IDOK按钮)
(2)ID号为IDCANCEL的取消按钮
(3)ID号为IDC_STATIC的静态控件,CAPTION为“您发送消息的次数统计:”
(4)ID号为IDC_EDIT的编辑控件。
3.在MSGDlg.h头文件中自定义消息:#define WM_COUNT_MSG WM_USER+100
4.在MSGDlg.h头文件中添加消息处理函数的声明
afx_msg LRESULT OnCountMsg(WPARAM,LPARAM);
5. 在CMSGDlg类实现文件MSGDlg.cpp中的消息映射表中加入自定义消息映射:
BEGIN_MESSAGE_MAP(CMSGDlg, CDialog)
//{{AFX_MSG_MAP(CMSGDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_COUNT_MSG,OnCountMsg)
ON_BN_CLICKED(ID_SENDMSG, OnSendmsg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
6.在CMSGDlg类实现文件MSGDlg.cpp中定义“发消息”按钮消息响应
void CMSGDlg::OnSendmsg()
{
// TODO: Add your control notification handler code here
static int count;
&nb......
动态链接库DLL的创建和使用(2009-03-15 21:13:00)
摘要:1.新建一个WorkSpace—DllSample。
2.Add New Project to Workspace,新建工程MyDll,工程类型选择“Win32 Dynamic-Link Library”,选择“A DLL that exports some symbols”,即要求VC++自动生成一些导出符号代码。
(1) 在头文件MyDll.h中添加导出变量、函数和类的声明。
//MyDll.h
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
//如果要声明常量,直接使用#define
//声明要导出的变量
extern MYDLL_API int nDllExportVar;
//声明要导出的函数
MYDLL_API void ExportFunc(LPCTSTR pszContent);
//声明要导出的类
class MYDLL_API MyDllClass
{
public:
MyDllClass();
};
我们观察ProjectsàSettingsàC/C++àPreprocessor definition中有一项MYDLL_EXPORTS。它是VC自动生成的宏,故在MyDll工程中,MYDLL_API解释为 __declspec(dllexport),用MYDLL_API修饰的变量、函数和类将从DLL模块中导出。
而在后面普通的测试工程MyDllDemo中,没有预定义MYDLL_EXPORTS宏,故MYDLL_API解释为 __declspec(dllimport),表示外部DLL模块中被MYDLL_API修饰的变量、函数和类将被导入本工程为其所用。
(......
套接字Sockets(2009-03-12 13:53:00)
摘要: WinSock(Windows Sockets)是处理网络的Windows API。许多函数与在BSD Linux中使用的Berkely套接字函数是相同的。
套接字,简单的说就是通信双方的一种约定,用套接字中的相关函数来完成通信过程。
应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。
区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。Socket原意是 “插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
每一个基于TCP/IP网络通讯的程序(进程)都被赋予了唯一的端口和端口号,端口是一个信息缓冲区,用于保留Socket中的输入/输出信息,端口号是一个16位无符号整数,范围是0-65535,以区别主机上的每一个程序(端口号就像房屋中的房间号),低于256的端口号保留给标准应用程序,比如pop3的端口号就是110,每一个套接字都组合进了IP地址、端口、端口号,这样形成的整体就可以区别每一个套接字。
关于WinSock中的套接字接发缓冲区的大小,可以通过WSA:getsockopt/setsockopt 来读取并设置。
Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。一般一个server服务器对应很多客户端client连接,则服务器必须维护一张客户连接列表,每增加一个客户端连接服务器端都要新建一个套接字负责与新增客户端进行对话通信。
套接字主要有两类:流式套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)。流类型的套接字是为需要可靠连接的应用程序设计的。这些程序通常使用连续的数据......
WinSock C/S入门实例(2009-03-11 22:30:00)
摘要:
套接字的本质是通信过程中所要使用的一些缓冲区及一些相关的数据结构。
下面通过WSA(WinSock API)构建最基本的C/S通信程序。
1.服务器创建监听套接字,并为它关联一个本地地址(IP和端口Port),然后进入监听状态准备接受客户的连接请求。为了接受客户的连接请求,服务器必须调用accept函数。服务器端每接收到一个客户端连接就新建一个套接字负责与该客户会话。
2.客户端创建套接字后即可调用connect函数去试图连接服务器监听套接字。当服务器端的accept函数返回后,connect函数也返回。此时客户方使用socket函数创建的套接字clientSocket,服务器方使用accept返回的套接字serverSocket,双方就可以通信了。
3.WinSock示例程序:
(1)服务器端程序serverDemo.cpp
#include <stdio.h>
#include <WINSOCK.H>
#pragma comment(lib, "WSOCK32.LIB") // wsock32.dll
// #include <WINSOCK2.H>
// #pragma comment(lib, "WS2_32.LIB") // ws2_32.dll
int main(int argc, char* argv[])
{
// 初始化WS2_32.DLL
WSADATA wsaData;
WORD sockVersion = MAKEWORD(1, 0); // v2.0
WSAStartup(sockVersion, &wsaData); // DLL装载
// 创建监听套接字
SOCKET listenSocket = ::socket(AF_INET, SOCK_STRE......
多态性和虚函数(2009-02-28 21:45:00)
摘要: 多态性也是面向对象程序设计方法的一个重要特征,它主要表现在函数调用时实现“一种接口,多种方法”。
<1>基类指针指向派生类对象
SonClass son=new SonClass();①
FatherClass father=new SonClass();②//创建子类,返回基类引用
这是一个IS-A模型,例如“麻雀:鸟”,在这个模型中当然能得出“麻雀是鸟”,但反过来“鸟是麻雀”显然是不对的,即SonClass son=new FatherClass ();是不正确的。
“new SonClass()”完成的是创建SonClass对象,分配内存空间和初始化操作,然后将这个对象的引用通过“=”赋给father变量,也就是建立father变量与SonClass对象之间的关联。
应用类型的区别决定了不同的对象在方法表中不同的访问权限。①中的son对象和②中的father对象在内存布局上是一样的,差别就在于其引用指针的类型不同:father为FatherClass类型指针,而son为SonClass类型指针。其区别如下左图所示。
即使将一个基类指针指向派生类对象,通过该指针也只能访问派生类中从基类继承的公有成员,不能访问派生类自定义的成员,除非通过强制类型转换为派生类指针(派生类指针也可以强制转换为基类指针)。如下右图所示。
//basePtr.cpp : 测试基类对派生类的引用
#include "stdafx.h"
#include<iostream>
using namespace std;
class A
{
private:
int a;//a
public:
void setA(int i){a=i;}
void showA(){cout<<a<<endl;}
};
class B:public A
{
private:
int b;//a,b
public:
 ......