依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 166|回复: 0

[游戏架设教程] DELPHI版传奇引擎学习菜鸟篇(applem2)-02

[复制链接] 主动推送

2365

主题

2374

帖子

3671

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3671
发表于 2024-11-2 23:51:51 | 显示全部楼层 |阅读模式
DELPHI版传奇引擎学习菜鸟篇(applem2)-02
每天只学习一个知识点,也是一种进步.
接着学习GShare.pas的实现部分,其实这个应该叫做GAMECENTER共享单元,我刚开始理解的是错误的,这是根据名字起的.
在学习实现部分之前,声明部分还有一些变量:
  1. //虽然光看这些变量不可能全部知道代表什么,但是为了学习,还是注释一下
  2. var
  3.   //下面4个应该是更新数据(格式)用的,默认为本机更新
  4.   g_sDataListAddrs: string = '127.0.0.1';
  5.   g_wDataListPort: Word = 18888;
  6.   g_sDataListPassWord: string = '123456';
  7.   g_boGetDataListOK: Boolean = False;
  8.   //下面3个是获取更新列表用的,
  9.   g_DataListReadBuffer: PChar;
  10.   g_nDataListReadLength: Integer;
  11.   g_GetDatList: TStringList;

  12.   //下面6个很明显,从字面就能看出意思对应启动设置\窗口\按钮状态
  13.   g_nFormIdx: Integer;
  14.   g_IniConf: Tinifile;
  15.   g_sButtonStartGame: string = '启动游戏服务器(&S)';
  16.   g_sButtonStopGame: string = '停止游戏服务器(&T)';
  17.   g_sButtonStopStartGame: string = '中止启动游戏服务器(&T)';
  18.   g_sButtonStopStopGame: string = '中止停止游戏服务器(&T)';
  19.   //下面对应的都是配置变量,主窗口都有对应的控件
  20.   g_sConfFile: string = '.\Config.ini';
  21.   g_sBackListFile: string = '.\BackupList.txt';
  22.   g_sGameName: string = '测试引擎';
  23.   g_sGameDirectory: string = '.\';
  24.   g_sHeroDBName: string = 'HeroDB';
  25.   g_sExtIPaddr: string = '127.0.0.1';
  26.   g_sExtIPaddr2: string = '127.0.0.1';
  27.   g_boAutoRunBak: Boolean = False;
  28.   g_boCloseWuXin: Boolean = False;
  29.   g_boIP2: Boolean = False;
  30.   // 声明并初始化服务端配置结构,也许类似这样的应该定义为类,前边也好多
  31.   g_Config: TConfig = (
  32.       DBServer: (
  33.         MainFormX: 0;
  34.         MainFormY: 373;
  35.         GatePort: 5100;
  36.         ServerPort: 6000;
  37.         GetStart: True;
  38.         ProgramFile: 'DBServer.exe';
  39.       );
  40.       LoginSrv: (
  41.         MainFormX: 252;
  42.         MainFormY: 0;
  43.         GatePort: 5500;
  44.         ServerPort: 5600;
  45.         MonPort: 3000;
  46.         GetStart: True;
  47.         ProgramFile: 'LoginSrv.exe';
  48.       );
  49.       M2Server:(
  50.         MainFormX: 561;
  51.         MainFormY: 0;
  52.         GatePort: 5000;
  53.         MsgSrvPort: 4900;
  54.         GetStart: True;
  55.         ProgramFile: 'M2Server.exe';
  56.         ProgramFile: 'PlugTop.exe';
  57.       );
  58.       LogServer:(
  59.         MainFormX: 252;
  60.         MainFormY: 286;
  61.         Port: 10000;
  62.         GetStart: True;
  63.         ProgramFile: 'LogDataServer.exe';
  64.       );

  65.        RunGate:(
  66.         MainFormX: 437;
  67.         MainFormY: 373;
  68.         GetStart: (True, False, False, False, False, False, False, False);
  69.         GatePort: (7200, 7201, 7202, 7203, 7204, 7205, 7206, 7207);
  70.         ProgramFile: 'RunGate.exe';
  71.       );
  72.       SelGate:(
  73.         MainFormX: 0;
  74.         MainFormY: 180;
  75.         GatePort: (7100, 7101);
  76.         GetStart1: True;
  77.         GetStart2: False;
  78.         ProgramFile: 'SelGate.exe';
  79.       );
  80.       LoginGate:(
  81.         MainFormX: 0;
  82.         MainFormY: 0;
  83.         GatePort: 7000;
  84.         GetStart: True;
  85.         ProgramFile: 'LoginGate.exe';
  86.       );
  87.        PlugTop:(
  88.         MainFormX: 525;
  89.         MainFormY:300;
  90.         GetStart: True;
  91.         ProgramFile: 'PlugTop.exe';
  92.       );
  93.     );
  94.   //声明服务程序变量,暂时就这么理解吧
  95.   DBServer: TProgram;
  96.   LoginServer: TProgram;
  97.   LogServer: TProgram;
  98.   M2Server: TProgram;
  99.   RunGate: array[0..MAXRUNGATECOUNT - 1] of TProgram;
  100.   SelGate: TProgram;
  101.   SelGate1: TProgram;
  102.   LoginGate: TProgram;
  103.   LoginGate2: TProgram;
  104.   PlugTop: TProgram;
  105.   //下面是检测程序运行状态的变量,暂时理解为心跳检测吧
  106.   g_dwStopTick: LongWord;
  107.   g_dwStopTimeOut: LongWord = 10000;
  108.   g_dwM2CheckCodeAddr: LongWord;
  109.   g_dwDBCheckCodeAddr: LongWord;
  110.   g_BackUpManager: TBackUpManager;
  111.   m_nBackStartStatus: Integer = 0;
复制代码
到此GShare.pas的声明部分结束,觉得还可以优化,接下来是实现部分,实现一共有5个函数\过程:
  1. procedure LoadConfig();//加载配置
  2. procedure SaveConfig();//保存配置
  3. {运行服务}
  4. function RunProgram(var ProgramInfo: TProgram; sHandle: string; dwWaitTime: LongWord): LongWord;
  5. {停止服务}
  6. function StopProgram(var ProgramInfo: TProgram; dwWaitTime: LongWord): Integer;
  7. {发送消息}
  8. procedure SendProgramMsg(DesForm: THandle; wIdent: Word; sSendMsg: string);
复制代码
加载保存配置就是读取和写入服务端里边的INI和TXT配置文件,启动停止服务发送数据(消息)用的是API:
  1. //读取配置信息
  2. procedure LoadConfig();
  3. begin
  4.   //下面一堆都是读取INI文件,准备后续优化一下
  5.   g_sGameDirectory := g_IniConf.ReadString(BasicSectionName, 'GameDirectory', g_sGameDirectory);
  6.   g_sHeroDBName := g_IniConf.ReadString(BasicSectionName, 'HeroDBName', g_sHeroDBName);
  7.   g_sGameName := g_IniConf.ReadString(BasicSectionName, 'GameName', g_sGameName);
  8.   g_sExtIPaddr := g_IniConf.ReadString(BasicSectionName, 'ExtIPaddr', g_sExtIPaddr);
  9.   g_sExtIPaddr2 := g_IniConf.ReadString(BasicSectionName, 'ExtIPaddr2', g_sExtIPaddr2);
  10.   g_boAutoRunBak := g_IniConf.ReadBool(BasicSectionName, 'AutoRunBak', g_boAutoRunBak);
  11.   g_boIP2 := g_IniConf.ReadBool(BasicSectionName, 'IP2', g_boIP2);
  12.   g_boCloseWuXin := g_IniConf.ReadBool(BasicSectionName, 'CloseWuXin', g_boCloseWuXin);

  13.   g_Config.DBServer.MainFormX := g_IniConf.ReadInteger(DBServerSectionName, 'MainFormX', g_Config.DBServer.MainFormX);
  14.   g_Config.DBServer.MainFormY := g_IniConf.ReadInteger(DBServerSectionName, 'MainFormY', g_Config.DBServer.MainFormY);
  15.   g_Config.DBServer.GatePort := g_IniConf.ReadInteger(DBServerSectionName, 'GatePort', g_Config.DBServer.GatePort);
  16.   g_Config.DBServer.ServerPort := g_IniConf.ReadInteger(DBServerSectionName, 'ServerPort', g_Config.DBServer.ServerPort);
  17.   g_Config.DBServer.GetStart := g_IniConf.ReadBool(DBServerSectionName, 'GetStart', g_Config.DBServer.GetStart);

  18.   g_Config.LoginSrv.MainFormX := g_IniConf.ReadInteger(LoginSrvSectionName, 'MainFormX', g_Config.LoginSrv.MainFormX);
  19.   g_Config.LoginSrv.MainFormY := g_IniConf.ReadInteger(LoginSrvSectionName, 'MainFormY', g_Config.LoginSrv.MainFormY);
  20.   g_Config.LoginSrv.GatePort := g_IniConf.ReadInteger(LoginSrvSectionName, 'GatePort', g_Config.LoginSrv.GatePort);
  21.   g_Config.LoginSrv.ServerPort := g_IniConf.ReadInteger(LoginSrvSectionName, 'ServerPort', g_Config.LoginSrv.ServerPort);
  22.   g_Config.LoginSrv.MonPort := g_IniConf.ReadInteger(LoginSrvSectionName, 'MonPort', g_Config.LoginSrv.MonPort);
  23.   g_Config.LoginSrv.GetStart := g_IniConf.ReadBool(LoginSrvSectionName, 'GetStart', g_Config.LoginSrv.GetStart);

  24.   g_Config.M2Server.MainFormX := g_IniConf.ReadInteger(M2ServerSectionName, 'MainFormX', g_Config.M2Server.MainFormX);
  25.   g_Config.M2Server.MainFormY := g_IniConf.ReadInteger(M2ServerSectionName, 'MainFormY', g_Config.M2Server.MainFormY);
  26.   g_Config.M2Server.GatePort := g_IniConf.ReadInteger(M2ServerSectionName, 'GatePort', g_Config.M2Server.GatePort);
  27.   g_Config.M2Server.MsgSrvPort := g_IniConf.ReadInteger(M2ServerSectionName, 'MsgSrvPort', g_Config.M2Server.MsgSrvPort);
  28.   g_Config.M2Server.GetStart := g_IniConf.ReadBool(M2ServerSectionName, 'GetStart', g_Config.M2Server.GetStart);

  29.   g_Config.LogServer.MainFormX := g_IniConf.ReadInteger(LogServerSectionName, 'MainFormX', g_Config.LogServer.MainFormX);
  30.   g_Config.LogServer.MainFormY := g_IniConf.ReadInteger(LogServerSectionName, 'MainFormY', g_Config.LogServer.MainFormY);
  31.   g_Config.LogServer.Port := g_IniConf.ReadInteger(LogServerSectionName, 'Port', g_Config.LogServer.Port);
  32.   g_Config.LogServer.GetStart := g_IniConf.ReadBool(LogServerSectionName, 'GetStart', g_Config.LogServer.GetStart);

  33.   g_Config.RunGate.MainFormX := g_IniConf.ReadInteger(RunGateSectionName, 'MainFormX', g_Config.RunGate.MainFormX);
  34.   g_Config.RunGate.MainFormY := g_IniConf.ReadInteger(RunGateSectionName, 'MainFormY', g_Config.RunGate.MainFormY);
  35.   g_Config.RunGate.GetStart[0] := g_IniConf.ReadBool(RunGateSectionName, 'GetStart1', g_Config.RunGate.GetStart[0]);
  36.   g_Config.RunGate.GetStart[1] := g_IniConf.ReadBool(RunGateSectionName, 'GetStart2', g_Config.RunGate.GetStart[1]);
  37.   g_Config.RunGate.GetStart[2] := g_IniConf.ReadBool(RunGateSectionName, 'GetStart3', g_Config.RunGate.GetStart[2]);
  38.   g_Config.RunGate.GetStart[3] := g_IniConf.ReadBool(RunGateSectionName, 'GetStart4', g_Config.RunGate.GetStart[3]);
  39.   g_Config.RunGate.GetStart[4] := g_IniConf.ReadBool(RunGateSectionName, 'GetStart5', g_Config.RunGate.GetStart[4]);
  40.   g_Config.RunGate.GetStart[5] := g_IniConf.ReadBool(RunGateSectionName, 'GetStart6', g_Config.RunGate.GetStart[5]);
  41.   g_Config.RunGate.GetStart[6] := g_IniConf.ReadBool(RunGateSectionName, 'GetStart7', g_Config.RunGate.GetStart[6]);
  42.   g_Config.RunGate.GetStart[7] := g_IniConf.ReadBool(RunGateSectionName, 'GetStart8', g_Config.RunGate.GetStart[7]);

  43.   g_Config.RunGate.GatePort[0] := g_IniConf.ReadInteger(RunGateSectionName, 'GatePort1', g_Config.RunGate.GatePort[0]);
  44.   g_Config.RunGate.GatePort[1] := g_IniConf.ReadInteger(RunGateSectionName, 'GatePort2', g_Config.RunGate.GatePort[1]);
  45.   g_Config.RunGate.GatePort[2] := g_IniConf.ReadInteger(RunGateSectionName, 'GatePort3', g_Config.RunGate.GatePort[2]);
  46.   g_Config.RunGate.GatePort[3] := g_IniConf.ReadInteger(RunGateSectionName, 'GatePort4', g_Config.RunGate.GatePort[3]);
  47.   g_Config.RunGate.GatePort[4] := g_IniConf.ReadInteger(RunGateSectionName, 'GatePort5', g_Config.RunGate.GatePort[4]);
  48.   g_Config.RunGate.GatePort[5] := g_IniConf.ReadInteger(RunGateSectionName, 'GatePort6', g_Config.RunGate.GatePort[5]);
  49.   g_Config.RunGate.GatePort[6] := g_IniConf.ReadInteger(RunGateSectionName, 'GatePort7', g_Config.RunGate.GatePort[6]);
  50.   g_Config.RunGate.GatePort[7] := g_IniConf.ReadInteger(RunGateSectionName, 'GatePort8', g_Config.RunGate.GatePort[7]);

  51.   g_Config.SelGate.MainFormX := g_IniConf.ReadInteger(SelGateSectionName, 'MainFormX', g_Config.SelGate.MainFormX);
  52.   g_Config.SelGate.MainFormY := g_IniConf.ReadInteger(SelGateSectionName, 'MainFormY', g_Config.SelGate.MainFormY);
  53.   g_Config.SelGate.GatePort[0] := g_IniConf.ReadInteger(SelGateSectionName, 'GatePort1', g_Config.SelGate.GatePort[0]);
  54.   g_Config.SelGate.GatePort[1] := g_IniConf.ReadInteger(SelGateSectionName, 'GatePort2', g_Config.SelGate.GatePort[1]);
  55.   g_Config.SelGate.GetStart1 := g_IniConf.ReadBool(SelGateSectionName, 'GetStart1', g_Config.SelGate.GetStart1);
  56.   g_Config.SelGate.GetStart2 := g_IniConf.ReadBool(SelGateSectionName, 'GetStart2', g_Config.SelGate.GetStart2);

  57.   g_Config.LoginGate.MainFormX := g_IniConf.ReadInteger(LoginGateSectionName, 'MainFormX', g_Config.LoginGate.MainFormX);
  58.   g_Config.LoginGate.MainFormY := g_IniConf.ReadInteger(LoginGateSectionName, 'MainFormY', g_Config.LoginGate.MainFormY);
  59.   g_Config.LoginGate.GatePort := g_IniConf.ReadInteger(LoginGateSectionName, 'GatePort', g_Config.LoginGate.GatePort);
  60.   g_Config.LoginGate.GetStart := g_IniConf.ReadBool(LoginGateSectionName, 'GetStart', g_Config.LoginGate.GetStart);

  61.   g_Config.PlugTop.MainFormX := g_IniConf.ReadInteger(PlugTopSectionName, 'MainFormX', g_Config.PlugTop.MainFormX);
  62.   g_Config.PlugTop.MainFormY := g_IniConf.ReadInteger(PlugTopSectionName, 'MainFormY', g_Config.PlugTop.MainFormY);
  63.   g_Config.PlugTop.GetStart := g_IniConf.ReadBool(PlugTopSectionName, 'GetStart', g_Config.PlugTop.GetStart);
  64. end;

  65. procedure SaveConfig();   //保存配置信息
  66. begin
  67.   //没什么可注释的,写入INI
  68.   g_IniConf.WriteString(BasicSectionName, 'GameDirectory', g_sGameDirectory);
  69.   g_IniConf.WriteString(BasicSectionName, 'HeroDBName', g_sHeroDBName);
  70.   g_IniConf.WriteString(BasicSectionName, 'GameName', g_sGameName);
  71.   g_IniConf.WriteString(BasicSectionName, 'ExtIPaddr', g_sExtIPaddr);
  72.   g_IniConf.WriteString(BasicSectionName, 'ExtIPaddr2', g_sExtIPaddr2);
  73.   g_IniConf.WriteBool(BasicSectionName, 'AutoRunBak', g_boAutoRunBak);
  74.   g_IniConf.WriteBool(BasicSectionName, 'IP2', g_boIP2);
  75.   g_IniConf.WriteBool(BasicSectionName, 'CloseWuXin', g_boCloseWuXin);

  76.   g_IniConf.WriteInteger(DBServerSectionName, 'MainFormX', g_Config.DBServer.MainFormX);
  77.   g_IniConf.WriteInteger(DBServerSectionName, 'MainFormY', g_Config.DBServer.MainFormY);
  78.   g_IniConf.WriteInteger(DBServerSectionName, 'GatePort', g_Config.DBServer.GatePort);
  79.   g_IniConf.WriteInteger(DBServerSectionName, 'ServerPort', g_Config.DBServer.ServerPort);
  80.   g_IniConf.WriteBool(DBServerSectionName, 'GetStart', g_Config.DBServer.GetStart);

  81.   g_IniConf.WriteInteger(LoginSrvSectionName, 'MainFormX', g_Config.LoginSrv.MainFormX);
  82.   g_IniConf.WriteInteger(LoginSrvSectionName, 'MainFormY', g_Config.LoginSrv.MainFormY);
  83.   g_IniConf.WriteInteger(LoginSrvSectionName, 'GatePort', g_Config.LoginSrv.GatePort);
  84.   g_IniConf.WriteInteger(LoginSrvSectionName, 'ServerPort', g_Config.LoginSrv.ServerPort);
  85.   g_IniConf.WriteInteger(LoginSrvSectionName, 'MonPort', g_Config.LoginSrv.MonPort);
  86.   g_IniConf.WriteBool(LoginSrvSectionName, 'GetStart', g_Config.LoginSrv.GetStart);

  87.   g_IniConf.WriteInteger(M2ServerSectionName, 'MainFormX', g_Config.M2Server.MainFormX);
  88.   g_IniConf.WriteInteger(M2ServerSectionName, 'MainFormY', g_Config.M2Server.MainFormY);
  89.   g_IniConf.WriteInteger(M2ServerSectionName, 'GatePort', g_Config.M2Server.GatePort);
  90.   g_IniConf.WriteInteger(M2ServerSectionName, 'MsgSrvPort', g_Config.M2Server.MsgSrvPort);
  91.   g_IniConf.WriteBool(M2ServerSectionName, 'GetStart', g_Config.M2Server.GetStart);

  92.   g_IniConf.WriteInteger(LogServerSectionName, 'MainFormX', g_Config.LogServer.MainFormX);
  93.   g_IniConf.WriteInteger(LogServerSectionName, 'MainFormY', g_Config.LogServer.MainFormY);
  94.   g_IniConf.WriteInteger(LogServerSectionName, 'Port', g_Config.LogServer.Port);
  95.   g_IniConf.WriteBool(LogServerSectionName, 'GetStart', g_Config.LogServer.GetStart);

  96.   g_IniConf.WriteInteger(RunGateSectionName, 'MainFormX', g_Config.RunGate.MainFormX);
  97.   g_IniConf.WriteInteger(RunGateSectionName, 'MainFormY', g_Config.RunGate.MainFormY);
  98.   g_IniConf.WriteBool(RunGateSectionName, 'GetStart1', g_Config.RunGate.GetStart[0]);
  99.   g_IniConf.WriteBool(RunGateSectionName, 'GetStart2', g_Config.RunGate.GetStart[1]);
  100.   g_IniConf.WriteBool(RunGateSectionName, 'GetStart3', g_Config.RunGate.GetStart[2]);
  101.   g_IniConf.WriteBool(RunGateSectionName, 'GetStart4', g_Config.RunGate.GetStart[3]);
  102.   g_IniConf.WriteBool(RunGateSectionName, 'GetStart5', g_Config.RunGate.GetStart[4]);
  103.   g_IniConf.WriteBool(RunGateSectionName, 'GetStart6', g_Config.RunGate.GetStart[5]);
  104.   g_IniConf.WriteBool(RunGateSectionName, 'GetStart7', g_Config.RunGate.GetStart[6]);
  105.   g_IniConf.WriteBool(RunGateSectionName, 'GetStart8', g_Config.RunGate.GetStart[7]);

  106.   g_IniConf.WriteInteger(RunGateSectionName, 'GatePort1', g_Config.RunGate.GatePort[0]);
  107.   g_IniConf.WriteInteger(RunGateSectionName, 'GatePort2', g_Config.RunGate.GatePort[1]);
  108.   g_IniConf.WriteInteger(RunGateSectionName, 'GatePort3', g_Config.RunGate.GatePort[2]);
  109.   g_IniConf.WriteInteger(RunGateSectionName, 'GatePort4', g_Config.RunGate.GatePort[3]);
  110.   g_IniConf.WriteInteger(RunGateSectionName, 'GatePort5', g_Config.RunGate.GatePort[4]);
  111.   g_IniConf.WriteInteger(RunGateSectionName, 'GatePort6', g_Config.RunGate.GatePort[5]);
  112.   g_IniConf.WriteInteger(RunGateSectionName, 'GatePort7', g_Config.RunGate.GatePort[6]);
  113.   g_IniConf.WriteInteger(RunGateSectionName, 'GatePort8', g_Config.RunGate.GatePort[7]);

  114.   g_IniConf.WriteInteger(SelGateSectionName, 'MainFormX', g_Config.SelGate.MainFormX);
  115.   g_IniConf.WriteInteger(SelGateSectionName, 'MainFormY', g_Config.SelGate.MainFormY);
  116.   g_IniConf.WriteInteger(SelGateSectionName, 'GatePort1', g_Config.SelGate.GatePort[0]);
  117.   g_IniConf.WriteInteger(SelGateSectionName, 'GatePort2', g_Config.SelGate.GatePort[1]);
  118.   g_IniConf.WriteBool(SelGateSectionName, 'GetStart1', g_Config.SelGate.GetStart1);
  119.   g_IniConf.WriteBool(SelGateSectionName, 'GetStart2', g_Config.SelGate.GetStart2);

  120.   g_IniConf.WriteInteger(LoginGateSectionName, 'MainFormX', g_Config.LoginGate.MainFormX);
  121.   g_IniConf.WriteInteger(LoginGateSectionName, 'MainFormY', g_Config.LoginGate.MainFormY);
  122.   g_IniConf.WriteInteger(LoginGateSectionName, 'GatePort', g_Config.LoginGate.GatePort);
  123.   g_IniConf.WriteBool(LoginGateSectionName, 'GetStart', g_Config.LoginGate.GetStart);

  124.   g_IniConf.WriteInteger(PlugTopSectionName, 'MainFormX', g_Config.PlugTop.MainFormX);
  125.   g_IniConf.WriteInteger(PlugTopSectionName, 'MainFormY', g_Config.PlugTop.MainFormY);
  126.   g_IniConf.WriteBool(PlugTopSectionName, 'GetStart', g_Config.PlugTop.GetStart);
  127. end;
  128. {启动服务,用的大部分是API}
  129. function RunProgram(var ProgramInfo: TProgram; sHandle: string; dwWaitTime: LongWord): LongWord;
  130. var
  131.   StartupInfo: TStartupInfo; //获取窗口状态
  132.   sCommandLine: string;      //程序完整路径
  133.   sCurDirectory: string;     //程序目录
  134. begin
  135.   Result := 0;
  136.   FillChar(StartupInfo, SizeOf(TStartupInfo), #0); //这个虽然查看了API参考,还是不理解,暂时就认为它是初始化吧
  137.   GetStartupInfo(StartupInfo);//获取进程的启动信息
  138.   {格式化程序完整路径字符串}
  139.   sCommandLine := format('%s%s %s %d %d', [ProgramInfo.sDirectory, ProgramInfo.sProgramFile, sHandle, ProgramInfo.nMainFormX, ProgramInfo.nMainFormY]);
  140.   sCurDirectory := ProgramInfo.sDirectory; //取得程序运行目录
  141.   if not CreateProcess(nil,  //如果启动服务失败返回错误代码
  142.     PChar(sCommandLine),
  143.     nil,
  144.     nil,
  145.     True,
  146.     0,
  147.     nil,
  148.     PChar(sCurDirectory),
  149.     StartupInfo,
  150.     ProgramInfo.ProcessInfo) then
  151.   begin
  152.     Result := GetLastError();
  153.   end;
  154.   Sleep(dwWaitTime);  //等待
  155. end;
  156. {停止服务,这个函数很简单,不再注释}
  157. function StopProgram(var ProgramInfo: TProgram; dwWaitTime: LongWord): Integer;
  158. var
  159.   dwExitCode: LongWord;
  160. begin
  161.   Result := 0;
  162.   dwExitCode := 0;
  163.   if TerminateProcess(ProgramInfo.ProcessHandle, dwExitCode) then
  164.   begin
  165.     Result := GetLastError();
  166.   end;
  167.   Sleep(dwWaitTime);
  168. end;
  169. {这个是向指定程序发送数据}
  170. procedure SendProgramMsg(DesForm: THandle; wIdent: Word; sSendMsg: string);
  171. var
  172.   SendData: TCopyDataStruct;
  173.   nParam: Integer;
  174. begin
  175.   nParam := MakeLong(0, wIdent);
  176.   SendData.cbData := length(sSendMsg) + 1;
  177.   GetMem(SendData.lpData, SendData.cbData);
  178.   StrCopy(SendData.lpData, PChar(sSendMsg));
  179.   SendMessage(DesForm, WM_COPYDATA, nParam, Cardinal(@SendData));
  180.   FreeMem(SendData.lpData);
  181. end;
  182. {初始化和反初始化}
  183. initialization
  184.   begin
  185.     g_IniConf := Tinifile.Create(g_sConfFile);
  186.   end;

  187. finalization
  188.   begin
  189.     g_IniConf.Free;
  190.   end;
复制代码
主要是加载和保存配置过程过程重复的事情很多,可以考虑改进.
整个GShare.pas单元学习完毕,接下来可以开始主单元文件学习了.

关注过程,不知不觉就发现了结果原来如此...

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员5折;永久VIP免费
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2024-12-22 09:20

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表