设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2520|回复: 1
打印 上一主题 下一主题

[已经解决] 如何修改game.exe文件

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2802
在线时间
393 小时
注册时间
2015-8-8
帖子
440

R考场第七期纪念奖

跳转到指定楼层
1
发表于 2015-8-9 12:38:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
想改文件名,初期窗口大小,以及不用读取ini,不知能否做到?
旧作《邵彦朝的大冒险》下载

默默无闻的论坛观察者

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

2
发表于 2015-8-10 07:56:07 | 只看该作者
自己编译一个换掉原来的


CPP 代码复制
  1. /**
  2. * @file   main.h
  3. *
  4. * @desc   第三方 RGSS Player
  5. *
  6. * @author   灼眼的夏娜
  7. *
  8. * @history 2009/07/21 初版
  9. */
  10. #include <windows.h>
  11. #include <stdio.h>
  12. static const char* pWndClassName = "RGSS Player Ex";
  13. static const char* pDefaultLibrary = "RGSS102J.dll";
  14. static const char* pDefaultTitle = "Untitled";
  15. static const char* pDefaultScripts = "Data\\Scripts.rxdata";
  16. static const int nScreenWidth = 640;
  17. static const int nScreenHeight = 480;
  18. static const int nEvalErrorCode = 6;
  19. void ShowErrorMsg(HWND hWnd, const char* szTitle, const char* szFormat, ...)
  20. {
  21. static char szError[1024];
  22. va_list ap;
  23. va_start(ap, szFormat);
  24. vsprintf_s(szError, szFormat, ap);
  25. va_end(ap);
  26. MessageBoxA(hWnd, szError, szTitle, MB_ICONERROR);
  27. }
  28. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  29. {
  30. char szAppPath[MAX_PATH], szIniPath[MAX_PATH], szRgssadPath[MAX_PATH];
  31. char szLibrary[MAX_PATH], szTitle[MAX_PATH], szScripts[MAX_PATH];
  32. char* pRgssad = 0;
  33. HWND hWnd = NULL;
  34. HMODULE hRgssCore = NULL;
  35. // app路径
  36. DWORD len = ::GetModuleFileNameA(hInstance, szAppPath, MAX_PATH);
  37. for (--len; len > 0; --len)
  38. {
  39.    if (szAppPath[len] == '\\' || szAppPath[len] == '/')
  40.    {
  41.     szAppPath[len] = 0;
  42.     break;
  43.    }
  44. }
  45. SetCurrentDirectoryA(szAppPath);
  46. // ini文件路径
  47. len = ::GetModuleFileNameA(hInstance, szIniPath, MAX_PATH);
  48. szIniPath[len - 1] = 'i';
  49. szIniPath[len - 2] = 'n';
  50. szIniPath[len - 3] = 'i';
  51. // 加密包路径
  52. len = ::GetModuleFileNameA(hInstance, szRgssadPath, MAX_PATH);
  53. for (--len; len > 0; --len)
  54. {
  55.    if (szRgssadPath[len] == '.')
  56.    {
  57.     //strcpy(...)
  58.     memcpy(&szRgssadPath[len + 1], "rgssad", strlen("rgssad") + 1);
  59.     //szRgssadPath[len + 1] = 'r';
  60.     //szRgssadPath[len + 2] = 'g';
  61.     //szRgssadPath[len + 3] = 's';
  62.     //szRgssadPath[len + 4] = 's';
  63.     //szRgssadPath[len + 5] = 'a';
  64.     //szRgssadPath[len + 6] = 'd';
  65.     //szRgssadPath[len + 7] = 0;
  66.     break;
  67.    }
  68. }
  69. // ini文件存在
  70. if (GetFileAttributesA(szIniPath) != INVALID_FILE_ATTRIBUTES)
  71. {
  72.    GetPrivateProfileStringA("Game", "Library", pDefaultLibrary, szLibrary, MAX_PATH, szIniPath);
  73.    GetPrivateProfileStringA("Game", "Title", pDefaultTitle,   szTitle, MAX_PATH, szIniPath);
  74.    GetPrivateProfileStringA("Game", "Scripts", pDefaultScripts, szScripts, MAX_PATH, szIniPath);
  75. }
  76. else
  77. {
  78.    memcpy(szLibrary, pDefaultLibrary, strlen(pDefaultLibrary) + 1);
  79.    memcpy(szTitle,   pDefaultTitle,   strlen(pDefaultTitle) + 1);
  80.    memcpy(szScripts, pDefaultScripts, strlen(pDefaultScripts) + 1);
  81. }
  82. if (GetFileAttributesA(szRgssadPath) != INVALID_FILE_ATTRIBUTES)
  83.    pRgssad = szRgssadPath;
  84. // 创建窗口
  85. WNDCLASS winclass;
  86. winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
  87. winclass.lpfnWndProc = DefWindowProc;
  88. winclass.cbClsExtra   = 0;
  89. winclass.cbWndExtra   = 0;
  90. winclass.hInstance   = hInstance;
  91. winclass.hIcon    = LoadIcon(hInstance, IDI_APPLICATION);
  92. winclass.hCursor   = LoadCursor(NULL, IDC_ARROW);
  93. winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
  94. winclass.lpszMenuName = NULL;
  95. winclass.lpszClassName = pWndClassName;
  96.  
  97. if (!RegisterClass(&winclass))
  98. {
  99.    ShowErrorMsg(hWnd, szTitle, "注册窗口类失败 %s。", pWndClassName);
  100.    return 0;
  101. }
  102.  
  103. int width = nScreenWidth + GetSystemMetrics(SM_CXFIXEDFRAME) * 2;
  104. int height = nScreenHeight + GetSystemMetrics(SM_CYFIXEDFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION);
  105. RECT rt;
  106. {
  107.    rt.left   = (GetSystemMetrics(SM_CXSCREEN) - width) / 2;
  108.    rt.top   = (GetSystemMetrics(SM_CYSCREEN) - height) / 2;
  109.    rt.right = rt.left + width;
  110.    rt.bottom = rt.top + height;
  111. }
  112. DWORD dwStyle = (WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE);
  113. hWnd = ::CreateWindowEx(WS_EX_WINDOWEDGE, pWndClassName, szTitle, dwStyle,
  114.    rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, 0, 0, hInstance, 0);
  115. if (!hWnd)
  116. {
  117.    ShowErrorMsg(hWnd, szTitle, "创建窗口失败 %s。", szTitle);
  118.    goto __exit;
  119. }
  120. ShowWindow(hWnd, SW_SHOW);
  121. // 加载RGSS核心库
  122. hRgssCore = ::LoadLibraryA(szLibrary);
  123. if (!hRgssCore)
  124. {
  125.    ShowErrorMsg(hWnd, szTitle, "加载RGSS核心库失败 %s。", szLibrary);
  126.    goto __exit;
  127. }
  128. typedef BOOL   (*RGSSSetupRTP)(const char* pIniPath, char* pErrorMsgBuffer, int iBufferLength);
  129. typedef void   (*RGSSInitialize)(HMODULE hRgssDll);
  130. typedef int    (*RGSSEval)(const char* pScripts);
  131. typedef void   (*RGSSGameMain)(HWND hWnd, const char* pScriptNames, char** pRgssadName);
  132. typedef BOOL   (*RGSSExInitialize)(HWND hWnd);
  133. RGSSSetupRTP   pRGSSSetupRTP   = NULL;
  134. RGSSInitialize   pRGSSInitialize   = NULL;
  135. RGSSEval    pRGSSEval    = NULL;
  136. RGSSGameMain   pRGSSGameMain   = NULL;
  137. RGSSExInitialize pRGSSExInitialize = (RGSSExInitialize)::GetProcAddress(hRgssCore, "RGSSExInitialize");
  138. #define __get_check(fn)               \
  139. do                    \
  140. {                    \
  141.    p##fn = (fn)::GetProcAddress(hRgssCore, #fn);        \
  142.    if (!p##fn)                 \
  143.    {                   \
  144.     ShowErrorMsg(hWnd, szTitle, "获取RGSS核心库导出函数失败 %s。", #fn);\
  145.     goto __exit;               \
  146.    }                   \
  147. } while (0)
  148. {
  149.    __get_check(RGSSSetupRTP);
  150.    __get_check(RGSSInitialize);
  151.    __get_check(RGSSEval);
  152.    __get_check(RGSSGameMain);
  153. }
  154. #undef __get_check
  155. // 1、设置RTP
  156. char szRtpName[1024];
  157. if (!pRGSSSetupRTP(szIniPath, szRtpName, 1024))
  158. {
  159.    ShowErrorMsg(hWnd, szTitle, "没有发现 RGSS-RTP %s。", szRtpName);
  160.    goto __exit;
  161. }
  162. // 2、初始化
  163. pRGSSInitialize(hRgssCore);
  164. // 2.1、扩展库初始化(补丁模式)
  165. if (pRGSSExInitialize)
  166. {
  167.    if (!pRGSSExInitialize(hWnd))
  168.    {
  169.     ShowErrorMsg(hWnd, szTitle, "RGSS扩展库初始化失败 %s。", "RGSSExInitialize");
  170.     goto __exit;
  171.    }
  172. }
  173. // 3、设置运行时变量
  174. if (strcmp(lpCmdLine, "btest") == 0)
  175. {
  176.    pRgssad = 0;
  177.    pRGSSEval("$DEBUG = true");
  178.    pRGSSEval("$BTEST = true");
  179. }
  180. else
  181. {
  182.    if (strcmp(lpCmdLine, "debug") == 0)
  183.    {
  184.     pRgssad = 0;
  185.     pRGSSEval("$DEBUG = true");
  186.    }
  187.    else
  188.     pRGSSEval("$DEBUG = false");
  189.    pRGSSEval("$BTEST = false");
  190. }
  191.  
  192. // 4、主逻辑
  193. pRGSSGameMain(hWnd, szScripts, (pRgssad ? (char**)pRgssad : &pRgssad)); // ???
  194. __exit:
  195. if (hRgssCore)
  196. {
  197.    FreeLibrary(hRgssCore);
  198.    hRgssCore = NULL;
  199. }
  200. if (hWnd)
  201. {
  202.    DestroyWindow(hWnd);
  203.    hWnd = NULL;
  204. }
  205. UnregisterClassA("RGSS Player Ex", hInstance);
  206. return 0;
  207. }

点评

请问要用什么工具?  发表于 2015-8-10 10:01

评分

参与人数 1星屑 +200 收起 理由
RyanBern + 200 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-15 04:07

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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