- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)