查看: 6400|回复: 7

[原创发布] 脑残物Custom RGSS Player(Game.exe)

[复制链接]

路人党员

梦石
0
星屑
52
在线时间
2276 小时
注册时间
2010-12-30
回帖
3011
发表于 2015-3-26 10:27:12 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 英顺的马甲 于 2015-3-26 16:46 编辑

前几天比较看得懂c++后拿了第三方RGSS Player来改,于是就出了此脑残物

这脑残物对普通人来说比较有用的功能就只有会自动加载与exe同目录内fonts文件夹里的字体
不过这个exe有个缺点,那就是并不是所有的RGSS10XX.dll都支持(目前已知肯定支持的有原版的)
杀毒信息:https://www.virustotal.com/en/file/cba1f55c2ac3bc31e47ddf99897482e41600fe022db05bbb5bac40d24a90e3c6/analysis/1427335101/
下载:
EXE与源码.rar (64.99 KB, 下载次数: 163)

如果你完全不懂API或c++之类的请回头

EXE源码,大神勿喷(其实喷也没关系)[pre lang="cpp"]/**
* @file   main.h
*
* @desc   第三方 RGSS Player
*
* @author   灼眼的夏娜
*
* @history 2009/07/21 初版
*/

#include <windows.h>
#include <stdio.h>
#include <WinGDI.h>

#include <strsafe.h>

#include <string>
#pragma comment(lib, "User32.lib")

#include <shellapi.h>

using namespace std;

typedef int(*RGSSEval)(const char* pScripts);
static RGSSEval    pRGSSEval = NULL;
static WNDPROC orig_wndproc = NULL;

static const char* pWndClassName = "Custom RGSS Player";

static const char* pDefaultLibrary = "RGSS102J.dll";
static const char* pDefaultTitle = "Untitled";
static const char* pDefaultScripts = "Data\\Scripts.rxdata";

static const int nScreenWidth = 640;
static const int nScreenHeight = 480;

static const int nEvalErrorCode = 6;

LRESULT CALLBACK BindWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
        long ret_val;
        byte state;
        char script[100];
        ret_val = state = 0;
        sprintf(script, "WND.__call_wndproc(%d, %d, %d, %d, %d, %d)", &ret_val, &state, hwnd, msg, wParam, lParam);
        pRGSSEval(script);
        if (state == 1) return ret_val;
        else if (state == 0) return CallWindowProc(orig_wndproc, hwnd, msg, wParam, lParam);
}

void ShowErrorMsg(HWND hWnd, const char* szTitle, const char* szFormat, ...)
{
        static char szError[1024];

        va_list ap;
        va_start(ap, szFormat);
        vsprintf_s(szError, szFormat, ap);
        va_end(ap);

        MessageBoxA(hWnd, szError, szTitle, MB_ICONERROR);
}

void SetupFont(bool remove = false)
{
        WIN32_FIND_DATA ffd;
        LARGE_INTEGER filesize;
        HANDLE hFind = INVALID_HANDLE_VALUE;
        char path[MAX_PATH];
        GetModuleFileName( NULL, path, MAX_PATH );
        char *ptr = strrchr(path, '\\');
        memset(ptr, 0, (MAX_PATH - (ptr - path)));
        strcat(path, "\\fonts\\*.*");
        hFind = FindFirstFile(path, &ffd);
        if (INVALID_HANDLE_VALUE == hFind) return;
        do
        {
                if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue;
                char ext[5];
                char name[MAX_PATH];
                memset(name, 0, MAX_PATH);
                strncat(name, path, strlen(path) - 3);
                strcat(name, ffd.cFileName);
                if (remove)
                        RemoveFontResourceEx(name, FR_PRIVATE, 0);
                else
                        AddFontResourceEx(name, FR_PRIVATE, 0);
        } while (FindNextFile(hFind, &ffd) != 0);
        FindClose(hFind);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
        char szAppPath[MAX_PATH], szIniPath[MAX_PATH], szRgssadPath[MAX_PATH];
        char szLibrary[MAX_PATH], szTitle[MAX_PATH], szScripts[MAX_PATH];
        char* pRgssad = 0;
        HWND hWnd = NULL;
        HMODULE hRgssCore = NULL;

        // app路径
        DWORD len = ::GetModuleFileNameA(hInstance, szAppPath, MAX_PATH);
        for (--len; len > 0; --len)
        {
                if (szAppPath[len] == '\\' || szAppPath[len] == '/')
                {
                        szAppPath[len] = 0;
                        break;
                }
        }
        SetCurrentDirectoryA(szAppPath);

        // ini文件路径
        len = ::GetModuleFileNameA(hInstance, szIniPath, MAX_PATH);
        szIniPath[len - 1] = 'i';
        szIniPath[len - 2] = 'n';
        szIniPath[len - 3] = 'i';

        // 加密包路径
        len = ::GetModuleFileNameA(hInstance, szRgssadPath, MAX_PATH);
        for (--len; len > 0; --len)
        {
                if (szRgssadPath[len] == '.')
                {
                        //strcpy(...)
                        memcpy(&szRgssadPath[len + 1], "rgssad", strlen("rgssad") + 1);
                        //szRgssadPath[len + 1] = 'r';
                        //szRgssadPath[len + 2] = 'g';
                        //szRgssadPath[len + 3] = 's';
                        //szRgssadPath[len + 4] = 's';
                        //szRgssadPath[len + 5] = 'a';
                        //szRgssadPath[len + 6] = 'd';
                        //szRgssadPath[len + 7] = 0;
                        break;
                }
        }

        // ini文件存在
        if (GetFileAttributesA(szIniPath) != INVALID_FILE_ATTRIBUTES)
        {
                GetPrivateProfileStringA("Game", "Library", pDefaultLibrary, szLibrary, MAX_PATH, szIniPath);
                GetPrivateProfileStringA("Game", "Title", pDefaultTitle,   szTitle, MAX_PATH, szIniPath);
                GetPrivateProfileStringA("Game", "Scripts", pDefaultScripts, szScripts, MAX_PATH, szIniPath);
        }
        else
        {
                memcpy(szLibrary, pDefaultLibrary, strlen(pDefaultLibrary) + 1);
                memcpy(szTitle,   pDefaultTitle,   strlen(pDefaultTitle) + 1);
                memcpy(szScripts, pDefaultScripts, strlen(pDefaultScripts) + 1);
        }

        if (GetFileAttributesA(szRgssadPath) != INVALID_FILE_ATTRIBUTES)
                pRgssad = szRgssadPath;

        // 创建窗口
        WNDCLASS winclass;

        winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
        winclass.lpfnWndProc = DefWindowProc;
        winclass.cbClsExtra   = 0;
        winclass.cbWndExtra   = 0;
        winclass.hInstance   = hInstance;
        winclass.hIcon    = LoadIcon(hInstance, IDI_APPLICATION);
        winclass.hCursor   = LoadCursor(NULL, IDC_ARROW);
        winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
        winclass.lpszMenuName = NULL;
        winclass.lpszClassName = pWndClassName;

        if (!RegisterClass(&winclass))
        {
                ShowErrorMsg(hWnd, szTitle, "注册窗口类失败 %s。", pWndClassName);
                return 0;
        }

        int width = nScreenWidth + GetSystemMetrics(SM_CXFIXEDFRAME) * 2;
        int height = nScreenHeight + GetSystemMetrics(SM_CYFIXEDFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION);

        RECT rt;
        {
                rt.left   = (GetSystemMetrics(SM_CXSCREEN) - width) / 2;
                rt.top   = (GetSystemMetrics(SM_CYSCREEN) - height) / 2;
                rt.right = rt.left + width;
                rt.bottom = rt.top + height;
        }

        DWORD dwStyle = (WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE);

        hWnd = ::CreateWindowEx(WS_EX_WINDOWEDGE, pWndClassName, szTitle, dwStyle,
                rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, 0, 0, hInstance, 0);
        if (!hWnd)
        {
                ShowErrorMsg(hWnd, szTitle, "创建窗口失败 %s。", szTitle);
                goto __exit;
        }

        ShowWindow(hWnd, SW_SHOW);

        // 加载RGSS核心库
        hRgssCore = ::LoadLibraryA(szLibrary);
        if (!hRgssCore)
        {
                ShowErrorMsg(hWnd, szTitle, "加载RGSS核心库失败 %s。", szLibrary);
                goto __exit;
        }

        typedef BOOL   (*RGSSSetupRTP)(const char* pIniPath, char* pErrorMsgBuffer, int iBufferLength);
        typedef void   (*RGSSInitialize)(HMODULE hRgssDll);
        typedef void   (*RGSSGameMain)(HWND hWnd, const char* pScriptNames, char** pRgssadName);
        typedef BOOL   (*RGSSExInitialize)(HWND hWnd);

        RGSSSetupRTP   pRGSSSetupRTP   = NULL;
        RGSSInitialize   pRGSSInitialize   = NULL;
        RGSSGameMain   pRGSSGameMain   = NULL;
        //RGSSExInitialize pRGSSExInitialize = (RGSSExInitialize)::GetProcAddress(hRgssCore, "RGSSExInitialize");

#define __get_check(fn)               \
        do                    \
        {                    \
        p##fn = (fn)::GetProcAddress(hRgssCore, #fn);        \
        if (!p##fn)                 \
        {                   \
        ShowErrorMsg(hWnd, szTitle, "获取RGSS核心库导出函数失败 %s。", #fn);\
        goto __exit;               \
        }                   \
        } while (0)
        {
                __get_check(RGSSSetupRTP);
                __get_check(RGSSInitialize);
                __get_check(RGSSEval);
                __get_check(RGSSGameMain);
        }
#undef __get_check

        // 1、设置RTP
        char szRtpName[1024];

        if (!pRGSSSetupRTP(szIniPath, szRtpName, 1024))
        {
                ShowErrorMsg(hWnd, szTitle, "没有发现 RGSS-RTP %s。", szRtpName);
                goto __exit;
        }

        // 2、初始化
        pRGSSInitialize(hRgssCore);

        // 2.1、扩展库初始化(补丁模式)
        //*        if (pRGSSExInitialize)
        //*        {
        //*                if (!pRGSSExInitialize(hWnd))
        //*                {
        //*                        ShowErrorMsg(hWnd, szTitle, "RGSS扩展库初始化失败 %s。", "RGSSExInitialize");
        //*                        goto __exit;
        //*                }
        //*        }

        // 3、设置运行时变量
        if (strcmp(lpCmdLine, "btest") == 0)
        {
                pRgssad = 0;
                pRGSSEval("$DEBUG = true");
                pRGSSEval("$BTEST = true");
        }
        else
        {
                if (strcmp(lpCmdLine, "debug") == 0)
                {
                        pRgssad = 0;
                        pRGSSEval("$DEBUG = true");
                }
                else
                        pRGSSEval("$DEBUG = false");

                pRGSSEval("$BTEST = false");
        }

        DWORD ftyp = GetFileAttributesA("C:\\RMSFX");
        if (ftyp != INVALID_FILE_ATTRIBUTES)
                if (ftyp & FILE_ATTRIBUTE_DIRECTORY)
                        pRGSSEval("$:.unshift('C:/RMSFX');ENV['PATH']=\"C:\\\\RMSFX\\\\BIN;#{ENV['PATH']}\"");

        pRGSSEval("$CUSTOM_PLAYER = true");

        char script[100];
        sprintf(script, "def hWnd;%d;end",hWnd);
        pRGSSEval(script);
        sprintf(script, "def hInstance;%d;end", hInstance);
        pRGSSEval(script);
        sprintf(script, "module WND; ADDR_NWP = %d; ADDR_AOWP = %d; end", &BindWndProc, &orig_wndproc);
        pRGSSEval(script);
        pRGSSEval("eval(Zlib::Inflate.inflate(\"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\".unpack('m0')[0]))");

        int argc;
        LPWSTR *args = CommandLineToArgvW(GetCommandLineW(), &argc);
        if (args != NULL){
                for (int i = 0; i < argc; i++){
                        char cache[100];
                        char cache2[100];
                        char cache3[] = ".";
                        memset(cache2, 0, 100);
                        wcstombs(cache, args, 100);
                        for (int i = 0; i < strlen(cache); i++){
                                cache3[0] = cache;
                                if (cache == '\\'){
                                        strcat(cache2, "\\\\");
                                }
                                else if (cache == '"'){
                                        strcat(cache2, "\\\"");
                                }
                                else{
                                        strcat(cache2, cache3);
                                }
                        }
                        char cache4[200];
                        sprintf(cache4, "ARGV.push(\"%s\")", cache2);
                        pRGSSEval(cache4);
                }
                LocalFree(args);
        }

        SetupFont();
        // 4、主逻辑
        pRGSSGameMain(hWnd, szScripts, (pRgssad ? (char**)pRgssad : &pRgssad)); // ???

__exit:

        SetupFont(true);

        if (hRgssCore)
        {
                FreeLibrary(hRgssCore);
                hRgssCore = NULL;
        }

        if (hWnd)
        {
                DestroyWindow(hWnd);
                hWnd = NULL;
        }

        UnregisterClassA("RGSS Player Ex", hInstance);

        return 0;
}[/pre]
额外功能[pre lang="ruby"]if $CUSTOM_PLAYER # 如果$CUSTOM_PLAYER为true时则代表使用了此exe

  # 获取视窗句柄
  print "窗口句柄为:0x%08x" % hWnd
  
  # 这我也不是很清楚是啥,反正因为有些函数需要,于是就加进去了
  print "这个我也不知道是什么的句柄为:0x%08x" % hInstance
  
  # 支援运行参数
  print "运行参数有" + ARGV.join(", ")
  
  # 自动支援RMSFX,如果RMSFX存在就能直接require,一个不太有用的功能
  if $:.include?("C:\RMSFX")
    print "RMSFX存在"
  else
    print "RMSFX不存在"
  end
  
  # 运行前会自动加载在fonts文件夹里的字体(不确定文件名支不支持中文)
  if Font.exist?("迷你简行楷")
    print "迷你简行楷已加载"
  else
    print "迷你简行楷未加载"
  end
  
  $mouse = Sprite.new
  $mouse.bitmap = RPG::Cache.icon("001-Weapon01")
  $mouse.z = 99999
  
  # 替换掉WndProc
  WND.bind
  module WND
    module_function
    # 定义WndProc(以鼠标位置做例子)
    def WndProc(hwnd,message,wParam,lParam)
      if hwnd == hWnd
        case message
        when WM_MOUSEMOVE
          $mouse.x, $mouse.y = *[lParam].pack('l').unpack('ss')
        end
      end
      return WND.origWndProc(hwnd,message,wParam,lParam) # 返回原来的WndProc,这很重要
    end
  end
       
else
  print "非Custom RGSS Player"
end[/pre]

带有WndProc的范例: Custom RGSS Player.rar (2.97 MB, 下载次数: 320)

@晴兰 @orzfly @yangff 求吐槽

点评

为什么我没看到……  发表于 2015-3-26 19:30
加了,那名字没被河蟹?==  发表于 2015-3-26 16:43
对  发表于 2015-3-26 13:42
Q群?==  发表于 2015-3-26 13:09
英叔快来99639268  发表于 2015-3-26 12:45

评分

参与人数 2星屑 +20 收起 理由
冷峻逸 + 11 好东西
stevenrock + 9 好厉害的代码…

查看全部评分

本人擅长XP,如果有脚本或者Ruby方面的问题欢迎发电邮到engshun@1ppl.me咨询,本人很少检查电邮所以不一定会及时回复,本人不会直接出手解决问题只会提供一个方向,所以谢绝伸手党

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2015-3-26 12:42:30 | 显示全部楼层
本帖最后由 taroxd 于 2015-3-26 12:45 编辑

我是来调戏论坛高亮的,不过论坛高亮竟然没出事情

[pre lang="ruby"]
module WND
WM_ACTIVATE=0x0006
WM_ACTIVATEAPP=0x001C
WM_AFXFIRST=0x0360
WM_AFXLAST=0x037F
WM_APP=0x8000
WM_APPCOMMAND=0x0319
WM_ASKCBFORMATNAME=0x030C
WM_CANCELJOURNAL=0x004B
WM_CANCELMODE=0x001F
WM_CAPTURECHANGED=0x0215
WM_CHANGECBCHAIN=0x030D
WM_CHANGEUISTATE=0x0127
WM_CHAR=0x0102
WM_CHARTOITEM=0x002F
WM_CHILDACTIVATE=0x0022
WM_CLEAR=0x0303
WM_CLOSE=0x0010
WM_COMMAND=0x0111
WM_COMMNOTIFY=0x0044
WM_COMPACTING=0x0041
WM_COMPAREITEM=0x0039
WM_CONTEXTMENU=0x007B
WM_COPY=0x0301
WM_COPYDATA=0x004A
WM_CREATE=0x0001
WM_CTLCOLORBTN=0x0135
WM_CTLCOLORDLG=0x0136
WM_CTLCOLOREDIT=0x0133
WM_CTLCOLORLISTBOX=0x0134
WM_CTLCOLORMSGBOX=0x0132
WM_CTLCOLORSCROLLBAR=0x0137
WM_CTLCOLORSTATIC=0x0138
WM_CUT=0x0300
WM_DEADCHAR=0x0103
WM_DELETEITEM=0x002D
WM_DESTROY=0x0002
WM_DESTROYCLIPBOARD=0x0307
WM_DEVICECHANGE=0x0219
WM_DEVMODECHANGE=0x001B
WM_DISPLAYCHANGE=0x007E
WM_DRAWCLIPBOARD=0x0308
WM_DRAWITEM=0x002B
WM_DROPFILES=0x0233
WM_ENABLE=0x000A
WM_ENDSESSION=0x0016
WM_ENTERIDLE=0x0121
WM_ENTERMENULOOP=0x0211
WM_ENTERSIZEMOVE=0x0231
WM_ERASEBKGND=0x0014
WM_EXITMENULOOP=0x0212
WM_EXITSIZEMOVE=0x0232
WM_FONTCHANGE=0x001D
WM_GETDLGCODE=0x0087
WM_GETFONT=0x0031
WM_GETHOTKEY=0x0033
WM_GETICON=0x007F
WM_GETMINMAXINFO=0x0024
WM_GETOBJECT=0x003D
WM_GETTEXT=0x000D
WM_GETTEXTLENGTH=0x000E
WM_HANDHELDFIRST=0x0358
WM_HANDHELDLAST=0x035F
WM_HELP=0x0053
WM_HOTKEY=0x0312
WM_HSCROLL=0x0114
WM_HSCROLLCLIPBOARD=0x030E
WM_ICONERASEBKGND=0x0027
WM_IME_CHAR=0x0286
WM_IME_COMPOSITION=0x010F
WM_IME_COMPOSITIONFULL=0x0284
WM_IME_CONTROL=0x0283
WM_IME_ENDCOMPOSITION=0x010E
WM_IME_KEYDOWN=0x0290
WM_IME_KEYLAST=0x010F
WM_IME_KEYUP=0x0291
WM_IME_NOTIFY=0x0282
WM_IME_REQUEST=0x0288
WM_IME_SELECT=0x0285
WM_IME_SETCONTEXT=0x0281
WM_IME_STARTCOMPOSITION=0x010D
WM_INITDIALOG=0x0110
WM_INITMENU=0x0116
WM_INITMENUPOPUP=0x0117
WM_INPUT=0x00FF
WM_INPUTLANGCHANGE=0x0051
WM_INPUTLANGCHANGEREQUEST=0x0050
WM_KEYDOWN=0x0100
WM_KEYFIRST=0x0100
WM_KEYLAST=0x0109
WM_KEYUP=0x0101
WM_KILLFOCUS=0x0008
WM_LBUTTONDBLCLK=0x0203
WM_LBUTTONDOWN=0x0201
WM_LBUTTONUP=0x0202
WM_MBUTTONDBLCLK=0x0209
WM_MBUTTONDOWN=0x0207
WM_MBUTTONUP=0x0208
WM_MDIACTIVATE=0x0222
WM_MDICASCADE=0x0227
WM_MDICREATE=0x0220
WM_MDIDESTROY=0x0221
WM_MDIGETACTIVE=0x0229
WM_MDIICONARRANGE=0x0228
WM_MDIMAXIMIZE=0x0225
WM_MDINEXT=0x0224
WM_MDIREFRESHMENU=0x0234
WM_MDIRESTORE=0x0223
WM_MDISETMENU=0x0230
WM_MDITILE=0x0226
WM_MEASUREITEM=0x002C
WM_MENUCHAR=0x0120
WM_MENUCOMMAND=0x0126
WM_MENUDRAG=0x0123
WM_MENUGETOBJECT=0x0124
WM_MENURBUTTONUP=0x0122
WM_MENUSELECT=0x011F
WM_MOUSEACTIVATE=0x0021
WM_MOUSEFIRST=0x0200
WM_MOUSEHOVER=0x02A1
WM_MOUSELAST=0x020D
WM_MOUSELAST=0x0209
WM_MOUSELAST=0x020A
WM_MOUSELEAVE=0x02A3
WM_MOUSEMOVE=0x0200
WM_MOUSEWHEEL=0x020A
WM_MOVE=0x0003
WM_MOVING=0x0216
WM_NCACTIVATE=0x0086
WM_NCCALCSIZE=0x0083
WM_NCCREATE=0x0081
WM_NCDESTROY=0x0082
WM_NCHITTEST=0x0084
WM_NCLBUTTONDBLCLK=0x00A3
WM_NCLBUTTONDOWN=0x00A1
WM_NCLBUTTONUP=0x00A2
WM_NCMBUTTONDBLCLK=0x00A9
WM_NCMBUTTONDOWN=0x00A7
WM_NCMBUTTONUP=0x00A8
WM_NCMOUSEHOVER=0x02A0
WM_NCMOUSELEAVE=0x02A2
WM_NCMOUSEMOVE=0x00A0
WM_NCPAINT=0x0085
WM_NCRBUTTONDBLCLK=0x00A6
WM_NCRBUTTONDOWN=0x00A4
WM_NCRBUTTONUP=0x00A5
WM_NCXBUTTONDBLCLK=0x00AD
WM_NCXBUTTONDOWN=0x00AB
WM_NCXBUTTONUP=0x00AC
WM_NEXTDLGCTL=0x0028
WM_NEXTMENU=0x0213
WM_NOTIFY=0x004E
WM_NOTIFYFORMAT=0x0055
WM_NULL=0x0000
WM_PAINT=0x000F
WM_PAINTCLIPBOARD=0x0309
WM_PAINTICON=0x0026
WM_PALETTECHANGED=0x0311
WM_PALETTEISCHANGING=0x0310
WM_PARENTNOTIFY=0x0210
WM_PASTE=0x0302
WM_PENWINFIRST=0x0380
WM_PENWINLAST=0x038F
WM_POWER=0x0048
WM_POWERBROADCAST=0x0218
WM_PRINT=0x0317
WM_PRINTCLIENT=0x0318
WM_QUERYDRAGICON=0x0037
WM_QUERYENDSESSION=0x0011
WM_QUERYNEWPALETTE=0x030F
WM_QUERYOPEN=0x0013
WM_QUERYUISTATE=0x0129
WM_QUEUESYNC=0x0023
WM_QUIT=0x0012
WM_RBUTTONDBLCLK=0x0206
WM_RBUTTONDOWN=0x0204
WM_RBUTTONUP=0x0205
WM_RENDERALLFORMATS=0x0306
WM_RENDERFORMAT=0x0305
WM_SETCURSOR=0x0020
WM_SETFOCUS=0x0007
WM_SETFONT=0x0030
WM_SETHOTKEY=0x0032
WM_SETICON=0x0080
WM_SETREDRAW=0x000B
WM_SETTEXT=0x000C
WM_SETTINGCHANGE=0x001A
WM_SHOWWINDOW=0x0018
WM_SIZE=0x0005
WM_SIZECLIPBOARD=0x030B
WM_SIZING=0x0214
WM_SPOOLERSTATUS=0x002A
WM_STYLECHANGED=0x007D
WM_STYLECHANGING=0x007C
WM_SYNCPAINT=0x0088
WM_SYSCHAR=0x0106
WM_SYSCOLORCHANGE=0x0015
WM_SYSCOMMAND=0x0112
WM_SYSDEADCHAR=0x0107
WM_SYSKEYDOWN=0x0104
WM_SYSKEYUP=0x0105
WM_TABLET_FIRST=0x02C0
WM_TABLET_LAST=0x02DF
WM_TCARD=0x0052
WM_THEMECHANGED=0x031A
WM_TIMECHANGE=0x001E
WM_TIMER=0x0113
WM_UNDO=0x0304
WM_UNICHAR=0x0109
WM_UNINITMENUPOPUP=0x0125
WM_UPDATEUISTATE=0x0128
WM_USER=0x0400
WM_USERCHANGED=0x0054
WM_VKEYTOITEM=0x002E
WM_VSCROLL=0x0115
WM_VSCROLLCLIPBOARD=0x030A
WM_WINDOWPOSCHANGED=0x0047
WM_WINDOWPOSCHANGING=0x0046
WM_WININICHANGE=0x001A
WM_WTSSESSION_CHANGE=0x02B1
WM_XBUTTONDBLCLK=0x020D
WM_XBUTTONDOWN=0x020B
WM_XBUTTONUP=0x020C
API_CWP=Win32API.new('user32.dll','CallWindowProc','llill','l')
API_SWL=Win32API.new('user32.dll','SetWindowLong','lil','l')
API_RMM=Win32API.new('kernel32.dll','RtlMoveMemory','lpi','v')
module_function
def bind
const_set(:ADDR_OWP,API_SWL.call(hWnd,-4,ADDR_NWP))
API_RMM.call(ADDR_AOWP,[ADDR_OWP].pack('L'),4)
instance_eval{undef :bind}
end
def origWndProc(hwnd,message,wParam,lParam)
return API_CWP.call(ADDR_OWP,hwnd,message,wParam,lParam)
end
def WndProc(hwnd,message,wParam,lParam)
return WND.origWndProc(hwnd,message,wParam,lParam)
end
def __call_wndproc(ptr_ret,ptr_state,hwnd,message,wParam,lParam)
ret=WND.WndProc(hwnd,message,wParam,lParam)
ret=ret.eql?(true)?1:ret.eql?(false)?0:ret
API_RMM.call(ptr_ret,[ret.to_i].pack('L'),4)
API_RMM.call(ptr_state,[1].pack('i'),1)
end
end
[/pre]

点评

看到回调果断下载附件、  发表于 2015-3-26 22:32
顺带一提,好歹也折叠起来啊==  发表于 2015-3-26 16:52
这脚本有在范例里面,你解压出来干啥?==  发表于 2015-3-26 13:11
回复

使用道具 举报

梦石
0
星屑
1788
在线时间
16 小时
注册时间
2014-12-7
回帖
4
发表于 2015-8-19 13:17:38 | 显示全部楼层
本帖最后由 长虹剑 于 2015-8-20 15:06 编辑

@英顺的马甲  百度空间的链接失效了,你给的参考链接打不开,不知哪里还有。
还有我很想知道RGSSxxx.dll到底是如何调用的,如何用纯ruby来启动程序,或者如何才能在我自己的ruby程序中使用RGSS的内置类。

请问楼主是如何知道 dll 里面有 RGSSEval,RGSSGameMain 等函数的,并且如何知道是用顺序,也就是楼主破解了dll了?我想知道如何破解,还有在rgss300.dll中RGSSInitialize是不存在的,所以如何给rgss300重写个启动器呢?

请给一个思路
@晴兰  

点评

那个百度网址是夏娜前辈写的第三方RGSSPlayer,至于解说可参考http://rm.66rpg.com/forum.php?mod=redirect&goto=findpost&ptid=162330&pid=1576931  发表于 2015-8-20 12:17
赋值全在216行  发表于 2015-8-20 12:06
那是c++  发表于 2015-8-20 12:04
回复

使用道具 举报

梦石
0
星屑
1788
在线时间
16 小时
注册时间
2014-12-7
回帖
4
发表于 2015-8-20 15:14:18 | 显示全部楼层
用纯ruby实现Game.exe 目前写到这里了,参照你的那个程序写的,目前还没有写窗口的生成,打算就是完全调用Winapi实现。 还有本来想基于rgss3写的,但是你给的这个例子不能用,我也不知道dll有什么,怎么用。
  1. # -*- coding:utf-8 -*-
  2. require 'Win32API'
  3. require 'pathname'
  4. require 'iniparse'  #读取ini文件
  5. require 'cstruct/win32struct'


  6. MAX_PATH=100
  7. Gameini="Game.ini"
  8. #----------
  9. #FindWindow=Win32API.new("user32", "FindWindow", ['P','P'], 'L')
  10. LoadLibraryA=Win32API.new("kernel32", "LoadLibraryA", ['P'], 'L')
  11. GetProcAddress=Win32API.new("kernel32", "GetProcAddress", ['L','P'], 'L')
  12. #-------
  13. szAppPath=Pathname.new(File.dirname(__FILE__)).realpath
  14. #puts Dir.getwd  获得当前的执行目录 ***
  15. Dir.chdir(szAppPath) #改变当前目录

  16. hd_gameini=IniParse.parse( File.read "#{Gameini}" )
  17. szLibrary=hd_gameini["Game"]["Library"]
  18. szTitle=hd_gameini["Game"]["Title"]
  19. szScripts=hd_gameini["Game"]["Scripts"]

  20. #通过核心库加载程序
  21. hRgssCore = LoadLibraryA.Call(szLibrary);
  22. pRGSSEval=Win32API.new(szLibrary, "RGSSEval", ['P'], 'I') # 这种方式只是使用,根本没加入内存
  23. #pRGSSEval=GetProcAddress.Call(hRgssCore,"RGSSEval") #之后就不会用了
  24. pRGSSSetupRTP=Win32API.new(szLibrary, "RGSSSetupRTP", ['P','P','I'], 'B')
  25. pRGSSInitialize=Win32API.new(szLibrary, "RGSSInitialize", 'L', 'L')
  26. pRGSSGameMain=Win32API.new(szLibrary, "RGSSGameMain", ['L','P','P'], 'V')
  27. #puts Win32API::COLOR_WINDOWFRAME

  28. pRGSSInitialize.Call(hRgssCore)
  29. pRGSSEval.Call(" s=Sprite.new "); #不报错
  30. pRGSSEval.Call(" p 12*7+2 "); #正常显示了
  31. #还差窗口显示


  32. #puts pRGSSEval
  33. #pRGSSEval.Call("$DEBUG = true");
  34. #exit

  35. #hInstance=FindWindow.Call("ConsoleWindowClass",nil)  
复制代码

点评

看楼下  发表于 2015-8-21 17:20
回复

使用道具 举报

路人党员

梦石
0
星屑
52
在线时间
2276 小时
注册时间
2010-12-30
回帖
3011
 楼主| 发表于 2015-8-21 17:19:16 | 显示全部楼层
[pre lang="ruby" file="Game.rb"]# coding: gbk
require 'win32api'

def err_msg(format, *args)
        Win32API.new('user32', 'MessageBox', 'lppl', 'i').call(@hWnd ? @hWnd : 0, format % args, @title, 16)
        stop
end

def stop
        Win32API.new('kernel32', 'FreeLibrary', 'l', 'i').call(@hRGSSCore) if @hRGSSCore and @hRGSSCore != 0
        Win32API.new('user32', 'DestroyWindow', 'l', 'i').call(@hWnd) if @hWnd and @hWnd != 0
        Win32API.new('user32', 'UnregisterClass', 'pl', 'i').call(WndClassName, @hInstance)
        exit
end

WndClassName = "RGSS Player"
DefaultLibrary = "RGSS102J.dll"
DefaultTitle = "Untitled"
DefaultScripts = "Data\\Scripts.rxdata"

@library = [0].pack('C') * 100
@title = [0].pack('C') * 100
@scripts = [0].pack('C') * 100

@hInstance = Win32API.new('kernel32', 'GetModuleHandle', 'l', 'l').call(0)
Win32API.new('user32', 'ShowWindow', 'li', 'i').call(Win32API.new('kernel32', 'GetConsoleWindow', 'v', 'l').call, 0)

@inipath = File.basename(__FILE__).sub(/\.rb$/i, '.ini')
@inipath = File.join(Dir.pwd, @inipath).gsub(/\//, "\\")
if File.exist?(@inipath)
        gpps = Win32API.new('kernel32', 'GetPrivateProfileString', 'ppppip', 'i')
        gpps.call('Game', 'Library', DefaultLibrary, @library, 100, @inipath)
        gpps.call('Game', 'Title', DefaultTitle, @title, 100, @inipath)
        gpps.call('Game', 'Scripts', DefaultScripts, @scripts, 100, @inipath)
        @library.delete([0].pack('C'))
        @title.delete([0].pack('C'))
        @scripts.delete([0].pack('C'))
else
        @library = DefaultLibrary
        @title = DefaultTitle
        @scripts = DefaultScripts
end

if File.exist?(File.basename(__FILE__).sub(/\.rb$/i, '.rgssad'))
        @rgssad = File.basename(__FILE__).sub(/\.rb$/i, '.rgssad')
        @rgssad = File.join(Dir.pwd, @rgssad).gsub(/\//, "\\")
end       

@wndclass = [
        43, # style
        Win32API.new('kernel32', 'GetProcAddress', 'lp', 'l').call(
                Win32API.new('kernel32', 'LoadLibrary', 'p', 'l').call('User32.dll'),
                'DefWindowProcW'), # wndproc
        0, # class extra
        0, # wnd extra
        @hInstance,
        Win32API.new('user32', 'LoadIcon', 'll', 'l').call(0, 32512), # icon
        Win32API.new('user32', 'LoadCursor', 'll', 'l').call(0, 32512), # cursor
        Win32API.new('gdi32', 'GetStockObject', 'i', 'l').call(4), # brush
        0, # menu name
        WndClassName # class name
].pack('ILiiLLLLLp')

temp = Win32API.new('user32', 'RegisterClass', 'p', 'l').call(@wndclass)
err_msg("注册窗口类失败 %s。", WndClassName) if temp == 0

gsm = Win32API.new('user32', 'GetSystemMetrics', 'i', 'i')

width = gsm.call(7) * 2 + 640
height = gsm.call(8) * 2 + gsm.call(4) + 480
x = (gsm.call(0) - width) / 2
y = (gsm.call(1) - height) / 2

@hWnd = Win32API.new('user32','CreateWindowExA','lpplllllllll','l').call(
        0x100, WndClassName, @title, 0x90CA0000, x, y, width, height, 0, 0, @hInstance, 0)
err_msg("创建窗口失败 %s。", @title) if @hWnd == 0

@hRGSSCore = Win32API.new('kernel32', 'LoadLibrary', 'p', 'l').call(@library)
err_msg("加载RGSS核心库失败 %s。", @library) if @hRGSSCore == 0

def get_check(ary)
        begin
                Kernel.const_set(ary[0], Win32API.new(@library, *ary))
        rescue Exception
                err_msg("获取RGSS核心库导出函数失败 %s。", ary[0])
        end
end
get_check(%w{RGSSEval p i})
get_check(%w{RGSSInitialize l v})
get_check(%w{RGSSGameMain lpl v})
get_check(%w{RGSSSetupRTP ppi})
undef :get_check

rtpname = [0].pack('C') * 1024
if (RGSSSetupRTP.call(@inipath, rtpname, 1024) == 0)
        err_msg("没有发现 RGSS-RTP %s。", rtpname.delete([0].pack('C')))
end

RGSSInitialize.call(@hRGSSCore)
if ARGV.include?("btest")
        RGSSEval.call("$DEBUG = true; $BTEST = true")
        @rgssad = nil
elsif ARGV.include?('debug')
        RGSSEval.call("$DEBUG = true")
end

RGSSGameMain.call(@hWnd, @scripts, @rgssad ? rgssad.object_id * 2 + 16 : 0)

stop[/pre]
本人擅长XP,如果有脚本或者Ruby方面的问题欢迎发电邮到engshun@1ppl.me咨询,本人很少检查电邮所以不一定会及时回复,本人不会直接出手解决问题只会提供一个方向,所以谢绝伸手党
回复

使用道具 举报

梦石
0
星屑
1788
在线时间
16 小时
注册时间
2014-12-7
回帖
4
发表于 2015-8-21 20:45:17 | 显示全部楼层
多谢楼主,看了你的程序真的让我大开眼见,没想到winapi还可以这样用,让程序减少了不少。其实今天中午我的程序也写完了,但是有300行之多,主要是定义了半天cstruct。刚才看了你的程序,下载后在我这里运行不了,所以就想到用你的程序来简化我的程序。本来想另外开帖,又觉得是在这个帖里面长大的所以就放在这里了。

示例工程如下   RGSS纯ruby启动器.zip (1.13 MB, 下载次数: 120)
程序代码如下
  1. # -*- coding:utf-8 -*-
  2. =begin
  3. 参考资料
  4. https://rpg.blue/thread-377723-1-1.html  想法来源(后来还用楼主的脚本重新改写)
  5. http://skandhas.iteye.com/blog/809806 解决了创建windows窗口的问题
  6. 有些windows的常量没有定义需要查看MSDN

  7. http://rpg.blue/thread-282803-1-1.html  解决了最后读不了脚本文件的问题

  8. 解决不了的问题
  9. 1.RTP无法加载(也不知道加载是什么原理)
  10. 2.想知道RGSS.dll是如何实现的
  11. 3.RGSSGameMain 究竟干了什么,为什么之前的RGSSEval不能使用Sprite
  12. =end

  13. require 'Win32API'
  14. require 'pathname'
  15. require 'iniparse'  #读取ini文件

  16. RGSSversion=3 # 1 or 3
  17. Gameini="Game_debug.ini" #"Game.ini"
  18. WndClassName = "Pure Ruby Window For RGSS"
  19. @title=WndClassName
  20. #--------
  21. szAppPath=Pathname.new(File.dirname(__FILE__)).realpath
  22. #puts Dir.getwd  获得当前的执行目录 ***
  23. Dir.chdir(szAppPath) #改变当前目录
  24. #-------------
  25. #隐藏掉控制台
  26. #Win32API.new('user32', 'ShowWindow', 'li', 'i').call(
  27. #    Win32API.new('kernel32', 'GetConsoleWindow', 'v', 'l').call, 0)

  28. #-------------
  29. @hInstance = Win32API.new('kernel32', 'GetModuleHandle', 'l', 'l').call(0)
  30. @wndclass = [
  31.         43, # style
  32.         Win32API.new('kernel32', 'GetProcAddress', 'lp', 'l').call(
  33.                 Win32API.new('kernel32', 'LoadLibrary', 'p', 'l').call('User32.dll'),
  34.                 'DefWindowProcW'), # wndproc
  35.         0, # class extra
  36.         0, # wnd extra
  37.         @hInstance,
  38.         Win32API.new('user32', 'LoadIcon', 'll', 'l').call(0, 32512), # icon
  39.         Win32API.new('user32', 'LoadCursor', 'll', 'l').call(0, 32512), # cursor
  40.         Win32API.new('gdi32', 'GetStockObject', 'i', 'l').call(4), # brush
  41.         0, # menu name
  42.         WndClassName # class name
  43. ].pack('ILiiLLLLLp')

  44. atom = Win32API.new('user32', 'RegisterClass', 'p', 'l').call(@wndclass)
  45. atom &=0x0000ffff
  46. return if atom==0
  47. #在第一个实现的脚本中atom本来是要用在WndClassName位置的
  48. x=200; y=100; width=640 ; height=480
  49. @hWnd = Win32API.new('user32','CreateWindowExA','lpplllllllll','l').call(
  50.         0x100, WndClassName, @title, 0x90CA0000, x, y, width, height, 0, 0, @hInstance, 0)
  51. #-------------
  52. hd_gameini=IniParse.parse( File.read "#{Gameini}" )
  53. szLibrary=hd_gameini["Game"]["Library"]
  54. szTitle  =hd_gameini["Game"]["Title"]
  55. szScripts=hd_gameini["Game"]["Scripts"]
  56. szRtpName=hd_gameini["Game"]["RTP"]
  57. @title=szTitle
  58. #通过核心库加载程序
  59. @hRgssCore = Win32API.new('kernel32', 'LoadLibrary', 'p', 'l').call(szLibrary)
  60. pRGSSEval=Win32API.new(szLibrary, "RGSSEval", ['P'], 'I')
  61. pRGSSSetupRTP=Win32API.new(szLibrary, "RGSSSetupRTP", ['P','P','I'], 'B')
  62. pRGSSInitialize=if RGSSversion==3
  63.     Win32API.new(szLibrary, "RGSSInitialize3", 'L', 'L')
  64. elsif RGSSversion==1
  65.     Win32API.new(szLibrary, "RGSSInitialize", 'L', 'L')
  66. end
  67. pRGSSGameMain=Win32API.new(szLibrary, "RGSSGameMain", ['L','P','P'], 'V')
  68. #puts Win32API::COLOR_WINDOWFRAME
  69. def stop
  70.         Win32API.new('kernel32', 'FreeLibrary', 'l', 'i').call(@hRGSSCore) if @hRGSSCore and @hRGSSCore != 0
  71.         Win32API.new('user32', 'DestroyWindow', 'l', 'i').call(@hWnd) if @hWnd and @hWnd != 0
  72.         Win32API.new('user32', 'UnregisterClass', 'pl', 'i').call(WndClassName, @hInstance)
  73.         exit
  74. end

  75. #RTP就是不行
  76. szRtpName= [0].pack('C') * 1024
  77. p pRGSSSetupRTP.Call("#{Gameini}", szRtpName, 1024)

  78. pRGSSInitialize.Call(@hRgssCore)  # 没有这个就不行,说明还是有关系的

  79. szScripts="Scripts.rvdata2"

  80. class String
  81.   MultiByteToWideChar = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  82.   WideCharToMultiByte = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
  83.   def to_uni
  84.     len = MultiByteToWideChar.call 65001, 0, self, -1, nil, 0
  85.     buf = "\0" * (len * 2 + 2)
  86.     MultiByteToWideChar.call 65001, 0, self, -1, buf, buf.size / 2

  87.     buf
  88.   end

  89.   def from_uni
  90.     len = WideCharToMultiByte.call 65001, 0, (self.respond_to?(:force_encoding) ? self.force_encoding("ASCII-8BIT") : self) + "\000\000", -1, nil, 0, nil, nil
  91.     ret = "\0" * len
  92.     WideCharToMultiByte.call 65001, 0, self, -1, ret, ret.size, nil, nil

  93.     self.respond_to?(:force_encoding) ?
  94.     ret.force_encoding("ASCII-8BIT").delete("\000") :
  95.     ret.delete("\000")
  96.   end
  97. end

  98. pRGSSGameMain.call(@hWnd,szScripts.to_uni,"") #必须这样才行

  99. stop
复制代码

点评

而且有个东西叫做openrgss  发表于 2015-8-22 01:59
准确来说是32位ruby  发表于 2015-8-22 01:50
**代码**  发表于 2015-8-22 01:50
我那个程序是针对32位windows写的  发表于 2015-8-22 01:48
回复

使用道具 举报

梦石
0
星屑
1902
在线时间
959 小时
注册时间
2012-7-5
回帖
225
发表于 2016-1-20 20:46:03 | 显示全部楼层
本帖最后由 浮云半仙 于 2016-1-20 20:47 编辑

看了各位大神的代码,本蒟蒻深受启发,然而最终我只写出来个窗口...(并不了解RGSS的dll{:2_276:})
  1. #encoding:utf-8

  2. require 'Win32API'
  3. unless defined?(Ocra)
  4. Win32API.new("user32", "ShowWindow", "li", "i").call(Win32API.new("kernel32", "GetConsoleWindow", 'l', 'l').call(0),0)
  5. #隐藏控制台
  6. end

  7. WS_OVERLAPPEDWINDOW         = 0xcf0000
  8. WS_VISIBLE         = 0x10000000
  9. IDI_APPLICATION  = 32512
  10. SW_HIDE  = 0
  11. SW_NORMAL  = 1
  12. IDC_ARROW = 32512
  13. COLOR_WINDOW = 5

  14. GetLastError = Win32API.new("kernel32", "GetLastError", nil, "i")
  15. GetProcAddress = Win32API.new("kernel32", "GetProcAddress", "lp", "l")
  16. GetModuleHandle = Win32API.new("kernel32", "GetModuleHandle", "l", "l")
  17. GetModuleHandleByName = Win32API.new("kernel32", "GetModuleHandle", "p", "l")
  18. LoadLibrary = Win32API.new("kernel32", "LoadLibrary", "p", "l")
  19. RegisterClass = Win32API.new("user32", "RegisterClass", "p", "i")
  20. FreeLibrary = Win32API.new("kernel32", "FreeLibrary", "l", "i")
  21. CreateWindowEx = Win32API.new("user32", "CreateWindowEx", "lppliiiillll", "l")
  22. MessageBox = Win32API.new("user32", "MessageBox", "ippi", "i")
  23. GetMessage = Win32API.new("user32", "GetMessage","plll", "i")
  24. DispatchMessage = Win32API.new("user32", "DispatchMessage", "p", "i")

  25. def msg_box(title, text)
  26.         MessageBox.call(0, text.to_s, title.to_s, 0)
  27. end

  28. unless defined?(Ocra)

  29. classname = "win32appruby233"                #窗口类名
  30. hInstance = GetModuleHandle.call 0                         #程序实例句柄
  31. hDll = LoadLibrary.call "user32.dll"                #加载user32.dll
  32. Win32API.new("user32", "UnregisterClass", "pl", "i").call(classname, hInstance)
  33. #先反注册一下窗口类名...然而八成没啥用...

  34. ar_DefWindowProc = GetProcAddress.call hDll, "DefWindowProcW"
  35. #user32.dll里面DefWindowProcW的地址

  36. wc = [0, ar_DefWindowProc, 0, 0, hInstance,
  37.                 Win32API.new("user32", "LoadIcon", "ll", "l").call(hInstance, IDI_APPLICATION),
  38.                 Win32API.new("user32", "LoadCursor", "ll", "l").call(hInstance, IDC_ARROW),
  39.                 COLOR_WINDOW + 1,           #窗体颜色
  40.                 0,
  41.                 classname].pack("lllllllllp")
  42. #参见WNDCLASS结构体,打包地址,句柄可以用 'l'
  43.                
  44. if RegisterClass.call(wc) == 0
  45.         msg_box "Error!", "Fail to register window class, Error code:#{GetLastError.call}"
  46.         exit
  47. end

  48. hWnd = CreateWindowEx.call(0, classname, "Ruby big law is good",  #title
  49.                                                         WS_VISIBLE | WS_OVERLAPPEDWINDOW,   #style
  50.                                                         200, 100, 544, 416,           #x, y, width, height   
  51.                                                         0, 0,
  52.                                                         hInstance, 0)
  53. #参见CreateWindowEx的参数

  54. Win32API.new("user32", "ShowWindow", "li", "i").call hWnd, SW_NORMAL
  55. #让窗口显示出来

  56. if hWnd == 0
  57.         msg_box("Error!", "Fail to CreateWindow")
  58.         exit
  59. end

  60. msg = "0"*24       #MSG结构体的大小为24byte,开够空间
  61. while GetMessage.call(msg, 0, 0, 0)   #消息循环
  62.         DispatchMessage.call(msg)
  63. end

  64. Win32API.new("user32", "UnregisterClass", "pl", "i").call(classname, hInstance)

  65. end
复制代码
膜拜各位神犇
BTW:win10上运行不了,报错注册窗口类失败。貌似win10上GetProcAddress一直返回0...好奇怪...{:2_278:}

点评

顺便求怎么换上非默认的WndProc.....2L的代码没看懂Orz.....  发表于 2016-1-20 20:49
tan(pi/2)
回复

使用道具 举报

梦石
0
星屑
1902
在线时间
959 小时
注册时间
2012-7-5
回帖
225
发表于 2016-1-22 21:29:41 | 显示全部楼层
taroxd 发表于 2015-3-26 12:42
我是来调戏论坛高亮的,不过论坛高亮竟然没出事情

{:2_270:}求解..ADDR_NWP,ADDR_AOWP怎么粗来的{:2_271:}
tan(pi/2)
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部