最近开启的新项目是使用python写一个传奇2的模拟器,所以先分析一下原来的程序,貌似很困难,反正闲着也是闲着,无聊还是无聊

不用解释了,不过对我这种没有windows编程经验的来说很难啃
// LoginGate.cpp : Defines the entry point for the application.
//

#include “stdafx.h”

// **************************************************************************************

BOOL    InitApplication(HANDLE hInstance);
BOOL    InitInstance(HANDLE hInstance, int nCmdShow);
LPARAM    APIENTRY MainWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);

BOOL    jRegSetKey(LPCTSTR pSubKeyName, LPCTSTR pValueName, DWORD dwFlags, LPBYTEpValue, DWORD nValueSize);
BOOL    jRegGetKey(LPCTSTR pSubKeyName, LPCTSTR pValueName, LPBYTE pValue);

BOOL    CALLBACK ConfigDlgFunc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAMlParam);

// **************************************************************************************
//
//            Global Variables Definition
//
// **************************************************************************************

HINSTANCE        g_hInst = NULL;                // Application instance
HWND            g_hMainWnd = NULL;            // Main window handle
HWND            g_hLogMsgWnd = NULL;
HWND            g_hToolBar = NULL;
HWND            g_hStatusBar = NULL;

BOOL            g_fTerminated = FALSE;

static WSADATA    g_wsd;

TBBUTTON tbButtons[] =
{
{ 0, IDM_STARTSERVICE,    TBSTATE_ENABLED,    TBSTYLE_BUTTON, 0L, 0},
{ 1, IDM_STOPSERVICE,    TBSTATE_ENABLED,    TBSTYLE_BUTTON, 0L, 0}
};

// **************************************************************************************

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, intnCmdShow)
{
MSG msg;

#ifndef _SOCKET_ASYNC_IO
if (CheckAvailableIOCP())
{
#endif
if (!InitApplication(hInstance))
return (FALSE);

if (!InitInstance(hInstance, nCmdShow))
return (FALSE);

while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
#ifndef _SOCKET_ASYNC_IO
}
else
{
TCHAR szMsg[1024];

LoadString(hInstance, IDS_NOTWINNT, szMsg, sizeof(szMsg));
MessageBox(NULL, szMsg, _GAMEGATE_SERVER_TITLE, MB_OK|MB_ICONINFORMATION);

return -1;
}
#endif

return (msg.wParam);
}

// **************************************************************************************
//
//            
//
// **************************************************************************************

BOOL InitApplication(HANDLE hInstance)
{
WNDCLASS  wc;

wc.style            = CS_GLOBALCLASS|CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc      = (WNDPROC)MainWndProc;
wc.cbClsExtra       = 0;
wc.cbWndExtra       = 0;
wc.hIcon            = LoadIcon((HINSTANCE)hInstance, MAKEINTRESOURCE(IDI_MIR2));
wc.hInstance        = (HINSTANCE)hInstance;
wc.hCursor          = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground    = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName     = MAKEINTRESOURCE(IDR_MAINMENU);
wc.lpszClassName    = _GAMEGATE_SERVER_CLASS;

return RegisterClass(&wc);
}

// **************************************************************************************
//
//            
//
// **************************************************************************************

BOOL InitInstance(HANDLE hInstance, int nCmdShow)
{
g_hInst = (HINSTANCE)hInstance;

INITCOMMONCONTROLSEX    icex;

icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_LISTVIEW_CLASSES | ICC_BAR_CLASSES | ICC_INTERNET_CLASSES;

InitCommonControlsEx(&icex);

g_hMainWnd = CreateWindowEx(0, _GAMEGATE_SERVER_CLASS, _GAMEGATE_SERVER_TITLE,
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, (HINSTANCE)hInstance, NULL);

g_hToolBar = CreateToolbarEx(g_hMainWnd, WS_CHILD|CCS_TOP|WS_VISIBLE|WS_BORDER,
_IDW_TOOLBAR, sizeof(tbButtons) / sizeof(TBBUTTON), (HINSTANCE)hInstance,IDB_TOOLBAR,
(LPCTBBUTTON)&tbButtons, sizeof(tbButtons) / sizeof(TBBUTTON),
_BMP_CX, _BMP_CY, _BMP_CX, _BMP_CY, sizeof(TBBUTTON));

RECT rcMainWnd, rcToolBar, rcStatusBar;

GetClientRect(g_hMainWnd, &rcMainWnd);
GetWindowRect(g_hToolBar, &rcToolBar);

g_hStatusBar = CreateWindowEx(0L, STATUSCLASSNAME, _TEXT(“”),WS_CHILD|WS_BORDER|WS_VISIBLE|SBS_SIZEGRIP,
0, rcMainWnd.bottom - _STATUS_HEIGHT, (rcMainWnd.right - rcMainWnd.left),_STATUS_HEIGHT, g_hMainWnd, (HMENU)_IDW_STATUSBAR, g_hInst, NULL);

int    nStatusPartsWidths[_NUMOFMAX_STATUS_PARTS];
int nCnt = 0;

for (int i = _NUMOFMAX_STATUS_PARTS - 1; i >= 0; i–)
nStatusPartsWidths[nCnt++] = (rcMainWnd.right - rcMainWnd.left) - (90 * i);

SendMessage(g_hStatusBar, SB_SETPARTS, _NUMOFMAX_STATUS_PARTS,(LPARAM)nStatusPartsWidths);
SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(1, 0), (LPARAM)_TEXT(“Not Connected”));

GetWindowRect(g_hStatusBar, &rcStatusBar);

g_hLogMsgWnd = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, _TEXT(“”),
WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_EDITLABELS,
0, (rcToolBar.bottom - rcToolBar.top), (rcMainWnd.right - rcMainWnd.left),
(rcMainWnd.bottom - rcMainWnd.top) - (rcToolBar.bottom - rcToolBar.top) -(rcStatusBar.bottom - rcStatusBar.top),
g_hMainWnd, NULL, (HINSTANCE)hInstance, NULL);

ListView_SetExtendedListViewStyleEx(g_hLogMsgWnd, 0, LVS_EX_FULLROWSELECT);

LV_COLUMN    lvc;
TCHAR        szText[64];

lvc.mask    = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.fmt        = LVCFMT_LEFT;
lvc.cx        = 150;
lvc.pszText    = szText;

for (i = 0; i < 3; i++)
{
lvc.iSubItem = i;
LoadString((HINSTANCE)hInstance, IDS_LVS_LABEL1 + i, szText,sizeof(szText)/sizeof(TCHAR));

ListView_InsertColumn(g_hLogMsgWnd, i, &lvc);
}

SendMessage(g_hToolBar, TB_SETSTATE, (WPARAM)IDM_STOPSERVICE,(LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));

ShowWindow(g_hMainWnd, SW_SHOW);
UpdateWindow(g_hMainWnd);

if (WSAStartup(MAKEWORD(2, 2), &g_wsd) != 0)
return (FALSE);

BYTE    btInstalled;

if (!jRegGetKey(_GAMEGATE_SERVER_REGISTRY, _TEXT(“Installed”), (LPBYTE)&btInstalled))
DialogBox(g_hInst, MAKEINTRESOURCE(IDD_CONFIGDLG), NULL, (DLGPROC)ConfigDlgFunc);

return TRUE;
}

// **************************************************************************************
//
//            
//
// **************************************************************************************

int AddNewLogMsg()
{
LV_ITEM        lvi;
TCHAR        szText[64];

int nCount = ListView_GetItemCount(g_hLogMsgWnd);

if (nCount >= 50)
{
ListView_DeleteItem(g_hLogMsgWnd, 0);
nCount–;
}

lvi.mask        = LVIF_TEXT;
lvi.iItem        = nCount;
lvi.iSubItem    = 0;

_tstrdate(szText);

lvi.pszText = szText;

ListView_InsertItem(g_hLogMsgWnd, &lvi);

_tstrtime(szText);

ListView_SetItemText(g_hLogMsgWnd, nCount, 1, szText);

return nCount;
}

void InsertLogMsg(UINT nID)
{
TCHAR    szText[256];

int nCount = AddNewLogMsg();

LoadString(g_hInst, nID, szText, sizeof(szText)/sizeof(TCHAR));

ListView_SetItemText(g_hLogMsgWnd, nCount, 2, szText);
ListView_Scroll(g_hLogMsgWnd, 0, 8);
}

void InsertLogMsg(LPTSTR lpszMsg)
{
int nCount = AddNewLogMsg();

ListView_SetItemText(g_hLogMsgWnd, nCount, 2, lpszMsg);
ListView_Scroll(g_hLogMsgWnd, 0, 8);
}

void InsertLogMsgParam(UINT nID, void *pParam, BYTE btFlags)
{
TCHAR    szText[128];
TCHAR    szMsg[256];

int nCount = AddNewLogMsg();

LoadString(g_hInst, nID, szText, sizeof(szText)/sizeof(TCHAR));

switch (btFlags)
{
case LOGPARAM_STR:
_stprintf(szMsg, szText, (LPTSTR)pParam);
break;
case LOGPARAM_INT:
_stprintf(szMsg, szText, *(int *)pParam);
break;
}

if (lstrlen(szMsg) <= 256)
{
ListView_SetItemText(g_hLogMsgWnd, nCount, 2, szMsg);
ListView_Scroll(g_hLogMsgWnd, 0, 8);
}
}

啃传奇服务器端的源码相关推荐

  1. python 传奇服务端_传奇游戏服务器源码学习

    依据传奇游戏服务器源码总结了一下服务器开发中比较关心的一些问题. (1)线程之间的共享数据如何同步 CIntLock封装了临界区管理,包含了Lock()和Unlock()两个操作函数,所有 需要同步的 ...

  2. JAVA毕业设计健康食谱系统服务器端计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计健康食谱系统服务器端计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计健康食谱系统服务器端计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S架构 ...

  3. 传奇游戏服务器源码学习

    依据传奇游戏服务器源码总结了一下服务器开发中比较关心的一些问题. (1)线程之间的共享数据如何同步 CIntLock封装了临界区管理,包含了Lock()和Unlock()两个操作函数,所有 需要同步的 ...

  4. 传奇h5私服源码+教程

    传奇h5私服源码+教程 这几天突然想拿服务器做些什么,就想到搭一个私服游戏,学习娱乐一下.废话不多说下面给教程和源码. 传奇h5源码:https://download.csdn.net/downloa ...

  5. 麻将服务端架设linux,湖南房卡麻将客户端/服务器端完整源码及编译教程

    客户端源码是基于cocos2d-x 3.10版本开发的.代码完整可编译.本人在WINDOWS平台下成功编译了android包并正常运行.源码里面也有服务器的源码(C++),经过再次鉴定应该是配套的,服 ...

  6. subversion linux 服务器端搭建 源码安装

    为什么80%的码农都做不了架构师?>>>    下载源码包 1.1 subversion 源码包 http://subversion.apache.org/download/ 1.2 ...

  7. [3]传奇3服务器源码分析一 DBServer

    留存 服务端下载地址: 点击这里

  8. 传说ol服务器端网站源码,千古传说一键服务端+IP修改+GM+ID+搭建教程

    千古传说一键服务端+IP修改教程+GM后台+数据修改+人物ID 架设教程: 1.必须安装-jdk8.exe,一直下一步等到安装完成. 2.将压缩包解压到D盘根目录.D:\I4sy_Qgcs 3.本端默 ...

  9. 如何搭建一个完全可用的传奇私服,我需要详细步骤以及部署的源码

    搭建传奇私服是一项比较复杂的任务,需要具备一定的技术知识和经验.如果您想要搭建一个完全可用的传奇私服,您需要遵循以下步骤: 准备所需的软件和工具:首先,您需要准备一台运行 Windows 操作系统的电 ...

最新文章

  1. ECharts 之 环形图
  2. 全球及中国小水电行业投资规模及运行动态分析报告2021年版
  3. python中的函数、生成器的工作原理
  4. Java的内存--存储
  5. 大话InnoDB索引原理
  6. 【python】pycharm启动 一直index,无法运行
  7. 会考计算机考试vb知识点,高中会考计算机vb知识点.doc
  8. python中写入文件数据及文件定位操作命令
  9. Spring Boot(17)配置文件解析
  10. linux下巧用tail命令 创建自解压tar文件
  11. qt如何在TetxEdit设置背景色(可以设置行或列)
  12. 美赛小队集训-2019年D题O奖讨论
  13. HBase常用命令使用
  14. Java接口与实现类的转换
  15. 广告机CE认证 FCC认证费用构成
  16. Linux查看日志命令,压缩日志不解压直接查看
  17. 数学分析教程(科大)——3.4笔记+习题
  18. 谷歌浏览器无法调用java_怎么才能正常使用谷歌浏览器
  19. Cygwin下安装apt-cyg
  20. c0语言语法,《Groovy语言规范》-语法

热门文章

  1. linux PCIe api
  2. 0055:手机话费(C++)
  3. 用java实现屏幕找图
  4. Windows驱动开发学习记录-驱动中快速重启关闭计算机之一
  5. 51nod 1326 遥远的旅途 最短路建模
  6. 开放源码易语言摄像头拍照自动重命名拍学籍照和证件照
  7. iOS MJRefresh 自定义刷新动画
  8. 马士兵python_马士兵python大数据全栈工程师
  9. 牛客网输入输出练习c++ 个人版题解
  10. java开发用i5还是i7,酷睿i3和i5以及i7有什么区别