windows nt service 框架
生活随笔
收集整理的這篇文章主要介紹了
windows nt service 框架
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
// Service.cpp : Defines the entry point for the console application.
//
//服務(wù)程序主函數(shù)。
#include "stdafx.h"
#include "Windows.h"
#define SZAPPNAME????? "serverSample"???? //服務(wù)程序名
#define SZSERVICENAME? "serviceSample"??? //標(biāo)識服務(wù)的內(nèi)部名
//內(nèi)部變量
bool?????????????????? bDebugServer=false;
SERVICE_STATUS????????????? ssStatus;
SERVICE_STATUS_HANDLE? sshStatusHandle;
DWORD?????????????????????? dwErr=0;
TCHAR?????????????????????? szErr[256];
//下面的函數(shù)由程序?qū)崿F(xiàn)
void? WINAPI? Service_Main(DWORD dwArgc, LPTSTR *lpszArgv);
void? WINAPI? Service_Ctrl(DWORD dwCtrlCode);
void ServiceStart(DWORD dwArgc,LPTSTR* lpszArgv);//具體服務(wù)的初始化入口函數(shù)
void installService();
void removeService();
void debugService(int argc,char** argv);
bool ReportStatusToSCMgr(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwWaitHint);
void AddToMessageLog(LPTSTR lpszMsg);
//int _tmain(int argc, _TCHAR* argv[])
int _tmain(int argc, TCHAR* argv[])
{? ?
?? ?SERVICE_TABLE_ENTRY dispatchTable[]=
?? ?{
?? ??? ?{TEXT(SZSERVICENAME),(LPSERVICE_MAIN_FUNCTION)Service_Main},
?? ??? ?{ NULL,NULL}
?? ?};
??? if((argc>1)&&((*argv[1]=='-')||(argv[1]==TEXT("/"))))
?? ?{
?? ??? ?if(_tcsicmp(TEXT("install"),argv[1]+1)==0)
?? ??? ?{
?? ??? ??? ?installService();
?? ??? ?}
?? ??? ?else if(_tcsicmp(TEXT("remove"),argv[1]+1)==0)
?? ??? ?{
?? ??? ??? ?removeService();
?? ??? ?}
?? ??? ?else if(_tcsicmp(TEXT("debug"),argv[1]+1)==0)
?? ??? ?{
?? ??? ??? ?bDebugServer=true;
?? ??? ??? ?//debugService(argc,argv);
?? ??? ?}
?? ??? ?else
?? ??? ?{??????? //如果未能和上面的如何參數(shù)匹配,則可能是服務(wù)控制管理程序來啟動該程序。立即調(diào)用
?? ??? ??? ?//StartServiceCtrlDispatcher 函數(shù)。
?? ??? ??? ?printf("%s - install to install the service \n",SZAPPNAME);
?? ??? ??? ?printf("%s - remove to remove the service \n",SZAPPNAME);
?? ??? ??? ?printf("%s - debug to debug the service \n",SZAPPNAME);
?? ??? ??? ?printf("\n StartServiceCtrlDispatcher being called.\n");
?? ??? ??? ?printf("This may take several seconds.Please wait.\n");
?? ??? ??? ?if(!StartServiceCtrlDispatcher(dispatchTable))
?? ??? ??? ??? ?AddToMessageLog(TEXT("StartServiceCtrlDispatcher failed."));
?? ??? ??? ?else
?? ??? ??? ??? ?AddToMessageLog(TEXT("StartServiceCtrlDispatcher OK."));
?? ??? ?}
?? ??? ?exit(0);
?? ?}
?? ?return 0;
}
//服務(wù)入口點(diǎn)函數(shù)
void ServiceStart(DWORD dwArgc,LPTSTR* lpszArgv)??? //具體服務(wù)的初始化入口函數(shù)
{
?printf("\n StartServiceCtrlDispatcher being called.\n");
}
void? WINAPI? Service_Main(DWORD dwArgc, LPTSTR *lpszArgv)
{
?? ?//注冊服務(wù)控制處理函數(shù)
?? ?sshStatusHandle=RegisterServiceCtrlHandler(TEXT(SZSERVICENAME),Service_Ctrl);
?? ?//如果注冊失敗
?? ?if(!sshStatusHandle)
?? ?{
?? ??? ?goto cleanup;
?? ??? ?return;
?? ?}
?? ?//初始化 SERVICE_STATUS 結(jié)構(gòu)中的成員
?? ?ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS;
?? ?ssStatus.dwServiceSpecificExitCode=0;
?? ?//更新服務(wù)狀態(tài)
?? ?if(!ReportStatusToSCMgr(
?? ??? ?SERVICE_START_PENDING,//服務(wù)狀態(tài),The service is starting.
?? ??? ?NO_ERROR,??????????? //退出碼?????? ?
?? ??? ?3000))?????????????????? //等待時間
?? ??? ?goto cleanup;??????? //更新服務(wù)狀態(tài)失敗則轉(zhuǎn)向 cleanup
?? ?ServiceStart(dwArgc,lpszArgv);
?? ?return;
cleanup:
?? ?//把服務(wù)狀態(tài)更新為 SERVICE_STOPPED,并退出。
?? ?if(sshStatusHandle)
?? ??? ?(void)ReportStatusToSCMgr(SERVICE_STOPPED,dwErr,0);
}
//控制處理程序函數(shù)
void WINAPI Service_Ctrl(DWORD dwCtrlCode)
{
?? ?//處理控制請求碼
?? ?switch(dwCtrlCode)
?? ?{
?? ??? ?// 先更新服務(wù)狀態(tài)為 SERVICDE_STOP_PENDING,再停止服務(wù)。
?? ?case SERVICE_CONTROL_STOP:
?? ??? ?ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);
?? ??? ?//ServiceStop();???? //由具體的服務(wù)程序?qū)崿F(xiàn)
?? ??? ?return;
?? ??? ?// 暫停服務(wù)
?? ?case SERVICE_CONTROL_PAUSE:
?? ??? ?ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);
?? ??? ?//ServicePause();??? //由具體的服務(wù)程序?qū)崿F(xiàn)
?? ??? ?ssStatus.dwCurrentState=SERVICE_PAUSED;
?? ??? ?return;
?? ??? ?// 繼續(xù)服務(wù)
?? ?case SERVICE_CONTROL_CONTINUE:
?? ??? ?ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);
?? ??? ?//ServiceContinue(); //由具體的服務(wù)程序?qū)崿F(xiàn)
?? ??? ?ssStatus.dwCurrentState=SERVICE_RUNNING;
?? ??? ?return;
?? ??? ?// 更新服務(wù)狀態(tài)
?? ?case SERVICE_CONTROL_INTERROGATE:
?? ??? ?break;
?? ??? ?// 無效控制碼
?? ?default:
?? ??? ?break;
?? ?}
?? ?ReportStatusToSCMgr(ssStatus.dwCurrentState,NO_ERROR,0);
}
//安裝服務(wù)程序
void installService()
{
?? ?SC_HANDLE schService;
?? ?SC_HANDLE schSCManager;
?? ?TCHAR szPath[512];
?? ?//得到程序磁盤文件的路徑
?? ?if(GetModuleFileName(NULL,szPath,512)==0)
?? ?{
?? ??? ?_tprintf(TEXT("Unable to install %s - %s \n"),
?? ??? ??? ?TEXT(SZAPPNAME),
?? ??? ??? ?GetLastError());//@1獲取調(diào)用函數(shù)返回的最后錯誤碼
?? ??? ?return;
?? ?}
?? ?//打開服務(wù)管理數(shù)據(jù)庫
?? ?schSCManager=OpenSCManager(
?? ??? ?NULL,??? //本地計算機(jī)
?? ??? ?NULL,??? //默認(rèn)的數(shù)據(jù)庫
?? ??? ?SC_MANAGER_ALL_ACCESS? //要求所有的訪問權(quán)
?? ??? ?);
?? ?if(schSCManager)
?? ?{
?? ??? ?// 登記服務(wù)程序
?? ??? ?schService = CreateService(
?? ??? ??? ?schSCManager,??????????????????? //服務(wù)管理數(shù)據(jù)庫句柄
?? ??? ??? ?TEXT(SZSERVICENAME),???????????? //服務(wù)名
?? ??? ??? ?TEXT(SZAPPNAME),?????? //用于顯示服務(wù)的標(biāo)識
?? ??? ??? ?SERVICE_ALL_ACCESS,????????????? //響應(yīng)所有的訪問請求
?? ??? ??? ?SERVICE_WIN32_OWN_PROCESS,?????? //服務(wù)類型
?? ??? ??? ?//SERVICE_DEMAND_START,??????????? //啟動類型
?? ??? ??? ?SERVICE_AUTO_START,
?? ??? ??? ?SERVICE_ERROR_NORMAL,??????????? //錯誤控制類型
?? ??? ??? ?szPath,????????????????????????????? //服務(wù)程序磁盤文件的路徑
?? ??? ??? ?NULL,??????????????????????????????? //服務(wù)不屬于任何組
?? ??? ??? ?NULL,??????????????????????????????? //沒有tag標(biāo)識符
?? ??? ??? ?NULL,????????????? //啟動服務(wù)所依賴的服務(wù)或服務(wù)組,這里僅僅是一個空字符串
?? ??? ??? ?NULL,??????????????????????????????? //LocalSystem 帳號
?? ??? ??? ?NULL);
?? ??? ?if(schService)
?? ??? ?{
?? ??? ??? ?_tprintf(TEXT("%s installed. \n"),TEXT(SZAPPNAME));
?? ??? ??? ?CloseServiceHandle(schService);
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?_tprintf(TEXT("CreateService failed - %s \n"),GetLastError());
?? ??? ?}
?? ??? ?CloseServiceHandle(schSCManager);
?? ?}
?? ?else
?? ??? ?_tprintf(TEXT("OpenSCManager failed - %s \n"),GetLastError());
}
void removeService()
{
?? ?SC_HANDLE service, scm; ?? ??? ??? ?//定義服務(wù)句柄和服務(wù)控制管理數(shù)據(jù)庫句柄
?? ?SERVICE_STATUS status;?? ??? ??? ??? ?//定義服務(wù)狀態(tài)結(jié)構(gòu)
?? ?//if (argc != 2)? return; ?? ??? ??? ?//如果命令行參數(shù)的個數(shù)小于2,則不執(zhí)行卸載程序
?? ?// 打開服務(wù)控制管理數(shù)據(jù)庫,并返回服務(wù)控制管理數(shù)據(jù)庫的句柄
?? ?scm = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
?? ?// 獲得服務(wù)句柄,并添加服務(wù)訪問中的刪除選項
?? ?//service = OpenService(scm, argv[1],SERVICE_ALL_ACCESS | DELETE);
?? ?service = OpenService(scm, TEXT(SZSERVICENAME), SERVICE_ALL_ACCESS | DELETE);
??? // 獲得服務(wù)的當(dāng)前狀態(tài)
?? ?QueryServiceStatus(service, &status);
?? ?// 如果服務(wù)不處于停止?fàn)顟B(tài),則將其狀態(tài)設(shè)置為停止?fàn)顟B(tài)
?? ?if (status.dwCurrentState != SERVICE_STOPPED)
?? ??? ?ControlService(service,SERVICE_CONTROL_STOP, &status);
?? ?DeleteService(service);?? ??? ??? ??? ?// 刪除服務(wù)
?? ?CloseServiceHandle(service);?? ??? ?// 關(guān)閉新服務(wù)句柄
?? ?CloseServiceHandle(scm);?? ??? ??? ?// 關(guān)閉服務(wù)控制管理數(shù)據(jù)庫句柄
}
void debugService(int argc,char** argv)
{
}
bool ReportStatusToSCMgr(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwWaitHint)
{
?? return true;
}
void AddToMessageLog(LPTSTR lpszMsg)
{
?
//
//服務(wù)程序主函數(shù)。
#include "stdafx.h"
#include "Windows.h"
#define SZAPPNAME????? "serverSample"???? //服務(wù)程序名
#define SZSERVICENAME? "serviceSample"??? //標(biāo)識服務(wù)的內(nèi)部名
//內(nèi)部變量
bool?????????????????? bDebugServer=false;
SERVICE_STATUS????????????? ssStatus;
SERVICE_STATUS_HANDLE? sshStatusHandle;
DWORD?????????????????????? dwErr=0;
TCHAR?????????????????????? szErr[256];
//下面的函數(shù)由程序?qū)崿F(xiàn)
void? WINAPI? Service_Main(DWORD dwArgc, LPTSTR *lpszArgv);
void? WINAPI? Service_Ctrl(DWORD dwCtrlCode);
void ServiceStart(DWORD dwArgc,LPTSTR* lpszArgv);//具體服務(wù)的初始化入口函數(shù)
void installService();
void removeService();
void debugService(int argc,char** argv);
bool ReportStatusToSCMgr(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwWaitHint);
void AddToMessageLog(LPTSTR lpszMsg);
//int _tmain(int argc, _TCHAR* argv[])
int _tmain(int argc, TCHAR* argv[])
{? ?
?? ?SERVICE_TABLE_ENTRY dispatchTable[]=
?? ?{
?? ??? ?{TEXT(SZSERVICENAME),(LPSERVICE_MAIN_FUNCTION)Service_Main},
?? ??? ?{ NULL,NULL}
?? ?};
??? if((argc>1)&&((*argv[1]=='-')||(argv[1]==TEXT("/"))))
?? ?{
?? ??? ?if(_tcsicmp(TEXT("install"),argv[1]+1)==0)
?? ??? ?{
?? ??? ??? ?installService();
?? ??? ?}
?? ??? ?else if(_tcsicmp(TEXT("remove"),argv[1]+1)==0)
?? ??? ?{
?? ??? ??? ?removeService();
?? ??? ?}
?? ??? ?else if(_tcsicmp(TEXT("debug"),argv[1]+1)==0)
?? ??? ?{
?? ??? ??? ?bDebugServer=true;
?? ??? ??? ?//debugService(argc,argv);
?? ??? ?}
?? ??? ?else
?? ??? ?{??????? //如果未能和上面的如何參數(shù)匹配,則可能是服務(wù)控制管理程序來啟動該程序。立即調(diào)用
?? ??? ??? ?//StartServiceCtrlDispatcher 函數(shù)。
?? ??? ??? ?printf("%s - install to install the service \n",SZAPPNAME);
?? ??? ??? ?printf("%s - remove to remove the service \n",SZAPPNAME);
?? ??? ??? ?printf("%s - debug to debug the service \n",SZAPPNAME);
?? ??? ??? ?printf("\n StartServiceCtrlDispatcher being called.\n");
?? ??? ??? ?printf("This may take several seconds.Please wait.\n");
?? ??? ??? ?if(!StartServiceCtrlDispatcher(dispatchTable))
?? ??? ??? ??? ?AddToMessageLog(TEXT("StartServiceCtrlDispatcher failed."));
?? ??? ??? ?else
?? ??? ??? ??? ?AddToMessageLog(TEXT("StartServiceCtrlDispatcher OK."));
?? ??? ?}
?? ??? ?exit(0);
?? ?}
?? ?return 0;
}
//服務(wù)入口點(diǎn)函數(shù)
void ServiceStart(DWORD dwArgc,LPTSTR* lpszArgv)??? //具體服務(wù)的初始化入口函數(shù)
{
?printf("\n StartServiceCtrlDispatcher being called.\n");
}
void? WINAPI? Service_Main(DWORD dwArgc, LPTSTR *lpszArgv)
{
?? ?//注冊服務(wù)控制處理函數(shù)
?? ?sshStatusHandle=RegisterServiceCtrlHandler(TEXT(SZSERVICENAME),Service_Ctrl);
?? ?//如果注冊失敗
?? ?if(!sshStatusHandle)
?? ?{
?? ??? ?goto cleanup;
?? ??? ?return;
?? ?}
?? ?//初始化 SERVICE_STATUS 結(jié)構(gòu)中的成員
?? ?ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS;
?? ?ssStatus.dwServiceSpecificExitCode=0;
?? ?//更新服務(wù)狀態(tài)
?? ?if(!ReportStatusToSCMgr(
?? ??? ?SERVICE_START_PENDING,//服務(wù)狀態(tài),The service is starting.
?? ??? ?NO_ERROR,??????????? //退出碼?????? ?
?? ??? ?3000))?????????????????? //等待時間
?? ??? ?goto cleanup;??????? //更新服務(wù)狀態(tài)失敗則轉(zhuǎn)向 cleanup
?? ?ServiceStart(dwArgc,lpszArgv);
?? ?return;
cleanup:
?? ?//把服務(wù)狀態(tài)更新為 SERVICE_STOPPED,并退出。
?? ?if(sshStatusHandle)
?? ??? ?(void)ReportStatusToSCMgr(SERVICE_STOPPED,dwErr,0);
}
//控制處理程序函數(shù)
void WINAPI Service_Ctrl(DWORD dwCtrlCode)
{
?? ?//處理控制請求碼
?? ?switch(dwCtrlCode)
?? ?{
?? ??? ?// 先更新服務(wù)狀態(tài)為 SERVICDE_STOP_PENDING,再停止服務(wù)。
?? ?case SERVICE_CONTROL_STOP:
?? ??? ?ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);
?? ??? ?//ServiceStop();???? //由具體的服務(wù)程序?qū)崿F(xiàn)
?? ??? ?return;
?? ??? ?// 暫停服務(wù)
?? ?case SERVICE_CONTROL_PAUSE:
?? ??? ?ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);
?? ??? ?//ServicePause();??? //由具體的服務(wù)程序?qū)崿F(xiàn)
?? ??? ?ssStatus.dwCurrentState=SERVICE_PAUSED;
?? ??? ?return;
?? ??? ?// 繼續(xù)服務(wù)
?? ?case SERVICE_CONTROL_CONTINUE:
?? ??? ?ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);
?? ??? ?//ServiceContinue(); //由具體的服務(wù)程序?qū)崿F(xiàn)
?? ??? ?ssStatus.dwCurrentState=SERVICE_RUNNING;
?? ??? ?return;
?? ??? ?// 更新服務(wù)狀態(tài)
?? ?case SERVICE_CONTROL_INTERROGATE:
?? ??? ?break;
?? ??? ?// 無效控制碼
?? ?default:
?? ??? ?break;
?? ?}
?? ?ReportStatusToSCMgr(ssStatus.dwCurrentState,NO_ERROR,0);
}
//安裝服務(wù)程序
void installService()
{
?? ?SC_HANDLE schService;
?? ?SC_HANDLE schSCManager;
?? ?TCHAR szPath[512];
?? ?//得到程序磁盤文件的路徑
?? ?if(GetModuleFileName(NULL,szPath,512)==0)
?? ?{
?? ??? ?_tprintf(TEXT("Unable to install %s - %s \n"),
?? ??? ??? ?TEXT(SZAPPNAME),
?? ??? ??? ?GetLastError());//@1獲取調(diào)用函數(shù)返回的最后錯誤碼
?? ??? ?return;
?? ?}
?? ?//打開服務(wù)管理數(shù)據(jù)庫
?? ?schSCManager=OpenSCManager(
?? ??? ?NULL,??? //本地計算機(jī)
?? ??? ?NULL,??? //默認(rèn)的數(shù)據(jù)庫
?? ??? ?SC_MANAGER_ALL_ACCESS? //要求所有的訪問權(quán)
?? ??? ?);
?? ?if(schSCManager)
?? ?{
?? ??? ?// 登記服務(wù)程序
?? ??? ?schService = CreateService(
?? ??? ??? ?schSCManager,??????????????????? //服務(wù)管理數(shù)據(jù)庫句柄
?? ??? ??? ?TEXT(SZSERVICENAME),???????????? //服務(wù)名
?? ??? ??? ?TEXT(SZAPPNAME),?????? //用于顯示服務(wù)的標(biāo)識
?? ??? ??? ?SERVICE_ALL_ACCESS,????????????? //響應(yīng)所有的訪問請求
?? ??? ??? ?SERVICE_WIN32_OWN_PROCESS,?????? //服務(wù)類型
?? ??? ??? ?//SERVICE_DEMAND_START,??????????? //啟動類型
?? ??? ??? ?SERVICE_AUTO_START,
?? ??? ??? ?SERVICE_ERROR_NORMAL,??????????? //錯誤控制類型
?? ??? ??? ?szPath,????????????????????????????? //服務(wù)程序磁盤文件的路徑
?? ??? ??? ?NULL,??????????????????????????????? //服務(wù)不屬于任何組
?? ??? ??? ?NULL,??????????????????????????????? //沒有tag標(biāo)識符
?? ??? ??? ?NULL,????????????? //啟動服務(wù)所依賴的服務(wù)或服務(wù)組,這里僅僅是一個空字符串
?? ??? ??? ?NULL,??????????????????????????????? //LocalSystem 帳號
?? ??? ??? ?NULL);
?? ??? ?if(schService)
?? ??? ?{
?? ??? ??? ?_tprintf(TEXT("%s installed. \n"),TEXT(SZAPPNAME));
?? ??? ??? ?CloseServiceHandle(schService);
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?_tprintf(TEXT("CreateService failed - %s \n"),GetLastError());
?? ??? ?}
?? ??? ?CloseServiceHandle(schSCManager);
?? ?}
?? ?else
?? ??? ?_tprintf(TEXT("OpenSCManager failed - %s \n"),GetLastError());
}
void removeService()
{
?? ?SC_HANDLE service, scm; ?? ??? ??? ?//定義服務(wù)句柄和服務(wù)控制管理數(shù)據(jù)庫句柄
?? ?SERVICE_STATUS status;?? ??? ??? ??? ?//定義服務(wù)狀態(tài)結(jié)構(gòu)
?? ?//if (argc != 2)? return; ?? ??? ??? ?//如果命令行參數(shù)的個數(shù)小于2,則不執(zhí)行卸載程序
?? ?// 打開服務(wù)控制管理數(shù)據(jù)庫,并返回服務(wù)控制管理數(shù)據(jù)庫的句柄
?? ?scm = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
?? ?// 獲得服務(wù)句柄,并添加服務(wù)訪問中的刪除選項
?? ?//service = OpenService(scm, argv[1],SERVICE_ALL_ACCESS | DELETE);
?? ?service = OpenService(scm, TEXT(SZSERVICENAME), SERVICE_ALL_ACCESS | DELETE);
??? // 獲得服務(wù)的當(dāng)前狀態(tài)
?? ?QueryServiceStatus(service, &status);
?? ?// 如果服務(wù)不處于停止?fàn)顟B(tài),則將其狀態(tài)設(shè)置為停止?fàn)顟B(tài)
?? ?if (status.dwCurrentState != SERVICE_STOPPED)
?? ??? ?ControlService(service,SERVICE_CONTROL_STOP, &status);
?? ?DeleteService(service);?? ??? ??? ??? ?// 刪除服務(wù)
?? ?CloseServiceHandle(service);?? ??? ?// 關(guān)閉新服務(wù)句柄
?? ?CloseServiceHandle(scm);?? ??? ??? ?// 關(guān)閉服務(wù)控制管理數(shù)據(jù)庫句柄
}
void debugService(int argc,char** argv)
{
}
bool ReportStatusToSCMgr(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwWaitHint)
{
?? return true;
}
void AddToMessageLog(LPTSTR lpszMsg)
{
?
?
}
?
http://blog.chinaunix.net/u1/37538/showart_493320.html
http://www.wei2008.com/Code/softdown.asp?softid=35719?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/chenhs/archive/2010/07/14/1777635.html
總結(jié)
以上是生活随笔為你收集整理的windows nt service 框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么EXE不能超过4GB
- 下一篇: 解决 Windows 和 Ubuntu