DELPHI版傳奇引擎學習菜鳥篇(applem2)-06

來源:互聯網
上載者:User

標籤:

引擎原始碼的學習暫時放下了幾天,因為需要掌握一些進程處理方面的訊息,之前在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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.