引言
设备驱动程序的动态加载主要是由服务控制管理程序(Service Control Manager,SCM)系统组件完成,SCM组件可以提供许多服务,如,启动、停止和控制服务。
编写加载驱动程序,主要是操作SCM组件。
一般,操作SCM组件的相关API函数有如下几个:
SC_HANDLE WINAPI OpenSCManager(
__in_opt LPCTSTR lpMachineName,//计算机名称
__in_opt LPCTSTR lpDatabaseName,//SCM数据库名称
__in DWORD dwDesiredAccess//使用权限
__in_opt LPCTSTR lpMachineName,//计算机名称
__in_opt LPCTSTR lpDatabaseName,//SCM数据库名称
__in DWORD dwDesiredAccess//使用权限
);
BOOL WINAPI CloseServiceHandle(
__in SC_HANDLE hSCObject //要关闭的SCM句柄
);
SC_HANDLE WINAPI CreateService(
__in SC_HANDLE hSCManager, //SCM管理器的句柄
__in LPCTSTR lpServiceName, //服务名称
__in_opt LPCTSTR lpDisplayName, //服务显示出的名称
__in DWORD dwDesiredAccess, //打开权限
__in DWORD dwServiceType, //服务类型
__in DWORD dwStartType, //打开服务的时间
__in DWORD dwErrorControl, //关于错误处理的代码
__in_opt LPCTSTR lpBinaryPathName, //二进制文件的代码
__in_opt LPCTSTR lpLoadOrderGroup, //用什么用户组开发服务
__out_opt LPDWORD lpdwTagId, //输出验证标签
__in_opt LPCTSTR lpDependencies, //所依赖的服务名称
__in_opt LPCTSTR lpServiceStartName,//用户账户名称
__in_opt LPCTSTR lpPassword //用户口令
);
SC_HANDLE WINAPI OpenService(
__in SC_HANDLE hSCManager, //SCM数据库的句柄
__in LPCTSTR lpServiceName, //服务名称
__in DWORD dwDesiredAccess //访问权限
);
BOOL WINAPI ControlService(
__in SC_HANDLE hService, //服务的句柄
__in DWORD dwControl, //控制码
__out LPSERVICE_STATUS lpServiceStatus//返回状态码
);
BOOL WINAPI CloseServiceHandle(
__in SC_HANDLE hSCObject //要关闭的SCM句柄
);
SC_HANDLE WINAPI CreateService(
__in SC_HANDLE hSCManager, //SCM管理器的句柄
__in LPCTSTR lpServiceName, //服务名称
__in_opt LPCTSTR lpDisplayName, //服务显示出的名称
__in DWORD dwDesiredAccess, //打开权限
__in DWORD dwServiceType, //服务类型
__in DWORD dwStartType, //打开服务的时间
__in DWORD dwErrorControl, //关于错误处理的代码
__in_opt LPCTSTR lpBinaryPathName, //二进制文件的代码
__in_opt LPCTSTR lpLoadOrderGroup, //用什么用户组开发服务
__out_opt LPDWORD lpdwTagId, //输出验证标签
__in_opt LPCTSTR lpDependencies, //所依赖的服务名称
__in_opt LPCTSTR lpServiceStartName,//用户账户名称
__in_opt LPCTSTR lpPassword //用户口令
);
SC_HANDLE WINAPI OpenService(
__in SC_HANDLE hSCManager, //SCM数据库的句柄
__in LPCTSTR lpServiceName, //服务名称
__in DWORD dwDesiredAccess //访问权限
);
BOOL WINAPI ControlService(
__in SC_HANDLE hService, //服务的句柄
__in DWORD dwControl, //控制码
__out LPSERVICE_STATUS lpServiceStatus//返回状态码
);
文件拖拽
要使对话框支持文件拖拽功能,只需3步即可实现
1> 对话框模版的 Accept Files 属性设置成 True
2> 响应主对话框类的 WM_DROPFILES 消息
2> 响应主对话框类的 WM_DROPFILES 消息
3> 添加如下示例代码:
TCHAR szPath[MAX_PATH] = {0};
UINT nCount = DragQueryFile(hDropInfo,0xFFFFFFFF, NULL, 0);//文件个数
for(UINT idx = 0; idx < nCount; ++idx) {
DragQueryFile(hDropInfo, idx, szPath, MAX_PATH);
TCHAR * pFind = _tcschr((TCHAR *)szPath, '\\');
m_strSysFileName=pFind+1;
m_strSysFilePath=szPath;