| 赞 | 4 |
| VIP | |
| 好人卡 | |
| 积分 | 1 |
| 经验 | |
| 最后登录 | 2017-9-1 |
| 在线时间 | 2276 小时 |
路人党员
- 梦石
- 0
- 星屑
- 52
- 在线时间
- 2276 小时
- 注册时间
- 2010-12-30
- 回帖
- 3011
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 英顺的马甲 于 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 求吐槽 |
评分
-
查看全部评分
|