標籤:
引擎原始碼的學習暫時放下了幾天,因為需要掌握一些進程處理方面的訊息,之前在GAMECENTER中的啟動服務過程好好琢磨了一下,將服務啟動過程單獨拿出來,原先是用主介面的過程判斷處理啟動,好長的代碼,終於提煉出來了一個通用啟動過程,停止服務的過程和這個是類似的.
{運行外部程式的函數}function RunProgram(var ProgramInfo: TProgram; sHandle: string; dwWaitTime: LongWord): LongWord;var StartupInfo: TStartupInfo; sCommandLine: string; sCurDirectory: string;begin Result := 0; FillChar(StartupInfo, SizeOf(TStartupInfo), #0); GetStartupInfo(StartupInfo); sCommandLine := format(‘%s%s %s %d %d‘, [ProgramInfo.sDirectory, ProgramInfo.sProgramFile, sHandle, ProgramInfo.nMainFormX, ProgramInfo.nMainFormY]); sCurDirectory := ProgramInfo.sDirectory; if not CreateProcess(nil, //lpApplicationName, PChar(sCommandLine), //lpCommandLine, nil, //lpProcessAttributes, nil, //lpThreadAttributes, true, //bInheritHandles, 0, //dwCreationFlags, nil, //lpEnvironment, PChar(sCurDirectory), //lpCurrentDirectory, StartupInfo, //lpStartupInfo, ProgramInfo.ProcessInfo) then begin //lpProcessInformation Result := GetLastError(); end; Sleep(dwWaitTime); //WaitForInputIdle(ProgramInfo.ProcessInfo.hProcess,INFINITE);end;{通用啟動過程,RunGate的可以再寫一個,重載一下就行了}procedure StartGameTimer(var {之前把這個漏掉了}Server: TProgram; sHandle: string);var nRetCode: Integer;begin if Server.boGetStart then begin case Server.btStartStatus of 0: begin //CloseHandle(DBServer.ProcessHandle); {運行DBServer,返回0表示運行成功} nRetCode := RunProgram(Server, sHandle, 0); if nRetCode = 0 then begin {運行成功將運行標誌寫為1(正在啟動)} Server.btStartStatus := 1; {返回DBServer視窗控制代碼(顯示DBServer)} Server.ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, Server.ProcessInfo.dwProcessId); //frmMain.mainoutmessage(inttostr(server.ProcessHandle)); end else begin {否則顯示錯誤資訊,調用的是GetlastError} ShowMessage(IntToStr(nRetCode)); end; Exit; end; 1: begin //如果狀態為1 則還沒啟動完成 // Server.btStartStatus:=2; Exit; end; end; end;end;
因為基礎不紮實,光是這一個處理過程就讓我折騰了將近一個禮拜,最後才想起來斷點調試,跟蹤變數發現繼承主進程啟動的子進程控制代碼與檢測到的控制代碼不一樣,終於發現了是漏掉了var聲明,應該用傳引用調用,也許DELPHI裡邊也該這麼叫吧,使用的是變數被改變以後的值,不過還可以,總算知道自己學習過程中有什麼不足了,基礎還是重要的,之前學基礎沒怎麼注意這個,用到了才發現原來很簡單的東西被我想的無比複雜,為此我轉移注意力學習了幾天INI檔案讀寫,自己寫了setion和value遍曆函數,結果看到VCL裡邊有現成的東西,但是沒白費事件,至少知道了INI的基本結構和處理方法,雖然自己寫的有點囉嗦,但是總歸是自己實現的,自己UP一下,接下來的學習應該進入訊息處理階段了,DBServer先放一放,要回頭把GAMECENTER的東西徹底搞明白了再繼續,我發現就這麼一個引擎控制包含著那麼多的知識點,需要我去鞏固一下,再次為自己加油.
DELPHI版傳奇引擎學習菜鳥篇(applem2)-06