
作为一名一线开发工程师,我将自己用到的和看到的做一介绍,如果有不妥的地方,欢迎大家留言讨论。
1.C/C++系列
IDE不用说,首选全宇宙最牛的IDEVS系列,该部分有代表性质的也就是MFC、Qt了,下面分别介绍。
1.1MFC
一个早已经被微软抛弃的产物,不过目前还占据着一定的市场,主要在军工、自动化等行业,如果你不幸入职一家还在维护这MFC老项目,那么建议你该考虑考虑下一份工作了,MFC==没饭吃,重要的事情说三遍,不建议选择MFC,不建议选择MFC,不建议选择MFC。
1.2Qt
当然IDE首推QTCreator,当然,你也可以选择VS搭载QT插件进行开发。跨平台支持,在国产化越来越受到重视的今天,相信Qt的市场也会逐步增大。
下面是一款使用QML绘制的界面效果图
1.3C++第三方界面库
这里就不一一列举了,可直接网上搜索,重点推荐一款duilib。
Duilib是一个Windows下免费开源的DirectUI界面库,由于简约易扩展的设计以及稳定高效的实现被各大互联网公司普遍接受,广泛应用于包括IM、视频客户端、股票行情软件、导航软件、手机辅助软件、安全软件等多个行业的众多pc客户端软件。Duilib还在不断的发展中,在文档、例子、动画、渲染引擎等多个方面将持续改进。除去各方面优点,其最不足之处就是原始代码作者已经不再维护,可能遇到的坑会比较多,各个公司也都是维护这自己的一个版本。
下面是基于Duilib开发的一款仿360安全卫士的界面效果。
2.C#
程序界的富二代,有着微软这一亲爹的扶持,VisualStudio强力支持。通过简单的拖拽界面,即使你是一个新手,也可以快速做出一款有着可视化界面的GUI程序,当然想要做好、做深入了还是需要你花费一定的功夫来学习的。常见的管理系统使用它来开发的还是很多的。其优势就在于快速开发,很好的兼容瘟都死。
3.JavaScript
有代表性的要数Electron了,不可一世的VSCode就是由其开发而来,JS大有一统天下的趋势(后台,PC端,移动端)。
4.Java系列
这个,使用的应该不是很多了,作为了解即可,JavaSE。使用Eclipse开发即可。
新手做Windows应用程序开发,这里推荐用C#来进行开发。C#对控件有很好的封装,且开发环境是可视化图形界面,前台是类似于PPT直接拖拽控件到程序界面,然后再在后台写逻辑就可以,极大的简化了开发流程,大大降低了开发门槛,所以十分适合新手入门。
这里我就新手如何用C#去做window应用程序开发的一个过程来详细阐述一下:
IDE
个人建议微软的编程语言最好是安装VisualStudio。
.NET
库一般电脑装系统都是装好的,然后你安装VisualStudio的时候会根据你得IDE版本可能会安装更新的版本,这里需要注意一下,在开发的时候若是选择了高版本的.NET
然后程序放在低版本可能会运行不了。个人建议用.NET3.5。新建项目
有了IDE之后就可以开始开发程序了,我们打开VisualStudio,如果是第一次打开可能需要半个小时左右进行初始化。打开后新建项目:
如上图红色标记处可以新建项目,也可以在菜单栏文件处新建项目:
新建项目的时候注意选择:VisualC#然后选择Windows,再在右边选择Windows窗体应用程序:
改好你的项目名,点击右下角确认,这样你就已经开发好了自己的第一个window桌面程序了,这个程序是可以运行的,知识他暂时没有任何的界面和功能,他能运行且能显示界面这都是
.NET
在背后默默的给你封装好的,他帮你做了很多工作,下面你可以添加自己需要的空间和后台逻辑。编写自己的逻辑
点击IDE左边的工具箱,然后点击右边的小三角,选择停靠
这样所有的控件都在左边,你只需要弄清楚每个控件是干嘛的就可以了。这里我讲一下最常用的几个吧:
Button:按钮,可以点击的
Label:标签,可以显示文字
TextBox:输入框
以上三个是用的最多的,我们只需要将需要的控件点击选中并按住鼠标拖动至我们的界面上就可以了:然后在右下角你可以针对每个控件去设置他的属性和事件绑定(button的点击事件可以直接双击button控件,IDE会直接跳转至该事件的代码编写区):
前台页面设置好后,我们可以按“F7”进入后台代码页进行逻辑编写。我这里就演示一下在输入框中输入字符并且点击按钮后d出来我输入的内容的提示:
其中textbox1和button1都是系统自动给TextBox和Button空间取的名字(ID)这个在你控件多了的时候他是不能重复的,你可以在属性修改项中修改对应控件Name属性。
我们看一下运行结果:
我再输入框中输入“我爱你”点击确定后d框提示“我爱你”,简单的逻辑已经实现。一个简单的window应用程序已经开发OK,你可以将这个程序(
.exe
文件,在debug文件下)给到别人去使用是没有问题的。当然,我在这里讲的只是C#开发Windows应用程序的简单过程,要想做出功能丰富强大的Windows应用程序还需要去了解各空控件的功能和用法,还有后台逻辑怎么去编写,数据库怎么去链接,这些都是很深很广的知识,需要你在不断的学习和使用中去提升。
希望我的回答对您有帮助,谢谢~
Windows桌面应用程序开发,首选当然是C#了,不管是开发效率还是平台兼容性来说,都是最好的,其次可以考虑Delphi开发工具,学习成本不高,效率也不错,最后实在没有编程基础的话,可以考虑使用易语言,纯粹中文编程,容易入门也易掌握,下面我分别简单介绍一下,感兴趣的朋友可以尝试一下:
01
C#
这是微软自主设计研发的一款编程语言,目前在Windows平台下有着广泛的使用率和普及率,不管是桌面开发还是动态网页开发,C#无疑是最合适也是效率最高的,只需简单拖拽控件、编辑属性,就可快速创建一个应用,支持各种主流数据库开发,只要你有一定的编程基础,学习来说,非常容易,很好入门,但在跨平台性方面有一些欠缺:
02
Delphi
这是Windows平台下一个非常著名的开发工具,在早期的Windows桌面开发中,Delphi一直占据着非常重要的位置,对于初学者使用来说,不需要掌握太多的编程基础,只需简单拖拽控件,设计属性,就可快速创建一个桌面应用,不管是开发效率,还是编译效率都非常高,而且支持数据库开发,不过随着C#的兴起,Delphi的使用范围逐渐缩小,目前主要集中在一些中小型个人应用和企业的老项目上:
03
易语言
使用易语言开发桌面应用程序,应该是下下之策了,这种方法适合于没有任何编程基础,而又对英文不熟悉的开发人员,纯粹基于中文的编程方式和思想,对于国人来说,非常容易接受和学习,可以快速开发一个桌面应用,但在目前大的环境和主流思想下,易语言的应用范围很局限,很少被企业采用,而且本身属于付费产品,难以推广:
目前,就分享这3种适合新手的Windows应用程序开发语言或工具吧,对于新手学习使用来说,完全够用了,比较流行,也是主流的是C#,只要你有一定的编程基础,熟悉一下使用过程,很快就能掌握的,当然,考虑到跨平台,可能Qt,Electron等更合适,网上也有相关资料和教程,介绍的非常详细,感兴趣的话,可以搜一下,希望以上分享的内容能对你有所帮助吧,也欢迎大家评论、留言进行补充。
这两天想学习关于如何编写windows服务程序的知识,就上网查了些资料。看了一篇文章《用C 语言编写Windows 服务程序的五个步骤》。但可能由于译者的疏忽,忘记了将关键代码放入该文档,导致初学者可能会看不懂。所以又查阅了相关资料。自己完成了《用C 语言编写Windows 服务程序的五个步骤》中的样例程序。
在本文中我希望能给初学者一些帮助,大致讲一下编写windows服务程序需要的知识。
首先Microsoft Windows 服务(即,以前的NT 服务)使您能够创建在它们自己的Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。
服务是有状态的,当我们使用windows自带的服务管理程序sc.exe查看服务状态时可以显示服务的当前状态,这个状态是由我们在程序代码中进行控制的。你最好在服务初始化的时候将服务设置为SERVICE_START_PENDING,当初始化完毕时设为SERVICE_RUNNING,这些状态是系统自定义的状态,可通过msdn查看其他状态。这个状态信息你会在sc.exe中看到。
在编写windows服务程序过程中你需要关注的函数有:
1.首先是main函数,由于windows服务不需要界面,所以大部分程序为win32控制台应用程序,所以程序主函数为main 而不是WinMain()。在主函数要做的主要工作就是初始化一个SERVICE_TABLE_ENTRY 分派表结构体,然后调用StartServiceCtrlDispatcher()这将把调用进程的主线程转换为控制分派器。该分派器启动一个新线程,该线程运行分派表中对应于你的服务的ServiceMain()函数。ServiceMain()函数将在下面提到。
此过程示例代码如下:
SERVICE_TABLE_ENTRY entrytable[2]
entrytable[0].lpServiceName="testservice"
entrytable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain
entrytable[1].lpServiceName=NULL
entrytable[1].lpServiceProc=NULL
StartServiceCtrlDispatcher(entrytable)
在这之后系统将自动创建一个线程去执行ServiceMain函数的内容,你应该将你要执行的任务在ServiceMain中循环,这样服务就开始运行了。
2.ServiceMain函数为void WINAPI ServiceMain(int argc, char** argv)格式的函数,函数名字可以任意定义。它的作用就是:将你需要执行的任务放到该函数中循环执行即可。这就是服务程序的工作函数。在ServiceMain执行你的任务前,需要给SERVICE_TABLE_ENTRY 分派表结构体进行赋值,注意由于此时服务还没有开始执行你的任务所以我们将服务的状态设置为SERVICE_START_PENDING,即正在初始化。我们进行如下赋值:
servicestatus.dwServiceType = SERVICE_WIN32
servicestatus.dwCurrentState = SERVICE_START_PENDING
servicestatus.dwControlsAccepted=SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP
//在本例中只接受系统关机和停止服务两种控制命令
servicestatus.dwWin32ExitCode = 0
servicestatus.dwServiceSpecificExitCode = 0
servicestatus.dwCheckPoint = 0
servicestatus.dwWaitHint = 0
hstatus = ::RegisterServiceCtrlHandler("testservice", CtrlHandler)
CtrlHandler为void WINAPI CtrlHandler(DWORD request)型的函数,函数名字可以任意设定。将在下一点讲到。
Hstatus为SERVICE_STATUS_HANDLE类型的全局变量。当需要改变服务状态时SetServiceStatus()函数需要它做为参数来标识一个服务。
3. void WINAPI CtrlHandler(DWORD request),函数的主要功能是,接收系统传递的控制命令,比如当你通过sc.exe关闭服务时,该函数会收到SERVICE_CONTROL_STOP消息,你就可以对服务进行必要的管理。在本例子程序中就只接收SERVICE_ACCEPT_SHUTDOWN和SERVICE_ACCEPT_STOP消息,这是通过前面给servicestatus赋值设定的。
这样一个基本的服务程序就完成了。
下面贴出我的示例代码仅供参考。该代码在vs2008中调试通过。本文结束的时候会附上如何安装服务。
#include <stdio.h>
#include <Windows.h>
#define SLEEP_TIME 5000 //间隔时间
#define FILE_PATH "C:\\log.txt" //信息输出文件
bool brun=false
SERVICE_STATUS servicestatus
SERVICE_STATUS_HANDLE hstatus
int WriteToLog(char* str)
void WINAPI ServiceMain(int argc, char** argv)
void WINAPI CtrlHandler(DWORD request)
int InitService()
int WriteToLog(char* str)
{
FILE* pfile
fopen_s(&pfile,FILE_PATH,"a+")
if (pfile==NULL)
{
return -1
}
fprintf_s(pfile,"%s\n",str)
fclose(pfile)
return 0
}
void WINAPI ServiceMain(int argc, char** argv)
{
servicestatus.dwServiceType = SERVICE_WIN32
servicestatus.dwCurrentState = SERVICE_START_PENDING
servicestatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP//在本例中只接受系统关机和停止服务两种控制命令
servicestatus.dwWin32ExitCode = 0
servicestatus.dwServiceSpecificExitCode = 0
servicestatus.dwCheckPoint = 0
servicestatus.dwWaitHint = 0
hstatus = ::RegisterServiceCtrlHandler("testservice", CtrlHandler)
if (hstatus==0)
{
WriteToLog("RegisterServiceCtrlHandler failed")
return
}
WriteToLog("RegisterServiceCtrlHandler success")
//向SCM 报告运行状态
servicestatus.dwCurrentState = SERVICE_RUNNING
SetServiceStatus (hstatus, &servicestatus)
//下面就开始任务循环了,你可以添加你自己希望服务做的工作
brun=true
MEMORYSTATUS memstatus
char str[100]
memset(str,'\0',100)
while (brun)
{
GlobalMemoryStatus(&memstatus)
int availmb=memstatus.dwAvailPhys/1024/1024
sprintf_s(str,100,"available memory is %dMB",availmb)
WriteToLog(str)
Sleep(SLEEP_TIME)
}
WriteToLog("service stopped")
}
void WINAPI CtrlHandler(DWORD request)
{
switch (request)
{
case SERVICE_CONTROL_STOP:
brun=false
servicestatus.dwCurrentState = SERVICE_STOPPED
break
case SERVICE_CONTROL_SHUTDOWN:
brun=false
servicestatus.dwCurrentState = SERVICE_STOPPED
break
default:
break
}
SetServiceStatus (hstatus, &servicestatus)
}
void main()
{
SERVICE_TABLE_ENTRY entrytable[2]
entrytable[0].lpServiceName="testservice"
entrytable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain
entrytable[1].lpServiceName=NULL
entrytable[1].lpServiceProc=NULL
StartServiceCtrlDispatcher(entrytable)
}
如何安装服务:
运行命令提示符cmd.exe
输入sc create testservicename binpath= D:\test.exe
输入sc start testservicename 启动服务
输入sc query 会在最底部显示你的服务当前的状态
输入sc stop testservicename 停止服务
输入sc delete testservicename删除服务,该服务将在下次重启后删除,在重启之前将不能注册同一个名字的服务。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)