zoukankan      html  css  js  c++  java
  • DELPHI版传奇引擎学习菜鸟篇(applem2)-06

    引擎源代码的学习暂时放下了几天,因为需要掌握一些进程处理方面的消息,之前在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的东西彻底搞明白了再继续,我发现就这么一个引擎控制包含着那么多的知识点,需要我去巩固一下,再次为自己加油.

  • 相关阅读:
    【转】CUDA5/CentOS6.4
    【转】centos 6.4 samba 安装配置
    【转】Install MATLAB 2013a on CentOS 6.4 x64 with mode silent
    【转】Getting xrdp to work on CentOS 6.4
    【VLFeat】使用matlab版本计算HOG
    Unofficial Windows Binaries for Python Extension Packages
    March 06th, 2018 Week 10th Tuesday
    March 05th, 2018 Week 10th Monday
    March 04th, 2018 Week 10th Sunday
    March 03rd, 2018 Week 9th Saturday
  • 原文地址:https://www.cnblogs.com/iicc/p/5077305.html
Copyright © 2011-2022 走看看