分类目录归档: 学习日志

修改服务的启动类型

[cpp]
//////////////////////////////////////////////////////////////////////////
//设置服务启动类型为自动 0成功
int ChangeStartType()
{

SC_HANDLE schSCManager = OpenSCManager(
NULL,
NULL,
SC_MANAGER_ALL_ACCESS);

if (NULL == schSCManager)
{
printf("OpenSCManager failed (%d)n", GetLastError());
return -1;
}

SC_HANDLE schService = OpenService(schSCManager, "服务名称", SERVICE_CHANGE_CONFIG);

if (schService == NULL)
{
printf("OpenService failed (%d)n", GetLastError());
CloseServiceHandle(schSCManager);
return -1;
}

int ret = -1;
SC_LOCK sclLock = LockServiceDatabase(schService);
//将启动类型更改为自动
if (! ChangeServiceConfig(
schService, // handle of service
SERVICE_NO_CHANGE, // service type: no change
SERVICE_AUTO_START, // service start type
SERVICE_NO_CHANGE, // error control: no change
NULL, // binary path: no change
NULL, // load order group: no change
NULL, // tag ID: no change
NULL, // dependencies: no change
NULL, // account name: no change
NULL, // password: no change
NULL) ) // display name: no change
{
printf("ChangeServiceConfig failed (%d)n", GetLastError());
ret = -1;
}
else ret = 0;

UnlockServiceDatabase(sclLock);
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);

return ret;
}
[/cpp]

一个结束进程的例子

[cpp]
#include <Psapi.h>
#pragma comment(lib, "Psapi.lib")

//////////////////////////////////////////////////////////////////////////
//查找进程
DWORD FindProcess(char *strProcessName)
{
DWORD aProcesses[1024], cbNeeded, cbMNeeded;
HMODULE hMods[1024];
HANDLE hProcess;
char szProcessName[MAX_PATH];
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return 0;
for(int i=0; i< (int) (cbNeeded / sizeof(DWORD)); i++)
{
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);
EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbMNeeded);
GetModuleFileNameEx( hProcess, hMods[0], szProcessName,sizeof(szProcessName));

if(strstr(szProcessName, strProcessName))
{
return(aProcesses[i]);
}
}
return 0;
}

//////////////////////////////////////////////////////////////////////////
//结束进程 0成功
int KillProcess()
{
HANDLE hYourTargetProcess = OpenProcess(PROCESS_TERMINATE, FALSE, FindProcess("QQ.exe"));

if(hYourTargetProcess == NULL) return -1;

if(TerminateProcess(hYourTargetProcess, 0)) return 0;
else return -1;
}
[/cpp]

简单一电路图

http://tieba.baidu.com/p/1562226523

没想到这题竟然这么多人不会,记得这是初中物理的题,我还考过试。很明显A的电流是 14V / 2O = 7A 嘛。。。3O 和 4O 被短路了

这是我第二次修改,因为上面的是错误的。我也刚想到,我上次考试也是粗心大意,做错了,没想到现在还是这样>_<。

如果说 3O 4O被短路的话,这是从下面看,从上面看的话 2O 3O也是被短路的。所以

其实把他拉直了应该是

所以电流应该是 14/2 + 14/3 + 14/4 约等于 15.17

看来我还是没改粗心大意的坏习惯

开启和停止服务

[cpp]
#include &lt;Windows.h&gt;
#include &lt;winsvc.h&gt;
#include &lt;stdio.h&gt;
//////////////////////////////////////////////////////////////////////////
//停止服务 0成功
int Stop()
{
// 打开服务管理对象
SC_HANDLE hSC = ::OpenSCManager(NULL, NULL, GENERIC_EXECUTE);
if( hSC == NULL){
printf("打开SCManager出错n");
return -1;
}
// 打开服务。
SC_HANDLE hSvc = ::OpenService(hSC, "这里填服务名称", SERVICE_QUERY_STATUS | SERVICE_STOP);
if( hSvc == NULL){
printf("打开服务出错n");
::CloseServiceHandle(hSC);
return -1;
}
// 获得服务的状态
SERVICE_STATUS status;
if( ::QueryServiceStatus(hSvc, &amp;status) == FALSE){
printf("获取服务状态出错n");
::CloseServiceHandle(hSvc);
::CloseServiceHandle(hSC);
return -1;
}
//如果处于运行状态则停止服务。
if(status.dwCurrentState == SERVICE_RUNNING){
// 停止服务
if( ::ControlService(hSvc, SERVICE_CONTROL_STOP, &amp;status) == FALSE){
printf("停止服务出错n");
::CloseServiceHandle(hSvc);
::CloseServiceHandle(hSC);
return -1;
}
// 等待服务停止
while(::QueryServiceStatus( hSvc, &amp;status) == TRUE){
::Sleep( status.dwWaitHint);
if( status.dwCurrentState == SERVICE_STOPPED){
printf("成功停止n");
::CloseServiceHandle(hSvc);
::CloseServiceHandle(hSC);
return 0;
}
}
}

printf("已经处于停止状态了n");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return 0;
}

//////////////////////////////////////////////////////////////////////////
//开启服务 0成功
int Start()
{
// 打开服务管理对象
SC_HANDLE hSC = ::OpenSCManager(NULL, NULL, GENERIC_EXECUTE);
if( hSC == NULL){
printf("打开SCManager出错n");
return -1;
}
// 打开服务。
SC_HANDLE hSvc = ::OpenService(hSC, "这里填服务名称", SERVICE_QUERY_STATUS | SERVICE_START);
if( hSvc == NULL){
printf("打开服务出错n");
::CloseServiceHandle(hSC);
return -1;
}
// 获得服务的状态
SERVICE_STATUS status;
if( ::QueryServiceStatus(hSvc, &amp;status) == FALSE){
printf("获取服务状态出错n");
::CloseServiceHandle(hSvc);
::CloseServiceHandle(hSC);
return -1;
}
//如果处于非运行状态则开启服务。
if(!(status.dwCurrentState == SERVICE_RUNNING)){
// 启动服务
if( ::StartService( hSvc, NULL, NULL) == FALSE){
printf("启动服务出错n");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return -1;
}
// 等待服务启动
while( ::QueryServiceStatus( hSvc, &amp;status) == TRUE){
::Sleep( status.dwWaitHint);
if( status.dwCurrentState == SERVICE_RUNNING){
printf("成功启动服务");
::CloseServiceHandle(hSvc);
::CloseServiceHandle(hSC);
return 0;
}
}
}

printf("已经处于运行状态了n");
::CloseServiceHandle(hSvc);
::CloseServiceHandle(hSC);
return 0;
}

int main(int argc, char* argv[])
{

Stop();

Start();

return 0;
}
[/cpp]

设备描述表DC

利用SDK全局函数 

HDC hdc;
hdc = ::GetDC(m_hWnd); //LineTo(hdc, px, py);
::ReleaseDC(m_hWnd, hdc); 

 ::GetDC(m_hWnd); 是全局函数,得到当前设备描述表,::ReleaseDC(m_hWnd, hdc);全局函数,释放设备描述表。利用MFC的CDC类

CDC *pDC = GetDC(); //pDC->LineTo(p);
ReleaseDC(pDC);

利用MFC的CClientDC类

CClientDC dc(this);//dc.LineTo(p);

内部会调用GetDC 析构时会自动释放DC。

//CPen pen(xxxxxxxx);
CClientDC dc(this);
CPen *pOldPen = dc.SelectObject(&pen);
//dc.LineTo(p);
dc.SelectObject(pOldPen);

在程序中,当构造一个GDI对象后,该对象并不会立即生效,必须选入设备描述表SelectObject,SelectObject会返回老的对象。完成操作时需把老的放回去SelectObject。