当前位置: 首页 > news >正文

金融企业类网站模板免费下载深圳网络推广哪家好

金融企业类网站模板免费下载,深圳网络推广哪家好,昆明搜索引擎推广,中国航发网上商城官网SCM#xff08;Service Control Manager#xff09;服务管理器是 Windows 操作系统中的一个关键组件#xff0c;负责管理系统服务的启动、停止和配置。服务是一种在后台运行的应用程序#xff0c;可以在系统启动时自动启动#xff0c;也可以由用户或其他应用程序手动启动。…SCMService Control Manager服务管理器是 Windows 操作系统中的一个关键组件负责管理系统服务的启动、停止和配置。服务是一种在后台运行的应用程序可以在系统启动时自动启动也可以由用户或其他应用程序手动启动。本篇文章中我们将通过使用 Windows 的服务管理器SCM提供的API接口实现一个简单的服务管理组件的编写。 服务管理器的主要功能包括 服务启动和停止 SCM 管理系统服务的启动和停止。在系统启动时SCM 会根据每个服务的配置启动相应的服务。用户也可以通过服务管理器手动启动或停止服务。服务配置 SCM 管理服务的配置信息包括服务的启动类型如自动、手动、禁用、服务的依赖关系、服务的用户身份等。服务状态监控 SCM 监控运行中服务的状态。服务可以处于运行、暂停、停止等状态。SCM 提供 API 函数允许应用程序查询和控制服务的状态。事件日志 SCM 记录服务启动、停止等事件到系统的事件日志中这有助于故障排查和系统管理。服务通知 SCM 允许应用程序注册服务状态变化的通知以便及时响应服务状态的改变。服务安全性 SCM 确保服务以适当的权限和身份运行以保障系统的安全性。 开发者可以通过使用 Windows API 提供的相关函数例如 OpenSCManager、CreateService、StartService 等与 SCM 进行交互管理系统中的服务。这些 API 函数允许开发者创建、配置、启动、停止和查询服务以及监控服务的状态变化。 枚举SCM系统服务 Windows 的服务控制管理器SCM允许开发者通过 EnumServicesStatus 函数来枚举系统中正在运行的服务。这个功能非常有用可以用于监控系统中的服务状态、获取服务的详细信息等。在这篇文章中我们将学习如何使用 EnumServicesStatus 函数来实现对 SCM 系统服务的枚举并获取相关信息。 OpenSCManager 用于打开服务控制管理器数据库并返回一个指向服务控制管理器的句柄。通过这个句柄你可以进行对服务的查询、创建、启动、停止等操作。 以下是 OpenSCManager 函数的原型 SC_HANDLE OpenSCManager(LPCTSTR lpMachineName,LPCTSTR lpDatabaseName,DWORD dwDesiredAccess );lpMachineName: 指定远程计算机的名称。如果为 NULL表示本地计算机。 lpDatabaseName: 指定要打开的服务控制管理器数据库的名称。通常为 SERVICES_ACTIVE_DATABASE。 dwDesiredAccess: 指定所请求的访问权限。可以是以下之一或它们的组合 SC_MANAGER_CONNECT: 允许连接服务控制管理器。SC_MANAGER_CREATE_SERVICE: 允许创建服务。SC_MANAGER_ENUMERATE_SERVICE: 允许枚举服务。SC_MANAGER_LOCK: 允许锁定服务数据库。SC_MANAGER_QUERY_LOCK_STATUS: 允许查询服务数据库的锁定状态。SC_MANAGER_MODIFY_BOOT_CONFIG: 允许修改系统启动配置。SC_MANAGER_ALL_ACCESS: 允许执行上述所有操作。 函数返回一个指向服务控制管理器的句柄 (SC_HANDLE)。如果操作失败返回 NULL可以通过调用 GetLastError 函数获取错误代码。 EnumServicesStatus 用于枚举指定服务控制管理器数据库中的服务。通过这个函数你可以获取正在运行的服务的信息如服务的名称、显示名称、状态等。 以下是 EnumServicesStatus 函数的原型 BOOL EnumServicesStatus(SC_HANDLE hSCManager,DWORD dwServiceType,DWORD dwServiceState,LPENUM_SERVICE_STATUS lpServices,DWORD cbBufSize,LPDWORD pcbBytesNeeded,LPDWORD lpServicesReturned,LPDWORD lpResumeHandle );hSCManager: 指定服务控制管理器的句柄通过 OpenSCManager 函数获取。dwServiceType: 指定服务的类型如 SERVICE_WIN32。dwServiceState: 指定服务的状态如 SERVICE_STATE_ALL。lpServices: 指向 ENUM_SERVICE_STATUS 结构体数组的指针用于接收服务的信息。cbBufSize: 指定 lpServices 缓冲区的大小以字节为单位。pcbBytesNeeded: 接收所需的缓冲区大小以字节为单位。lpServicesReturned: 接收实际返回的服务数。lpResumeHandle: 用于标识服务的遍历位置。 函数返回 BOOL 类型如果调用成功返回 TRUE否则返回 FALSE。如果函数返回 FALSE可以通过调用 GetLastError 函数获取错误代码。 上述EnumServicesStatus中的第二个参数dwServiceType非常重要在 Windows 操作系统中服务的启动类型和服务类型是通过服务的标志Service Flags来指定的。这些标志是用于定义服务的性质和启动方式的。以下是其中几个标志的含义 0x0 (SERVICE_KERNEL_DRIVER): 设备驱动程序。这种服务类型表示一个内核模式的设备驱动程序。0x2 (SERVICE_FILE_SYSTEM_DRIVER): 内核模式文件系统驱动程序。这种服务类型表示一个内核模式的文件系统驱动程序。0x8 (SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER): 文件系统识别器驱动程序。这种服务类型表示一个同时具有文件系统驱动程序和文件系统识别器驱动程序功能的服务。0x10 (SERVICE_WIN32_OWN_PROCESS): 独占一个进程的服务。这种服务类型表示服务运行在自己的进程中。0x20 (SERVICE_WIN32_SHARE_PROCESS): 与其他服务共享一个进程的服务。这种服务类型表示服务可以与其他服务运行在同一个进程中。 需要注意的是上述标志可以通过按位 OR 运算来组合使用以表示服务的多个特性。例如SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS 表示一个交互式服务即运行在自己的进程中并与桌面交互。 除了上述标志之外还有一些其他的标志如 SERVICE_INTERACTIVE_PROCESS (0x100): 交互式服务。表示服务可以与桌面进行交互通常用于服务需要显示用户界面的情况。SERVICE_AUTO_START (0x2): 自动启动。表示服务会在系统启动时自动启动。SERVICE_DEMAND_START (0x3): 手动启动。表示服务需要由用户手动启动。SERVICE_DISABLED (0x4): 禁用。表示服务被禁用不会自动启动。 这些标志允许开发者灵活地定义服务的启动方式和性质。在使用服务相关的 API 函数时这些标志会在函数参数中进行指定。例如在使用 CreateService 函数时可以通过设置 dwServiceType 和 dwStartType 参数来指定服务的类型和启动方式。 如下代码则实现了对系统内特定服务的枚举功能通过向Enum_Services函数中传入不同的参数来实现枚举不同的服务类型 #include stdio.h #include Windows.hvoid Enum_Services(DWORD dwServiceType) {DWORD ServiceCount 0, dwSize 0;LPENUM_SERVICE_STATUS lpInfo;SC_HANDLE hSCM OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);BOOL bRet EnumServicesStatus(hSCM, dwServiceType, SERVICE_STATE_ALL, NULL, 0, dwSize, ServiceCount, NULL);if (!bRet GetLastError() ERROR_MORE_DATA){// 分配缓冲区,保存服务列表lpInfo (LPENUM_SERVICE_STATUS)(new BYTE[dwSize]);bRet EnumServicesStatus(hSCM, dwServiceType, SERVICE_STATE_ALL, (LPENUM_SERVICE_STATUS)lpInfo,dwSize, dwSize, ServiceCount, NULL);if (NULL hSCM){return;}// 逐个遍历获取服务信息for (int x 0; x ServiceCount; x){printf(名称:%-30s 名称: %-30s 状态: , lpInfo[x].lpServiceName, lpInfo[x].lpDisplayName);switch (lpInfo[x].ServiceStatus.dwCurrentState){case SERVICE_PAUSED: printf(暂停 \n); break;case SERVICE_STOPPED: printf(停止 \n); break;case SERVICE_RUNNING: printf(运行 (*) \n); break;default: printf(其他 \n);}}delete lpInfo;}CloseServiceHandle(hSCM); }int main(int argc, char *argv[]) {// 0x0 设备驱动程序// 0x2 内核模式文件系统驱动程序// 0x8 文件系统识别器驱动程序// 0x10 独占一个进程的服务// 0x20 与其他服务共享一个进程的服务Enum_Services(0x10);system(pause);return 0; }我们传入0x10则代表枚举当前系统中的独占一个进程的服务代码需要使用管理员权限运行输出效果图如下所示 编写SCM系统服务 Windows 服务程序的主体框架需要包括关键的两个函数其中ServiceMain标志着服务程序的入口而ServiceCtrlHandle则是服务程序的控制处理流程最后的TellSCM函数则用于通知SCM服务的当前状态当然了TellSCM可以单独出来也可以写在ServiceCtrlHandle都可以任何一个正常的服务程序都必须包含这两个关键位置并且需要将该函数导出首先展示核心API函数的定义信息。 SERVICE_TABLE_ENTRY 用于定义服务表的结构体。服务表是一个包含服务入口函数和服务名的数组它告诉 SCM 服务控制管理器哪个服务程序入口函数与哪个服务相关联。 以下是 SERVICE_TABLE_ENTRY 结构体的定义 typedef struct _SERVICE_TABLE_ENTRY {LPSTR lpServiceName; // 服务名LPSERVICE_MAIN_FUNCTION lpServiceProc; // 服务入口函数 } SERVICE_TABLE_ENTRY, *LPSERVICE_TABLE_ENTRY;lpServiceName: 指向服务名的指针。服务名是服务在 SCM 中的标识符可以通过该名字启动、停止、控制服务等。lpServiceProc: 指向服务入口函数的指针。该函数是服务的主要执行点当 SCM 启动服务时会调用该函数。 在主程序中你通过创建 SERVICE_TABLE_ENTRY 数组来定义服务表然后将其传递给 StartServiceCtrlDispatcher 函数。代码中服务表包含一个 SERVICE_TABLE_ENTRY 结构体 SERVICE_TABLE_ENTRY stDispatchTable[] {{ g_szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },{ NULL, NULL } };g_szServiceName: 是你的服务的名字这里定义了为 “ServiceTest.exe”。(LPSERVICE_MAIN_FUNCTION)ServiceMain: 是指向服务入口函数 ServiceMain 的指针。当 SCM 启动服务时将调用这个函数。 这个服务表告诉 SCM 与哪个服务相关联通过哪个函数来启动和管理服务。 StartServiceCtrlDispatcher 函数接受这个服务表作为参数并负责将控制传递给适当的服务。 StartServiceCtrlDispatcher 用于启动服务控制分发器。这个函数通常在服务程序的 main 函数中调用它接受一个包含服务表的数组作为参数并将控制传递给适当的服务。 以下是 StartServiceCtrlDispatcher 函数的原型 BOOL StartServiceCtrlDispatcher(const SERVICE_TABLE_ENTRY *lpServiceTable );lpServiceTable: 指向 SERVICE_TABLE_ENTRY 结构体数组的指针该数组定义了服务表。服务表中的每个元素指定了服务的名称和服务入口函数。 该函数返回 BOOL 类型。如果调用成功返回 TRUE否则返回 FALSE。如果返回 FALSE可以通过调用 GetLastError 函数获取错误代码。 RegisterServiceCtrlHandler 用于注册一个服务控制处理程序该处理程序将接收来自 SCM服务控制管理器的控制请求。每个服务都需要注册一个服务控制处理程序以便在服务状态发生变化时接收通知。 以下是 RegisterServiceCtrlHandler 函数的原型 SERVICE_STATUS_HANDLE RegisterServiceCtrlHandler(LPCTSTR lpServiceName,LPHANDLER_FUNCTION_EX lpHandlerProc );lpServiceName: 指定要注册的服务的名称。这应该是服务在 SCM 中注册的唯一标识符。lpHandlerProc: 指定服务控制处理程序的地址。这是一个指向处理函数的指针该函数将在接收到控制请求时被调用。 函数返回一个 SERVICE_STATUS_HANDLE 类型的句柄。这个句柄用于标识服务控制管理器中的服务控制处理程序。 SetServiceStatus 用于通知 SCM服务控制管理器关于服务的当前状态。这个函数通常在服务的主循环中调用以便及时向 SCM 报告服务的状态变化。 以下是 SetServiceStatus 函数的原型 BOOL SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus,LPSERVICE_STATUS lpServiceStatus );hServiceStatus: 指定服务控制管理器中的服务的句柄即由 RegisterServiceCtrlHandler 返回的句柄。lpServiceStatus: 指向 SERVICE_STATUS 结构体的指针该结构体描述了服务的当前状态。 SERVICE_STATUS 结构体定义如下 typedef struct _SERVICE_STATUS {DWORD dwServiceType;DWORD dwCurrentState;DWORD dwControlsAccepted;DWORD dwWin32ExitCode;DWORD dwServiceSpecificExitCode;DWORD dwCheckPoint;DWORD dwWaitHint; } SERVICE_STATUS, *LPSERVICE_STATUS;dwServiceType: 服务的类型例如 SERVICE_WIN32_OWN_PROCESS。dwCurrentState: 服务的当前状态例如 SERVICE_RUNNING。dwControlsAccepted: 服务接受的控制码例如 SERVICE_ACCEPT_STOP 表示服务接受停止控制。dwWin32ExitCode: 服务的 Win32 退出码。dwServiceSpecificExitCode: 服务的特定退出码。dwCheckPoint: 在操作进行中时用于指示操作的进度。dwWaitHint: SCM 期望服务完成操作所需的等待时间。 有了上述接口的说明并通过遵循微软的对服务编写的定义即可实现一个系统服务这里的DoTask()是一个自定义函数该服务在启动后会率先执行此处此处可用于定义特定的功能例如开机自启动某个进程或者是远程创建套接字等当然了服务程序也可以是exe如下可以使用控制台方式创建。 #include Windows.h// 服务入口函数以及处理回调函数 void __stdcall ServiceMain(DWORD dwArgc, char *lpszArgv); void __stdcall ServiceCtrlHandle(DWORD dwOperateCode); BOOL TellSCM(DWORD dwState, DWORD dwExitCode, DWORD dwProgress); // 自定义函数 void DoTask();// 全局变量 char g_szServiceName[MAX_PATH] ServiceTest.exe; // 自身服务名称 SERVICE_STATUS_HANDLE g_ServiceStatusHandle { 0 };int main(int argc, char * argv[]) {// 注册服务入口函数SERVICE_TABLE_ENTRY stDispatchTable[] { { g_szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain }, { NULL, NULL } };::StartServiceCtrlDispatcher(stDispatchTable);return 0; }void __stdcall ServiceMain(DWORD dwArgc, char *lpszArgv) {g_ServiceStatusHandle ::RegisterServiceCtrlHandler(g_szServiceName, ServiceCtrlHandle);TellSCM(SERVICE_START_PENDING, 0, 1);TellSCM(SERVICE_RUNNING, 0, 0);while (TRUE){Sleep(5000);DoTask();} }void __stdcall ServiceCtrlHandle(DWORD dwOperateCode) {switch (dwOperateCode){case SERVICE_CONTROL_PAUSE:{// 暂停TellSCM(SERVICE_PAUSE_PENDING, 0, 1);TellSCM(SERVICE_PAUSED, 0, 0);break;}case SERVICE_CONTROL_CONTINUE:{// 继续TellSCM(SERVICE_CONTINUE_PENDING, 0, 1);TellSCM(SERVICE_RUNNING, 0, 0);break;}case SERVICE_CONTROL_STOP:{// 停止TellSCM(SERVICE_STOP_PENDING, 0, 1);TellSCM(SERVICE_STOPPED, 0, 0);break;}case SERVICE_CONTROL_INTERROGATE:{// 询问break;}default:break;} }BOOL TellSCM(DWORD dwState, DWORD dwExitCode, DWORD dwProgress) {SERVICE_STATUS serviceStatus { 0 };BOOL bRet FALSE;::RtlZeroMemory(serviceStatus, sizeof(serviceStatus));serviceStatus.dwServiceType SERVICE_WIN32_OWN_PROCESS;serviceStatus.dwCurrentState dwState;serviceStatus.dwControlsAccepted SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_SHUTDOWN;serviceStatus.dwWin32ExitCode dwExitCode;serviceStatus.dwWaitHint 3000;bRet ::SetServiceStatus(g_ServiceStatusHandle, serviceStatus);return bRet; }void DoTask() {// 自己程序实现部分代码放在这里 }设置SCM开机运行 独立的SCM程序无法直接双击运行该服务程序只能通过服务管理器运行通过使用CreateService将服务管理器程序设置为开机自动运行并使用StartService将服务启动。 CreateService 函数用于创建一个新的服务。这个函数通常在安装服务时使用。在服务安装过程中需要指定服务的名称、显示名称、服务类型、启动类型、二进制路径等信息。 以下是 CreateService 函数的原型 SC_HANDLE CreateService(SC_HANDLE hSCManager,LPCTSTR lpServiceName,LPCTSTR lpDisplayName,DWORD dwDesiredAccess,DWORD dwServiceType,DWORD dwStartType,DWORD dwErrorControl,LPCTSTR lpBinaryPathName,LPCTSTR lpLoadOrderGroup,LPDWORD lpdwTagId,LPCTSTR lpDependencies,LPCTSTR lpServiceStartName,LPCTSTR lpPassword );hSCManager: 服务控制管理器的句柄可以通过 OpenSCManager 函数获取。lpServiceName: 要创建的服务的名称。这是服务在 SCM 中的唯一标识符。lpDisplayName: 服务的显示名称这是在服务列表中显示的名称。dwDesiredAccess: 对服务的访问权限例如 SERVICE_ALL_ACCESS。dwServiceType: 服务的类型例如 SERVICE_WIN32_OWN_PROCESS。dwStartType: 服务的启动类型例如 SERVICE_AUTO_START。dwErrorControl: 当服务无法启动时的错误处理控制。lpBinaryPathName: 服务程序的可执行文件的路径。lpLoadOrderGroup: 指定服务应属于的加载顺序组。lpdwTagId: 指向接收服务标识符的指针。lpDependencies: 指定服务依赖的服务名称。lpServiceStartName: 服务启动时使用的用户名。lpPassword: 服务启动时使用的密码。 函数返回一个 SC_HANDLE 类型的句柄该句柄标识了新创建的服务。如果函数调用失败返回 NULL。可以通过调用 GetLastError 函数获取错误代码。 StartService 函数用于启动一个已注册的服务。这个函数通常在服务程序中的启动代码或者通过服务管理工具中手动启动服务时使用。 以下是 StartService 函数的原型 BOOL StartService(SC_HANDLE hService,DWORD dwNumServiceArgs,LPCTSTR *lpServiceArgVectors );hService: 要启动的服务的句柄可以通过 OpenService 函数获取。dwNumServiceArgs: 指定传递给服务的命令行参数数量。lpServiceArgVectors: 指向包含服务命令行参数的字符串数组。 函数返回一个 BOOL 类型的值如果调用成功返回 TRUE否则返回 FALSE。可以通过调用 GetLastError 函数获取错误代码。 ControlService 函数用于向已注册的服务发送控制码以便执行特定的操作。这个函数通常在服务程序中的控制逻辑或者通过服务管理工具中手动控制服务时使用。 以下是 ControlService 函数的原型 BOOL ControlService(SC_HANDLE hService,DWORD dwControl,LPSERVICE_STATUS lpServiceStatus );hService: 要控制的服务的句柄可以通过 OpenService 函数获取。dwControl: 指定服务的控制码可以是以下之一 SERVICE_CONTROL_CONTINUE: 继续服务。SERVICE_CONTROL_PAUSE: 暂停服务。SERVICE_CONTROL_STOP: 停止服务。等等还有其他服务控制码。 lpServiceStatus: 指向 SERVICE_STATUS 结构体的指针用于接收服务的当前状态信息。 函数返回一个 BOOL 类型的值如果调用成功返回 TRUE否则返回 FALSE。可以通过调用 GetLastError 函数获取错误代码。 如下代码实现了服务管理的两个关键功能AutoRunService 函数用于注册并启动服务使其在系统启动时自动运行SetServiceStatus 函数用于设置服务的状态包括停止服务、启动服务和删除服务。 这样的功能对于管理系统服务的状态和自启动行为具有重要意义。然而需要注意确保在执行这些操作时具有足够的权限并在实际应用中加强错误处理以确保操作的可靠性。 #include stdio.h #include Windows.h #include Shlwapi.h#pragma comment(lib, Shlwapi.lib)// 注册服务自启动 void AutoRunService(char* szFilePath, char* szDescribe) {char szName[MAX_PATH] { 0 };SC_HANDLE scHandle OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);lstrcpy(szName, szFilePath);PathStripPath(szName);SC_HANDLE scHandleOpen OpenService(scHandle, szName, SERVICE_ALL_ACCESS);if (scHandleOpen NULL){// SERVICE_AUTO_START 随系统自动启动 | SERVICE_DEMAND_START 手动启动SC_HANDLE scNewHandle CreateService(scHandle, szName, szDescribe,SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START,SERVICE_ERROR_IGNORE, szFilePath, NULL, NULL, NULL, NULL, NULL);StartService(scNewHandle, 0, NULL);CloseServiceHandle(scNewHandle);printf([*] 创建服务完成 \n);}CloseServiceHandle(scHandleOpen);CloseServiceHandle(scHandle); }// 设置服务状态 BOOL SetServiceStatus(char* szName, int Status) {SERVICE_STATUS ss;SC_HANDLE scHandle OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);SC_HANDLE scHandleOpen OpenService(scHandle, szName, SERVICE_ALL_ACCESS);BOOL bRet TRUE;if (scHandleOpen ! NULL){switch (Status){case 1: if (!ControlService(scHandleOpen, SERVICE_CONTROL_STOP, ss)) { bRet FALSE; }; break;case 2: if (!StartService(scHandleOpen, 0, NULL)) { bRet FALSE; }; break;case 3: if (!DeleteService(scHandleOpen)) { bRet FALSE; }break;default:break;}}CloseServiceHandle(scHandleOpen);CloseServiceHandle(scHandle);return bRet; }int main(int argc, char* argv[]) {// 注册为自启动服务将d:/myservice.exe 注册为自启动服务 后面是描述信息AutoRunService((char *)d:/myservice.exe, (char *)Microsoft Windows Security Services);// 根据服务名称管理服务 1停止服务 2启动服务 3删除服务BOOL ret SetServiceStatus((char *)myservice.exe, 2);printf(状态: %d \n, ret);system(pause);return 0; }运行上述代码将自动把d:/myservice.exe添加至服务自启动列表并可以通过枚举的方式找到该服务的具体信息如下图所示
http://www.yayakq.cn/news/2228/

相关文章:

  • 为什么做营销型网站信息网络安全
  • 中国建设教育网官网是什么网站网站推广方案计划书
  • 吉安网站做外贸的人常用的网站
  • 长沙网站建设价潍坊网站制作公司哪家比较好
  • 丰金网络 做网站wordpress炫酷背景
  • 顺义建设网站org域名注册条件
  • 网站备案注销流程长春到四平
  • 网站经营性质wordpress seo免费主题
  • 网站导航怎么做手机网站实例
  • 品牌网站建设哪个好图文排版模板
  • 看到一个电商网站帮做淘宝网站的宣传推广方式
  • 做健身推广网站重庆网站建设学习
  • 电商网站前端架构设计网站建设答案
  • 免费网站加速器frontpage制作个人网站 技巧
  • 网站在工信部备案查询即速应用微信小程序官网
  • 网站开发有什么软件承接网站建设广告语
  • 电商建设网站6黄页网站建设
  • 网站建设网站建设购买网站服务如何做支出
  • 淮阴网站建设黑帽seo排名
  • 19年做哪个网站致富钦州网站建设哪家便宜
  • 网络科技网站建设甘肃新闻
  • 公众号里的网站怎么做的百度快速排名系统查询
  • 网站平台建设心得学设计师需要学历吗
  • 网站开发设计素材网络 网站建设办公
  • 如何进行网络营销方式seo服务商
  • 建设部网站退休注册人员工程项目编号查询系统
  • 江西工程建设信息网站世界工厂采购网下载
  • 数据查询网站如何做永久3e38cos免费
  • 企业网站seo外包用php做网站要用什么软件
  • 永和建设集团有限公司网站广州网站设计首选柚米