接口中VC中连接库的生成与调用.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
接口中VC中连接库的生成与调用

第四节 VC中连接库的生成与调用 以上有关服务的调用过程比较复杂,涉及到的概念也比较多,很容易造成混乱和差错。在实用中,我们完全可以将这部分代码封装起来直接调用,使得程序简单明了。 在VC中,这样的封装方法有多种,静态库和动态库是常用的在设备驱动函数调用的方式。许多硬件接口板提供的程序接口就是这样的一些函数调用。 6.4.1静态库的生成与调用 Win32静态库是指在程序执行之前,库函数的代码就已经链接到生成的可执行文件中,无论是否被调用都随程序的执行被加载到内存中。 1. 库文件的生成 在VC中,可以生成Win32静态库Lib文件,其中的函数可以供其它程序调用。 在建立库文件项目时在项目向导中必须选择生成Win32静态库的程序选项,见下图: 在源程序中,库程序的结构与普通程序有点差异,需要在程序开头加以说明外部调用的函数及其格式,在所有源文件中也没有主函数。例如说明OnOpenService函数为: extern C void OnOpenService(); 即声明OnOpenService函数为C编译、连接方式的外部函数。 在函数的实现过程中与普通函数没有差异,但是为了通用,MFC的函数调用不要使用。 使用Build命令即可以生成库文件的二进制代码(.lib文件)供其它程序调用了。 下面是采用静态库的方法,将前面的打开服务和删除服务的函数封装为两个库函数,供应用程序调用,这样在应用程序中就可以完全屏蔽了有关系统服务的细节。 在构造静态库函数时,必须注意仅使用基本C的部分,否则在调用时回产生错误。所以在下面的函数中,将CString的使用和AfxMessageBox()对话框的调用都去除了。 // svrlib.cpp #include Windows.h #include winsvc.h extern C void OnOpenService(); extern C void OnRemoveService(); void OnRemoveService() { // open service manager SC_HANDLE svm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (svm = = NULL) { //AfxMessageBox(Cannot open service manager); return; } // open the specified service SC_HANDLE svc = OpenService(svm, SppIO, SERVICE_ALL_ACCESS); if (svc == NULL){ //AfxMessageBox(SppIO is not installed or cannot be found); return ; } // get binary path name QUERY_SERVICE_CONFIG *pQSC; DWORD dwActual; BOOL bRet = QueryServiceConfig(svc, NULL, 0, dwActual); pQSC = (QUERY_SERVICE_CONFIG*)new BYTE[dwActual]; QueryServiceConfig(svc, pQSC, dwActual, dwActual); //CString strFile = pQSC-lpBinaryPathName; delete pQSC; //strFile = strFile.Right(strFile.GetLength() - 4); SERVICE_STATUS ss; bRet = ControlService(svc, SERVICE_CONTROL_STOP, ss); if (bRet = = FALSE) { //AfxMessageBox(Cannot stop service/already stopped); return; } bRet = DeleteService(svc); if (bRet = = FALSE) { //AfxMessageBox(Cannot delete service); bRet = CloseServiceHandle(svc); } bRet = CloseServiceHandle(svc); if (bRet = = FALSE) { //AfxMessageBox(Cannot close service); return; } else { //AfxMessageBox(Spp

文档评论(0)

shenlan118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档