VC++网络编程

2024-08-01

VC++网络编程(精选十篇)

VC++网络编程 篇1

1. 使VC6.0编译出使用系统风格的程序

(1) 创建一个.manifest文件的资源。

在res/文件夹下创建一个跟以程序名加.manifest的文件, 如果程序为test.exe, 则创建test.exe.manifest文件内容如下:

(2) 将新定义的资源加入到.rc文件中, 类型设为24。

打开res/文件夹下的.rc2文件, 在其中加入如下定义:

其中的文件地址按 (1) 中修改的设置即可。

(3) 将新加入的资源包含到resource.h文件中, ID设定为1。

在resource.h文件中加入如下一行:

#define MANIFEST_RESOURCE_ID 1

之后编译即可, 为了使程序界面能充分利用系统的界面特性, 将界面字体设置为TrueType类型的, 利用Windows XP等系统的屏幕字体平滑特性。

2. 使VC2008编译出使用系统风格的程序

在VC2008下就比较简单了, 如果程序字符集使用unicode则默认就是使用系统界面风格的, 如果选择其他的类型, 则编辑stdafx.h即可。

最后面部分代码如下:

修改为如下代码即可:

最后是两张截图的比较, 图1为默认设置下的界面风格, 图2为经过修改后的界面风格。

VC图像编程教案 第五章 篇2

VC图像编程教案 第五章

5.对话框及控制的应用 5.1 先以日历控件说明控件编程的重要性 5.2 说明编写控件所需要的知识: 控件的动态生成-全局变量(类的成员变量) 自定义消息的定义与响应; (见我空间里的文章“这篇技术的文章不错”等) 5.3 一个实现加法功能的对话框程序,由此函数说明两点: 控件关联变量和关联值的区别 UpdateData函数的`用法 5.4 将刚才的程序转化的控件程序,体会控件编程的思路 GetDlgItem的用法 5.5 如何在其他程序中使用对话框

VC++网络编程 篇3

关键词 嵌入式SQL 预编译程序 动态连接库

中图分类号:TP312 文献标识码:A

0 引言

在通常的运用中,SQL语言是作为独立语言在终端交互方式下使用的,是非过程性的,其大多数语句都是独立执行,与上下文无关,称作自含式语言;而许多事务处理应用都是过程性的,需要根据不同的条件来执行不同的任务,如果把SQL语言嵌入到诸如C语言这样的过程化的编程语言中,程序开发人员就能设计出更加灵活的应用系统,具有SQL语言和高级编程语言的良好特征,它将比单独使用SQL或C语言具有更强的功能和灵活性,这种方式下使用的SQL语言称为嵌入式SQL语言。

在计算机专业课程《数据库系统概论》中有关于嵌入式SQL语言的内容,其教学手段一般都是理论讲述,教学效果不是十分理想。下面介绍一种在现有条件下都能办到的嵌入式SQL语言实现方法。

1 在VC中使用嵌入式SQL语言访问Microsoft SQL Server 2000

1.1 使用嵌入式SQL语言所采用的系统配置

①操作系统:Windows 2000 Professional

②Microsoft Visual C++ 6.0

③Microsoft SQL Server 2000

在安装Microsoft SQL Server 2000 时要注意选择安装Development Tools,为使用嵌入式SQL语言准备必要的头文件和库文件。

1.2 编辑嵌入式SQL程序

使用文本编辑器如记事本编辑嵌入式SQL程序,其存盘文件的扩展名为"sqc"。在嵌入式SQL程序中嵌入的SQL语句以EXEC SQL作为起始标识,语句的结束以";"作为标识。在嵌入的SQL语句中可以使用C语言的程序变量(即主变量),这时主变量名前加冒号(:)作为标志,以区别于字段名。主变量的声明必须包含在"EXEC SQL BEGIN DECLARE SECTION; "和"EXEC SQL END DECLARE SECTION; "之间。以下是一个嵌入式SQL程序demo.sqc:

#include

void main()

{

EXEC SQL BEGIN DECLARE SECTION;

char first_name[50];

char last_name[] = "White";

EXEC SQL END DECLARE SECTION;

EXEC SQL CONNECT TO my_server.pubs

USER my_login.my_password;

EXEC SQL SELECT au_fname INTO :first_name

FROM authors WHERE au_lname = :last_name;

EXEC SQL DISCONNECT ALL;

printf("first_name: %s\n", first_name);

}

此C语言程序中嵌入了SQL语句,用来访问数据库服务器my_server中的数据库pubs,登录名my_login,口令my_password,在表authors中检索姓"White"的作者的名,并存入主变量first_name,然后通过printf函数输出结果。

1.3 预编译嵌入式SQL程序

Microsoft SQL Server 2000提供的预编译程序nsqlprep.exe,用于对嵌入式SQL程序进行预编译处理,生成C语言源程序。实际上就是将嵌入式SQL程序中的嵌入式SQL语句替换为对运行时库文件Sqlakw32.dll的函数调用,接着运行时库文件调用动态连接库Ntwdblib.dll通过网络来存取Microsoft SQL Server 2000数据库服务器。

预编译程序nsqlprep的常用语法为:

nsqlprep ESQL_File /SQLACCESS /DB server_name.database_name /PASS login.password

其中ESQL_File是要预编译的嵌入式SQL程序;/SQLACCESS通知nsqlprep 自动地为嵌入式SQL程序中的静态SQL语句创建相应的存储过程;/DB server_name.database_name指明要连接的服务器以及数据库名称;/PASS login.password给出登录名及相应的口令。对于demo.sqc的预编译命令为:

nsqlprep demo /SQLACCESS /DB my_server.pubs /PASS my_login.my_password

经预编译处理后即可产生C语言源程序demo.c

1.4 配置VC++ 6.0 中的Project Settings

为了编译、连接nsqlprep生成的C语言源程序,需要增加必要的访问路径到VC++ 6.0 的环境设置中:

①选择菜单Tools中的菜单项Options

②选择Directories标签页

③在"Show directories for"下拉框中选择"Include files",增加Microsoft SQL Server 2000 开发所需头文件的路径:C:\Program Files\Microsoft SQL Server\80\Tools\DevTools\Include

④在"Show directories for"下拉框中选择"Library files",增加Microsoft SQL Server 2000 开发所需库文件的路径:C:\Program Files\Microsoft SQL Server\80\Tools\DevTools\LIB

1.5 生成访问Microsoft SQL Server 2000数据库的可执行程序

在VC++ 6.0 中创建一个"WIN32 Console Application"类型的Project,选择菜单Project中菜单项Add to Project的子项Files,将第三步中生成的C语言源程序demo.c添加到此Project中,然后编译、连接即可生成访问Microsoft SQL Server 2000数据库的可执行程序:demo.exe,运行的输出结果为:Johnson;这与使用交互式查询工具Query Analyzer检索的结果是一致的。至此,一个在VC++ 6.0中使用嵌入式SQL语言访问Microsoft SQL Server 2000数据库的应用已经开发完成。

2 结束语

本文探讨了Microsoft SQL Server 2000中的ESQL/C编程,并介绍了在常用编程软件VC++ 6.0 中嵌入式SQL程序设计的实现方法。在嵌入式SQL语言的课堂教学中,使用该方法,获得了良好的教学效果。

基于VC++的仿真训练系统编程 篇4

关键词:仿真训练,半实物仿真,硬件设计,编程

为解决部队装备使用维护人员岗前训练时间受装备数量的限制、院校学员无实装的专业实习等问题,提出研制某型飞机照相专业仿真训练系统。半实物仿真是工程领域内一种应用较为广泛的仿真技术,是计算机仿真回路中接入一些实物进行的试验,因而更接近实际情况[1];同时具有提高系统研制质量、缩短研制周期、节约研制经费等优点已成为仿真领域研究的重要方向[2]。为此某型飞机照相专业仿真训练系统采用以计算机仿真技术为核心的半实物仿真训练平台。半实物仿真系统又称硬件在回路[3]仿真系统,在综合考虑部件的使用频率和系统成本的情况下,采用实物仿真器件与和计算机图形仿真器件相结合的方式仿真飞机座舱内的硬件,再利用软件编程驱动图形仿真器件及仿真照相专业通电检测程序,简要介绍仿真训练系统,在此基础上主要研究其编程方法。

1 仿真训练系统

某型飞机照相专业仿真训练系统是由主机、显示器、控制面板构成的立式仿真训练平台。仿真训练系统硬件结构如图1所示,主机选用具有PCI插槽的工业控制计算机,内插有PCI-I64IOT型I/O卡;控制面板上有侦察专业训练常用的硬件如侦察控制盒、火控盒、配电盘、DTC卡(数据传输卡)和主机电源开关;显示器为触摸显示屏。PCI-I64IOT型I/O卡为32路输入、32路输出通道的光隔离开关量I/O卡,用以实现主机与控制面板间的信息交换,训练系统界面操作利用触摸屏来实现,通过USB接口给主机输入信息,主机通过显卡更新界面。照相专业训练常用的硬件用实物仿真器件安装在控制面板上,其他相关硬件如LMFD(左多功能显示器)、RMFD(右多功能显示器)、ICP(综合控制面板)等设计在仿真训练系统软件操作界面上,采用图形化设计,通过软件编程驱动。控制面板上的侦察控制盒、火控盒及配电盘组件,由按键、指示灯和断路器等组成,采用实物进行仿真,即用真实的民品器件替代,其大小、功能和操作方法与飞机座舱内部的器件完全相同;而DTC卡则采用仿制件,其外观与飞机座舱内部的DTC卡相同,操纵方法也相同,其功能通过软件编程来实现。

2 软件设计

该仿真训练系统软件开发平台选用Windows XP操作系统,应用软件开发环境为Microsoft Visual C++6.0,界面采用对话框方式,采用模块化设计,主要由主控模块、虚拟挂装模块、数据采集与驱动模块、故障设置模块、通电检查模块、操作演示模块组成,其中主控模块、数据采集与驱动模块及通电检查模块是软件的核心部分,是实现全部训练科目的关键。

2.1 主控模块

主控模块负责仿真训练系统界面的图形化器件的静态显示和动态显示。主要包括飞机座舱内的两个多功能显示器的外观模拟,亮度调节旋钮、对比度调节旋钮、周边键和显示区的功能模拟;座舱内侦察专业用到的驾驶杆和油门杆等的部分按键、断路器及ICP上旋钮、开关的静态显示和操作时的动态实时更新。

2.2 虚拟挂装模块

虚拟挂装模块负责模拟通电检查前各种配挂方案的配挂过程。

2.3 数据采集与驱动模块

数据采集模块包括PCI-I64IOT型I/O卡的初始化、数据采集、指示灯驱动程序,主要负责通过I/O卡的输入端口获取控制面板上按键、开关等的状态,进行数据分析后,通过输出端口驱动按键上指示灯。

2.4 故障设置模块

故障设置模块是对侦察设备进行虚拟故障设置,以便受训者可以看到侦察设备发生故障时故障清单的查验画面。

2.5 通电检查模块

通电检查模块包括地面通电检查和空中通电检查程序两个部分,地面通电检查包括侦察任务加载、参数匹配、故障清单的查验和系统时间查询或修改、操纵员启动自检测等操作;空中通电检查包括侦察设备参数设置,相机准备、工作、传输等命令操作。系统通过数据采集与驱动模块获取仿真器件的状态、通过主控模块获取触屏对图形化器件的操作,由通电检查模块进行数据分析、逻辑判断后由数据采集与驱动模块驱动按键上指示灯、主控模块更新仿真软件操作界面的图形化器件的状态和模拟显示器的显示内容。

2.6 操作演示模块

系统操作演示模块为了帮助受训人员尽快学会使用该仿真训练系统设置的。主要利用Photo Shop处理图片、桌面录像精灵录制屏幕操作再利用绘声绘影处理各种素材形成视频流,编程时插入Media Player播放控件,即可播放。

3 编程

仿真训练系统软件设计比较复杂,现将涉及的编程方法与技巧进行总结,供相关人员参考。

3.1 定时器的使用

为了保证仿真系统操作界面实时刷新及控制面板信息的动态输入,仿真软件中使用了多个定时器,定时器设定使用Windows API函数Set Timer(UINT n IDEvent,UINT u Elapse,TIMERPROC lp Timer Func)函数[4],n IDEvent为定时器的标识符,u Elapse为指定超时值,以毫秒为单位,lp Timer Func为指向函数的指针,赋值为NULL,在Class Wizard窗口将WM_TIMER消息与添加的定时器成员函数On Timer(UINT n IDEvent)关联,这样当某一定时器超时就产生WM_TIMER时,在On Timer中根据n IDEvent值转向不同程序分支。

3.2 模拟显示器的亮度和对比度调整

仿真训练系统的界面中要模拟飞机座舱内的多功能显示器,显示器有亮度旋钮和对比度旋钮,因而当对这两个旋钮调整时,模拟显示器显示区内的显示内容应能动态调整,为方便起见,将亮度和对比度的调整用一个自定义函数来实现,定义为DBD-LD_Vary(float color,int bright,float contract),形参分别为打开显示器开关时颜色分量的初始值、当前亮度档位和对比度档位。调用该函数时,初始颜色分量由模拟显示器开关的初始位置(日或夜)决定;当前亮度档位和对比度档位是两个全局变量,当调整这两个旋钮时,由于使用了定时器事件全局变量同步改变;返回值为当前颜色分量调整后的数值。

3.3 播放视频文件

播放视频具体编程步骤包括:在对话框中右击,在弹出的快捷菜单中选择Insert Active X Control命令,打开Insert Active X Control窗口;在窗口中,滑动垂直滚动条选择Windows Media Control控件,单击OK按钮将其添加到对话框中;打开Class Wizard窗口为添加的控件命名成员变量如“m_avi”;向对话框中添加“操作演示”按钮,处理按钮的单击事件,利用m_avi.Set Url播放制定的AVI文件。

3.4 显示JPEG图像

在VC++中显示JPEG图像并不像显示BMP图像那么简单,它通过流操作来实现[5]。具体思路是将JPEG文件加载到堆中,然后在堆中创建一个数据流,接着调用Ole Load Picture函数加载流中的数据到IPicture接口中,最后调用IPicture接口的Render方法输出图像信息。程序代码如下:

加载图片时,调用函数Add JPG(char*filename,int x,int y)时,只需用包含路径在内的文件名作为参数的第一项,x、y方向的坐标值替代第二项、第三项参数即可。仿真系统的界面通常根据操作情况实时更新,但其状态只限于几种,因而可将Add JPG函数放入定时器响应函数内,先判断当前的操作情况,然后加载不同的图片即可。

4 结语

某型飞机侦察专业模拟训练系统是基于部队使用维护人员和院校培训需要而研制的,已配备于院校专业实习室,目前已培训学员两期,使用结果表明:其具有很强的实用性,受训人员毕业到部队后,很快能胜任岗位需要;系统操作简单,只需触摸显示屏和手动操作控制面板即可完成;由于采用了定时器,界面的模拟显示器、图形化器件和控制面板的仿真器件动态更新速度与真实情况一致;软件采用模块化设计,可以用于开发其他型号的仿真训练系统。当然也具有一定的局限性:图形化仿真器件视觉效果较好,操作时缺乏真实感。

参考文献

[1]单家元,孟秀云.半实物仿真.北京:国防工业出版社,2008.

[2]高江林,吴晓燕,李勇君,等.半实物仿真系统VV&A研究.航天控制,2011,29(1):67-71.

[3]康凤举.现代仿真技术与应用.北京:国防工业出版社,2001.

[4]朱友芹.新编Windows API参考大全.北京:电子工业出版社,2001.

浅析VC与MATLAB联合编程 篇5

作者:邓科

在浅析VC与MATLAB联合编程<一>、浅析VC与MATLAB联合编程<二>和浅析VC与MATLAB联合编程<三>中简单介绍了VC和MATLAB接口的两种方法,初学者可能会问为什么要用VC和MATLAB接口,接口的实质又是什么,本文就通过一个例子来回答这两个问题,

浅析VC与MATLAB联合编程

首先来介绍一下MATLAB。MATLAB名字由MATrix和 LABoratory 两词的前三个字母组合而成。那是20世纪七十年代后期的事:时任美国新墨西哥大学计算机科学系主任的Cleve Moler教授出于减轻学生编程负担的动机,为学生设计了一组调用LINPACK和EISPACK库程序的“通俗易用”的接口,此即用FORTRAN编写的萌芽状态的MATLAB。

经几年的校际流传,在Little的推动下,由Little、Moler、Steve Bangert合作,于1984年成立了MathWorks公司,并把MATLAB正式推向市场。从这时起,MATLAB的内核采用C语言编写,而且除原有的数值计算能力外,还新增了数据图视功能。

MATLAB以商品形式出现后,仅短短几年,就以其良好的开放性和运行的可靠性,使原先控制领域里的封闭式软件包(如英国的UMIST,瑞典的LUND和SIMNON,德国的KEDDC)纷纷淘汰,而改以MATLAB为平台加以重建。在时间进入20世纪九十年代的时候,MATLAB已经成为国际控制界公认的标准计算软件。

MATLAB已经成为目前国际上最流行、应用最广泛的科学工程计算软件,它广泛的应用于自动控制、数学运算、信号分析、图象处理、财务分析等各行各业。由于它具有强大的计算和绘图功能、大量稳定可靠的算法库和简洁高效的编程语言,已成为数学计算工具方面事实上的标准。

在欧美大学里,诸如应用代数、数理统计、自动控制、数字信号处理、模拟与数字通信、时间序列分析、动态系统仿真等课程的教科书都把MATLAB作为内容。这几乎成了九十年代教科书与旧版书籍的区别性标志。在那里,MATLAB是攻读学位的大学生、硕士生、博士生必须掌握的基本工具,

在国际学术界,MATLAB已经被确认为准确、可靠的科学计算标准软件。在许多国际一流学术刊物上(尤其是信息科学刊物)都可以看到MATLAB的应用。 在设计研究单位和工业部门,MATLAB被认作进行高效研究、开发的首选软件工具。如美国National Instruments公司信号测量、分析软件LabVIEW,Cadence公司信号和通信分析设计软件SPW等,或者直接建筑在MATLAB之上,或者以MATLAB为主要支撑。又如HP公司的VXI硬件,TM公司的DSP,Gage公司的各种硬卡、仪器等都接受MATLAB的支持。

为了说明问题,我们举个例子:解下列线形方程组:(如图1):

图1

用C语言(VC环境中)编写的代码为:(图2)

图2

编译、连接,运行结果为:(图3):

图3

而该方程在MATLAB中只需要一个命令“”就可以解决:

在MATLAB中建立一个新的m文件,在MATLAB菜单中:File->New->M file(如图4):

图4

在M文件中输入代码,并保存为QJFCZ.m。(如图5)

图5

在MATLAB Command命令窗口中输入以下命令:

>>QJFCZ

然后回车,结果如下:

x =

-0.1429

2.7857

0

>>

可以看出用MATLAB写出的代码十分简单,对于上面的方程,如果矩阵A和b的维数发生变化的话,C代码还要重新编写,而用MATLAB书写的代码几乎不用改动,只需改变数据即可。

王一敏:邂逅VC 篇6

无论从哪个角度看,王一敏都着实是个美女:外表时尚靓丽,为人谦和热情,言谈真诚风趣。这让人一下子没有办法将她与VC的身份联系在一起。与VC们带给人的内敛印象相比,王一敏多了一份温暖和灿烂。

王一敏自己也表示,她确实是一不经意撞进了VC圈子。

尽管加入华登之前还不曾真正深入地了解创投行业,但不久之后她即被深深吸引。“这个职业真的很有魅力。”像很多VC一样,王一敏发出了这样的感叹。

曾经“鸡尾汤”

王一敏是个随性的人,好奇心又很强,这种性格使她在入行之前的那段经历异常的丰富。“真的像大杂烩一样,又没鸡尾酒那么纯,充其量也就是‘鸡尾汤’吧。”说这话的时候,她爽朗地笑了。

高中毕业之后,王一敏开始了美国留学之路,喜欢与人交流的她在大学选择了心理学。但念到第三年的时候,她开始觉得心理学过于玄妙,担心自己这辈子都要跟疯子或者病态的人打交道,甚至感到了一些沮丧。于是,王一敏决定“回归理性”,转念工科。从心理学到电信专业,王一敏的人生之路来了个大跨度转弯。

毕业后,王一敏曾做过网络工程师等好几份工作。1999年,王一敏加入爱立信,负责亚太区的移动数据业务。由于工作关系,王一敏有75%的时间都奔波于中国各地市之间。

从那时起,她亲身感受到了中国正在发生的巨大变化。“从科技、经济增长到人的心态、消费习惯,以及交通、房产、饮食等生活的各个方面,进步都太快了,所以我非常希望留在中国。”

2002年回到美国进入加州伯克利大学攻读MBA时,王一敏的这种“恋家”情绪达到了顶峰。第二学年时,王一敏一年中就回了10次中国,甚至连作业都是在飞机上做的。

“我特别想回来看看又发生了什么变化,这种好奇心一直在驱使我。”直到现在,王一敏在伯克利的同学聚会时还会抱怨她的任性。“他们都说跟我一组做作业太辛苦了,还要浪费许多电话费。”说起那段经历,她还止不住地乐。

偶遇“伯乐”

2004年底的一次机缘巧合,王一敏与VC行业不期而遇。

临近毕业时,有朋友将王一敏推荐给了华登国际,而当时她对华登还一无所知。起初这件事一直杳无音信,直到3个月后的一天,王一敏终于收到了与华登国际董事长陈立武的见面邀约。而这次初识至今都令王一敏记忆犹新。

当时令王一敏略感惊讶的是,陈立武一开始就直言不讳地说,“华登现在不招人,只是为了给我的好朋友面子才见你一面”。后来王一敏才知道,那位一向都只写E-Mail给陈立武的朋友为了她,一天给陈打了好几通电话,因而争取到了这次机会。

随性的王一敏也索性以一种轻松的心态与陈立武交谈起来。“可能是因为没有负担,大家都很放松,所以聊了一个多小时觉得很谈得来。”

后来的事情完全出乎王一敏的意料。午饭之后,陈立武当天下午就给王一敏安排了很多会,把她当天的计划给全盘打乱。“我们那天是早上十点见面,大概晚上五点我才忙完。”就这样,华登向她伸出了手。回想起来,王一敏认为这完全是种缘分。“当时我一心只想着回国,倒真的没有打算在美国找工作。但转念一想,其实我原本回国要做的也是跟创业和投资有关的事情。”

对于自己的“伯乐”陈立武,王一敏满口溢美之词。

决定加入华登之前,因为对华登和陈立武本人还不太了解,王一敏还曾把他们给“DD(Due Diligence,尽职调查)”了一把,“打电话给很多朋友询问,结果是非常一致的好口碑”。“我觉得陈立武除了是位很成功的人之外,最重要的是他很有诚信,处事也非常公平。”

2005年1月,王一敏正式加入华登。

重返中国

作为华登国际副总裁,最初一年半王一敏的精力大多放在美国的案子上,包括协助陈立武调查拟投资企业,管理投资组合公司,寻找潜在的投资目标等。同时,王一敏每个月都要飞回中国完成一部分工作。

2006年8月,“恋家”的王一敏终于重新搬回中国,更多地与华登中国团队一起合作寻找投资机会。这令她十分开心。“这么大的国家能够在25年中持续保持10%以上的GDP增长,我觉得这是史无前例的,虽然我个人很渺小,不足以去推动整个国家的发展,但我应该选择留在这里亲身体验。”

在王一敏看来,虽然在突破性的技术方面美国走在中国前面,但中国却往往能涌现出很多创新的机会。她对中国的创业者和企业家感触尤深。“我觉得中国的企业家非常了不起,因为他们都有非常强烈的想要成功的那种驱动力,即使只有一点钱和一点资源,他都会毫不犹豫地投入创业。”

让王一敏印象最深的是高德软件。作为国内最早从事地图软件开发应用的企业之一,高德软件于2006年10月获得了红杉资本中国基金、KPCB、华登、联想投资超过2000万美元的联合注资。而此前的高德软件曾经半年都发不出工资,但其创业团队的十几个兄弟仍然分文不要地在工作,“这真的让我特别感动,他们那时候居然根本就不知道还有创投这回事情,不知道自己可以融资,但还是凭借很强的信念去创业并坚持了下来”。

VC++网络编程 篇7

在VC++编程环境中可使用多种方法实现这一目的,在此对4种常见的实现方法从实现原理、适用范围、编码实现等方面分别进行介绍。

通过对编码的介绍,演示了定时器、自定义消息映射、多线程、全局钩子等编程技术的实现方法。

2 演示程序

为验证方法的可行性,制作了一个演示程序,演示各种方法获取鼠标实时坐标效果;运行界面及其介绍如图1所示。

鼠标实时坐标:显示当前鼠标位置的坐标信息。

获取方式:4个按钮分别提供不同的获取方法。

退出:退出程序。

3 实现方法

3.1 消息处理方式

(1) 实现原理

本方法利用MFC消息映射机制,响应WM_MOUSEMOVE消息,在响应代码中获取鼠标实时坐标。

(2)适用范围

仅可用于实时获取局部区域内鼠标指针坐标。由于MFC消息映射机制的原因,仅当鼠标指针位于演示程序窗口范围内时,才会对鼠标消息作出响应,而鼠标指针一旦运动出此窗口范围则本方法不再有效。

(3)编码实现:

3.2 定时器方式

(1) 实现原理

本方法设定计时器,通过计时器响应函数代码,间隔一段时间取出该时刻的鼠标指针坐标。

(2)适用范围

可用于屏幕全局鼠标实时坐标的获取。由于方法的原理,若取坐标频率过高,占用系统资源将明显上升;反之,实时性将受影响。

(3)编码实现

3.3 多线程方式

(1) 实现原理

创建一个线程,在线程中对鼠标指针坐标重复获取并显示。

(2)适用范围

可用于屏幕全局鼠标实时坐标的获取。实时性较好,但系统资源占用也较为严重。

(3)编码实现

3.4 鼠标全局钩子方式

(1) 实现原理

设置一个全局鼠标钩子(WH_MOUSE),当截获到鼠标消息时向窗口发送一个自定义消息,在窗口中对自定义消息响应时获取鼠标指针坐标;为实现全局鼠标钩子,钩子处理函数要求位于动态链接库中,因此需要编写一个动态链接库:Mouse-PosDll.dll

(2)适用范围

可用于屏幕全局鼠标实时坐标的获取。实时性较好,但编码实现较为复杂。

(3)编码实现

4 结语

通过演示程序,对Visual C++2008环境中实时获取鼠标指针坐标的4种方法进行了介绍与分析;涉及到计时器、自定义消息映射、多线程、全局钩子等多种编程技术。希望能增进大家对文中涉及到的相关技术的了解,为今后编程实践中遇到的相似需求提供实现思路。

摘要:通过程序演示, 分析了利用VC++实时获取鼠标指针坐标的4种方法编程。

关键词:VC++,消息,计时器,线程,钩子函数

参考文献

[1]http://msdn.microsoft.com/library/, MSDN, 2007.

VC++网络编程 篇8

关键词:VC++,FORTRAN语言,混合编程,动态链接库

0 前言

Fortran语言是擅长计算的高级语言, 拥有优秀的计算软件包和数学模型, 被广泛应用于数学与工程计算。然而它在实现人机对话、交互处理方面很不理想, 图形处理功能比较欠缺。VC++是目前个人计算机上深受欢迎的面向对象的程序设计语言, 它具有强大的图形处理功能和优秀的界面功能, 但在科学计算方面实现起来却比较复杂。本文拟用VC++和FORTRAN两种语言进行混合编程, 充分发挥两种语言各自的特点, 编制出具有友好界面和良好计算功能的程序。

1 混合语言编程的一般方法

在混合语言编程中, 有两种具体的实现形式:其一是利用目标文件 (OBJ文件) 的方式, 即分别将VC++与FOR TRAN在各自的编译环境下进行编译, 产生各自的目标文件, 然后再将它们进行连接, 产生VC++的可执行程序, 运行这个程序即可;第二种方法是利用动态连接库的方式, 即首先将FOR TRAN程序构成动态连接库 (DLL) , 然后利用VC++对其进行动态调用。

使用第一种方法时, 常会出现由于两种语言库文件的不匹配而出现的链接警告和错误。而DLL是一种基于WINDOWS的程序模块, 它的编制与具体的编程语言及编译器无关, 只要遵守DLL的开发规范和编程策略, 并安排正确的调用接口, 不管用何种编程语言编制的DLL都具有通用性。因此, 这里我们选择使用第二种方法, 即调用动态链接库的方法。

2 VC和FORTRAN混合语言编程的接口规范

混合语言编程涉及一种语言对用另一种语言编写的函数、过程或者子过程的调用。混合语言编程一般以调用型方式为主, 由于各种语言在结构等细节上规则不同, 必须考虑程序模块之间的接口, 了解造成不同的原因并找出对应解决办法。这些不同点除了语言本身的结构外, 在程序调用时一般表现在调用方式与实现的不同、命名约定的不同和参数传递的方式不同。因此, 为了成功的进行链接调用, 必须对这些接口规范进行约定。

2.1 调用约定

不同的语言定义了不同的调用约定。它规定了该语言的函数中的参数传送方式、参数是否可变和由谁来处理堆栈等问题。对于FORTRAN, 缺省的调用约定是STDCALL约定。VC可以使用的调用约定有:CDECL、STDCALL约定, 缺省为CDECL约定。在VC在FORTRAN语言混编时, 必须采用相同的调用约定, 因此用STDCALL约定。

2.2 参数传递约定

在FORTRAN和VC过程之间可以用参数传递的方法实现交换数据的功能。参数传递的方式有两种:一种是传值, 另一种是传址。VC缺省方式是值传递, 所以传递的是参数的当前值。FORTRAN缺省的传递方式为引用传递, 所传送的是参数的地址。在FORTRAN中可以通过对参数指定REFERENCE或VALUE属性来具体声明参数的传递方式。

2.3 命名约定

FORTRAN语言中是不区分大小写的, 而VC中是区分的, 如果命名约定在调用程序和被调用程序之间不一致, 程序不会链接成功。在不同的堆栈约定下生成的目标程序的标识不一样。缺省时, FORTRAN语言的程序在编译后均被大写并被加上下划线作为前缀, 对于函数和过程名还要加上@n作为后缀。其中n为函数和过程参数在堆栈中占用的总字节数。VC中的标识符在编译后, 依然大小写敏感, 同时标识符前也加上下划线作为前缀, 并附有一些特殊的修饰。

3 混合编程的具体实现过程

下面, 给出一个简单的示例, 详细介绍如何通过调用动态链接库来实现对Fortran代码的利用。我们所用的编译环境为Microsoft Fortran Power Station及Microsoft visual C++6.0

3.1 在MS Developer Studio下编译DLL

3.1.1 首先, 编写Fortran文件代码如下:

3.1.2 将上述程序存盘为MATH.

F90文件;在Option下的Project选项菜单中选择DLL作为Project的类型, Project的名称为FDLL;在Addfiles选项中加入该FORTRAN程序;编译联接生成fdll.dll和fdll.lib文件。

3.2 在VC++中实现对fdll.dll动态链接库的调用

首先, 生成基于对话框的MFC程序Adll, 修改其界面如下。并把fdll.dll和fdll.lib文件拷到工程所在的目录下。

VC++调用DLL有两种方式, 一种是隐式调用, 另一种是显式调用。隐式调用就是将FORTRAN的LIB文件直接加入到工程文件中, 然后编译执行。这种方法的优点是使用的代码少, 但是占用的系统资源多。显式调用就是通过Load Library () 函数装入DLL, 再用Get Proc Ad2dress () 函数来取得DLL中被调用的FORTRAN函数的地址, 然后调用该FOR TRAN函数即可。这种调用方式的优点是可以完全控制DLL的载入和释放, 并最有效地利用系统资源。

3.2.1 隐式调用fdll.dll

首先, 在VC中通过Project/setting/add to projects, 把FORTRAN中生成的fdll.lib文件加入到工程中。

其次, 在Adll Dlg.cpp中添加如下代码:

最后:为“计算”按钮添加如下消息处理函数:

至此, 我们完成了隐式调用的全过程。在两个对话框中分别输入以下数据, 单击计算按钮, 运行结果如下:

这样, 就实现了对math.dll的隐式调用。当单击计算按钮时, 就调用了math.dll链接库中的math函数!

3.2.2 显式调用fdll.dll

为“清零”按钮添加如下消息处理函数:

编译链接后运行, 单击“清零”按钮可以令编辑框中的数字变为零, 有利于我们再次输入。这样, 就实现了对math.dll的显式调用。

参考文献

[1]刘乃琦.IBM PC混合语言编程技术[M].北京:电子工业出版社, 1990.

[2]袁平.多语言混合编程的技术关键及方法[J].电脑与信息技术, 1996 (1) .

VC++网络编程 篇9

(1)字符串硬编码。在字符串常量前加字母L,无论是否是Unicode字符应用程序,编译器都将其编译为Unicode字符串。

(2)将ANSI字符串转换为Unicode字符串。可以使用API函数:int MultiByteToWideChar(

在使用转换函数时,必须在cchWideChar参数中设定此缓存以字符为计量单位的最大值。如果在调用时给cchWideChar参数传递0,那么函数将不执行字符串的转换,而返回为使转换成功所需要的字符的个数nSize;这样就可以分配足够的内存块,用于存放转换后的Unicode字符串:lpWideCharStr=HeapAlloc(GetProcessHeap(),0,nSize觹size of(WCHAR)),然后使用相关参数再次调用转换函数即可。注意在使用完Unicode字符后,应释放内存空间:HeapFree(GetProcessHeap(),0,lpWideCharStr)。

如需将Unicode字符串转换为ANSI字符串,可以使用API函数WideCharToMultiByte()进行。

使用内联方式转换宏A2W可以将ANSI字符串转换为Unicode字符串;使用宏W2A可以将Unicode字符串转换为ANSI字符串。

2 BSTR类型数据的使用

2.1 使用API函数创建BSTR数据

使用BSTR SysAllocString(const OLECHAR觹)函数来创建BSTR数据;不再需要时应使用void SysFreeString(BSTR)函数将其删除。

2.2 使用本机VC++类处理BSTR数据

_bstr_t类;将BSTR封装在智能类中,并且重载了=、+等运算符和强制性操作符。支持用ANSI字符、Unicode字符数据以及变体类型数据直接赋值,并可以实现ANSI字符、Unicode字符间的转换。

2.3 使用VC++模版库类处理BSTR数据

CComBSTR类;通过参数列表指针将BSTR作为输出的API函数中使用非常方便,可以将一个指针传递给CComB-STR对象指针;支持用ANSI字符、Unicode字符数据直接赋值,可以将BSTR数据复制至变体型变量,重载了=、+等运算符。但没有像_bstr_t类那样重载将BSTR转换为ANSI的类型强制符。

2.4 使用CString类处理BSTR数据

在Visual C++中,CString类作为MFC封装,考虑了对BSTR数据类型的支持,并且支持使用ANSI字符、Unicode字符数据以及BSTR类型数据赋值;并且可以使用AllocSysString函数返回一个BSTR数据,但是同样需要使用API函数SysFreeString将其删除。

在Visual C++中.NET,CString类作为ATL(活动模版库)封装,类本身支持Unicode类型数据(包含支持ANSI和Unicode的模版类定义),同时支持变体型数据初始化,因此在COM编程中其使用就更为灵活。但不支持象在VC++中的直接的BSTR数据赋值操作,可以通过定义一个VARIANT类型的变量进行赋值初始化操作。

3 不同Windows操作系统对Unicode的支持

3.1 Windows 98操作系统

Windows 98继承了16位Windows操作系统的特性,不是用来处理Unicode。如果要增加对Unicode的支持,工作量非常大,因此Windows 98几乎都是使用ANSI字符串来进行所有的内部操作的。因此在Windows 98环境下开发应用程序最好使用ANSI字符串。

3.2 Windows CE操作系统

Windows CE是使用Unicode的一种操作系统,并且完全不支持ANSI Windows函数。因此在Windows CE环境下开发应用程序只能使用Unicode字符串。

3.3 Windows 2000操作系统

Windows 2000是基于NT内核的操作系统,自身就是使用Unicode进行开发的,用于创建窗口、显示文本、进行字符串操作等的所有核心函数都需要使用Unicode字符串。如果调用任何一个Windows函数并传递一个ANSI字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给应用程序。而进行这些字符串的转换需要占用系统的时间和内存,因而影响了程序的运行效率。

4 结束语

在VC++编程中使用Unicode编码,可以提高程序的可移植性,简化代码转换工作并提高程序的运行效率。假如要开发同时支持ANSI以及UNICODE的单一源代码,最好使用TCHAR以及LPTSTR系列类型,并且在调用Windows函数以及C运行期函数时使用既支持ANSI又支持Unicode的函数宏定义。这样可以增强代码的可移植性以及对多种语种的支持,大大简化编程工作。

参考文献

[1]Jeffrey Richter著.Windows核心编程[M].王建华,等译.北京:机械工业出版社,2000.

[2]David S Platt著.COM精髓[M].信达工作室译.北京:人民邮电出版社,2001.

VC++网络编程 篇10

1 Matlab与VC混合编程

1.1 Matlab引擎方式

Matlab引擎采用客户机/服务器(Client/Server)的方式,提供了一组Matlab API函数,通过调用这些函数实现以用程序进程之间的数据传递。VC程序作为前端客户机,向Matlab引擎传递命令和数据,并从Matlab引擎接受数据信息,实现动态通信。

1.2 MCC组件

MCC是Matlab中经过优化的编译器。使用MCC,用户可以将Matlab数学库、图形库和界面程序转化为独立于Matlab的EXE应用程序和DLL动态连接库,在VC中编写程序界面并加载调用动态连接库,实现两者之间的连接。

1.3 COM组件

组件对象模型(简称MCR)是以组件为发布单元的对象模型。它提供一种可以共享二进制代码的工业标准,允许任何符合标准的程序访问,所以COM作为不同语言之间的协作开发是非常方便的。Matlab的COM编译器是在Matlab6.5中才开始提供的一个新工具,从Matlab7.0起,这个产品改名为Matlab Builder for COM。基于COM的混合编程方法也是Mathworks公司推荐使用的方法。

以上3种方法中,采用Matlab引擎方式,应用程序整体性能好,Matlab引擎支持功能全面,但需要Matlab后台运行,不能脱离Matlab环境。而MCC方法和COM组件方法均可以脱离Matlab环境,应用程序运行效率高,利于软件的开发,在此将重点论述MCC和COM组件方法。

2 Matlab编译器

2.1 Matlab与VC接口配置

采用MCC方法需要对Matlab和VC接口设置,配置步骤如下:

(1)Matlab编译器配置

首先在Matlab命令提示符下输入mbuild-setup命令,选择编译器,完成编译器设置。

(2)VC环境设置

1)设定头文件和库文件路径

在VC环境菜单栏中选择Tools->Options->Directories,在“Show directories for”栏中首先选择Include files,然后在“directories”中将ExternLibWin32MicrosoftMSVC 60添加进去。再次在“Show directories for”栏中选择Librarys files,再在“directories”中添加ExternInclude。

2)设置编译连接选项

在VC环境菜单栏中选择Project->setting,然后选择link选项卡,在object/library modules栏中添加mclmcrrt.lib libtest.lib;选择General选项卡,在Microsoft Foundation Classes栏中选择Use MFC in a Shared Library。

2.2 实例演示

完成Matlab和VC的接口设置以后,就可以实现Matlab和VC的混合编程,具体步骤如下:

(1)编写M函数文件“mypascal.m”function m=mypascal(n)m=pascal(n);m=m';示例M函数文件的作用是生成一个n阶的帕斯卡矩阵并返回,Pascal矩阵特点:第一行和第一列的元素均为1,其他位置的元素是前方的元素和上方的元素之和。由于Matlab中矩阵存储方式是以矩阵的列为先,也就是数据从第一列开始逐列存储的,而C/C中矩阵则是以第一行开始逐渐存储的,因此在函数的最后一行对返回矩阵取转置运算,等效于使计算得到的矩阵数据以行模式存储。

(2)编译M文件在Matlab命令行输入mcc-B csharedlib:libtest mypascal.m-v命令(或mcc-W lib:libtest-T link:lib mypascal.m)将m文件编译成C共享动态链接库文件。命令执行完毕后,在当前目录中生成C头文件(libtest.h)、引入库文件(libtest.lib)、ctf(libtest.ctf)文件、动态链接库文件(libtest.dll)、C源文件(libtest.c)等8个文件。

(3)创建工程对话框运行visual C创建一个对话框工程,取名为test,接受所有默认的设置。去掉对话框上的静态文本和按钮,增加一个按钮、一个静态文本框、编辑框以及一个List Control,鼠标右键单击List Control,选择Properties,把View改成Report。给List Control控件添加Clist Ctrl类的对象m_List,给编辑框关联一个整型成员变量m_size,给按钮增加一个消息响应函数。

(4)添加编译文件到工程将mcc编译生成的“libtest.h”、“libtest.dll”、“libtest.lib”,“libtest.ctf”四个文件复制到工程目录,将libtest.h加入工程,并在对话框程序文件“test Dlg.cpp”中添加头文件“libtest.h”。

(5)VC中调用动态连接库

1)在On Init Dialog()函数中添加初始化libtest.dll进程的代码:BOOL CTest Dlg::On Init Dialog(){CDialog::On Init-Dialog();//TODO:Add extra initialization here if(!mcl Initialize Application(NULL,0)){Afx Message Box("不能初始化程序!");exit(1);}if(!libtest Initialize()){Afx Message Box("不能初始化连接库!");exit(1);}return TRUE;//return TRUE unless you set the focus to a control}

2)在void CTest Dlg::On Createbuttom()函数中添加以下代码,实现对mypascal.m的调用,并将计算结果显示在对话框界面中。void CTest Dlg::On Createbuttom(){//TODO:Add your control notification handler code here Update Data(TRUE);double data;data=double(m_size);mx Array*size;//输入参数mx Array*out=NULL;//输出参数//创建mx Array数据对象,双精度标量size=mx Create Double Scalar(data);//内存复制赋值memcpy(mx Get Pr(size),&data,1*sizeof(double));mlf Mypascal(1,&out,size);//函数调用//结果数据显示CString strtext;int i,j;//清除已显示的数据m_List.Delete All Items();intncolumn=m_List.Get Header Ctrl()->Get Item Count();for(i=0;i)

3)利用Class Wizard为对话框添加On Destroy()函数,并添加以下代码:void CTest Dlg::On Destroy(){CDialog::On Destroy();//TODO:Add your message handler code her libtest Terminate();//终止进程mcl Terminate Application();//终止MCR}在VC中编译、运行,与在Matlab中运行M文件的结果一样。

(6)独立应用程序的发布

发布独立的应用程序时,需要拷贝以下几个文件到目标机器上:MCRInstaller.exe,这个文件位于tool-boxcompilerdeploywin32目录之下,应用程序运行前要先点击运行MCRInstaller.exe文件,按照提示步骤安装好MCR,然后将工程文件的可执行程序(.exe)、共享库(.dll)以及其对应的ctf文件复制到目标计算机即可独立运行。

3 COM组件

3.1 Matlab里创建COM组件

使用COM组件方法首先需要在Matlab中创建COM组件,步骤如下:

(1)创建COM组件在Matlab命令窗口输入命令comtool,打开Matlab Builder对话框,它是Matlab builder for com的主要工作环境。点击File->New Project,会弹出一个新工程设置对话框,填入组件名和类名,完成之后点OK,完成新工程的创建。如果选择的工程所在目录并不存在,comtool会提示该目录不存在,并询问是否创建该目录,选择Yes,comtool就会创建工程到该目录。

(2)添加M文件到组件执行完第一步后回到matlab builder界面。点击刚才创建的工程,单击Add files按钮,将M文件添加到新建的组件类中。然后点击Build->COM Object编译当前工程的COM组件,这个步骤不仅编译了COM组件,同时也在计算机上注册了该组件,它可以像其他COM组件一样在VC中使用。编译完成以后在用户设置的项目目录下将产生两个子文件夹src和distrib,src里包含组件的源代码,distrib里包含供用户最终发布使用的COM组件。

(3)打包组件及MCR编译结束后产生的COM组件只能在当前计算机上使用,为了能够把它发布到其他计算机上使用,还需要其他一些支持文件。另外,COM组件不同于普通的DLL文件,COM组件必须注册后才能在计算机上使用。选择Component->package component命令,comtool将会把发布该组件所需要的所有文件打包到一个和工程同名的可执行文件中。这里可以选择是否在打包文件中包含MCR。Matlab7.0产生的COM组件必须运行在MCR环境。如果目标计算机上没有安装MCR,那么在打包组件的时候最好选择包含MCR,这样在打包文件中就会包含MCR的安装文件。打包完成后将会在distrib中产生.exe的可执行文件,这是一个可以自解压的压缩文件。其中包含4个文件:_install.bat,dll文件,ctf文件,MCRInstaller.exe。把产生的.exe文件复制到需要发布的计算机上运行。结果将会把这4个文件解压,并执行_install.bat,这是一个DOS批处理文件,查看_install.bat的内容后可以发现_install.bat将会运行MCRInstaller.exe来安装MCR,并且在系统中注册组件文件。

3.2 实例演示

这里仍旧采用上例“mypascal.m”文件,按照3.1介绍的步骤创建COM组件,组件名取Tpascal,类名取Tpascalclass。运行Visual C创建一个与上例一样对话框工程,对话框设置也与上例一样。然后在MFC工程中进行如下操作:

(1)导入DLL文件

将distrib文件夹里Tpascal_1_0.dll拷贝到工程文件夹,然后用VC命令#import来把Tpascal_1_0.dll导入工程中,#import命令的作用是从Tpascal_1_0.dll中导入组件中的接口类型定义,具体做法是在stdafx.h里,加入下面两行:#import"Tpascal_1_0.dll"raw_interfaces_only using namespace Tpascal;

(2)为工程对话框添加实现代码

在对话框按钮消息响应函数中编写调用组件代码:void CTest Dlg::On Createbutton(){//TODO:Add your control notification handler code here Update Data(TRUE);Co Initialize(NULL);//初始化COM//得到COM对象的CLSID CLSIDclsid;HRESULT hr;hr=CLSIDFrom Prog ID(OLESTR("Tpascal.Tpascalclass.1_0"),&clsid);//创建一个COM对象的实例ITpascalclass*p Ipascal;hr=Co Create Instance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(ITpascalclass),(LPVOID*)&p Ipascal);if(FAILED(hr))//测试创建是否成功{Afx Message Box("create failed");return;}//初始化VARIANT变量VARIANT size,out;Variant Init(&size);Variant Init(&out);//创建size,类型为VT_R8,即double型size.vt=VT_R8;size.dbl Val=(double)m_size;//创建二维数组out,类型为VT_ARRAY,ARRAY中的元素为double型out.vt=VT_ARRAY|VT_R8;SAFEARRAYBOUND bound[2];//设置第一维数组元素个数、元素索引下界bound[0].c Elements=m_size;bound[0].l Lbound=0;//设置第二维数组元素个数、元素索引下界bound[1].c Elements=m_size;bound[1].l L-bound=0;out.parray=Safe Array Create(VT_R8,2,bound);p Ipascal->mypascal(1,&out,size);//函数调用//返回值传递double*matrix,*p Dest;matrix=new double[m_size*m_size];Safe Array Access Data(out.parray,(void**)&p Dest);//获得数据指针,访问数据memcpy(matrix,p Dest,m_size*m_size*sizeof(double));//拷贝数据矩阵Safe Array Unaccess Data(out.parray);//释放数据指针,取消访问Safe Array Destroy(out.parray);//释放数组//结果数据显示的代码与上例一样,此处省略……delete[]matrix;//释放指针p Ipascal->Release();if(p Ipascal!=NULL){p Ipascal=NULL;}Variant Clear(&size);//清空变量Variant Clear(&out);Co Uninitialize();//释放COM}在VC中编译、运行结果与上例一样,也与在MATLAB中运行M文件的结果一致。

(3)独立程序的发布

采用COM组件的方法的独立程序的发布,除了需要在目标计算机上运行打包组件产生的可执行文件Tpascal.exe,安装MCRInstaller.exe,并注册Tpascal_1_0.dll以外。还需要将MFC工程的可执行文件.exe拷贝到目标计算机上运行即可实现独立程序的发布。

4 结语

在软件开发过程中,为了提高软件的开发效率,混合编程是综合使用多种开发工具技术优势的一种常用手段。在此采用基于MCC和COM组件的VC与Matlab混合编程技术,具有实现简单、执行效率高、几乎支持所有的Matlab函数、易于移植等优点,是解决矩阵处理、计算以及图像处理编程的一种有效途径,可以为科学研究和工程技术提供更强的技术支持。所有代码在环境为Windows XP、Matlab 7.0.1、VC 6.0下均调试通过。

摘要:简单介绍了Matlab和VC的特点,探讨了Matlab与VC混合编程的3种方法,并详细论述MCC和COM组件混合编程的技术和实现过程。

关键词:Matlab,VC,MCC,COM,混合编程

参考文献

[1]苏金明.MATLAB高级编程[M].北京:电子工业出版社,2005:215-220.

[2]董维国.深入浅出MATLAB 7.x混合编程[M].北京:机械工业出版社,2006:278-285.

本文来自 360文秘网(www.360wenmi.com),转载请保留网址和出处

【VC++网络编程】相关文章:

vc编程总结06-02

VC++6.0编程09-12

利用VC实现网络通信06-14

网络编程05-04

网络应用编程05-21

可编程网络07-17

网络编程论文题目05-08

电大网络编程技术05-15

PHP网络编程07-30

网络编程实验报告汇总05-04

上一篇:南京明城墙下一篇:原则特点