Project1

标题: WIN7下運行RMVX遊戲開頭無響應十多秒的解決辦法 [打印本页]

作者: 流川枫    时间: 2013-9-21 23:12
标题: WIN7下運行RMVX遊戲開頭無響應十多秒的解決辦法
本帖最后由 流川枫 于 2013-9-21 23:17 编辑

將 C:\Windows\SysWOW64\dmusic.dll 禁止運行,從而禁止MIDI音樂被初始化和播放。
禁止方法是右鍵屬性安全裏設置為如圖:

但這個方法的缺點是所有應用程序都將無法播放MIDI的音樂,除非你有辦法只禁止RMVX的程序加載該DLL。
原帖:
http://kiyonatsusuzuka.blog.163. ... 152201382111645787/
作者: 流川枫    时间: 2013-9-21 23:33
順便問一下WIN8.1是否會有這個問題,如果沒有的話也許考慮升級WIN8.1
作者: 流川枫    时间: 2013-9-21 23:46
千千靜聽就算禁止那個DLL後也可以播放MIDI,這是因為其不是使用DX的MIDI而是自己的
作者: 两只鱼    时间: 2013-9-24 14:28
困扰我的问题果然解决了,我记得以前win7下没有这个问题啊,难道是最近win7更新的吗
作者: 流川枫    时间: 2013-9-26 16:02
餓,我發現現在我的WIN7裏就算不禁用那個DLL,啟動RMVX的遊戲只用4秒。而這可能和我前幾天卸載了瑞星殺毒有關。看來導致WIN7下RMVX啟動無響應不是WIN7的BUG,而更可能是殺毒或其他原因導致的。
作者: 精灵使者    时间: 2013-9-26 16:42
其实XP的DXAUDIO是硬解码,WIN7是软解码,难怪会变慢了。
作者: 不死鸟之翼    时间: 2013-10-6 20:55
我这里是第一次运行时会卡一阵子,鼠标无响应,整个屏幕停止重绘,之后就好了{:2_270:}

如果楼主是每次都这样的话,可以试试两个方法
1 放一个假的dmusic.dll到游戏目录下,因为Windows的DLL加载顺序问题不知道能不能骗过去
2 如果每次启动都会卡,楼主会编程的话自己写一个Loader,阻止RM程序加载dmusic.dll即可

具体实现的话,方便起见可以用微软的Detours库。
启动游戏进程的时候使用DetourCreateProcessWithDllEx,使用方法和CreateProcess差不多,多出的两个参数,第一个填写你写的DLL名称,第二个给NULL即可
DLL方面,在DllMain里面进行API HOOK即可
过程类似这样,以C++为例
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(LPVOID&)Old_LoadLibraryW,New_LoadLibraryW);
DetourTransactionCommit();//一定要commit才能生效
至于拦截的处理
HMODULE (WINAPI* Old_LoadLibraryW)(LPCWSTR lpLibFileName)=LoadLibraryW;
HMODULE WINAPI New_LoadLibraryW(LPCWSTR lpLibFileName)
{
        if(wcscmp(lpLibFileName,L"dmusic.dll")==0)//如果加载的是dmusic.dll
        {
                return NULL;//直接让函数失败
        }
        return Old_LoadLibraryW(lpLibFileName);//不是的话正常加载
}
这样就可以屏蔽RM对这个DLL的加载,其他应用不受影响。
好吧我承认我很懒,随手写的没有测试 有兴趣的可以做出来 Detours可以从微软官网下载,需要自己编译一下,挺方便的,或者你自己写API HOOK也行 只是代码比较多
作者: 流川枫    时间: 2013-10-7 04:48
不死鸟之翼 发表于 2013-10-6 20:55
我这里是第一次运行时会卡一阵子,鼠标无响应,整个屏幕停止重绘,之后就好了

如果楼主是每次都 ...

第一个方法没用无论如何都会加载系统的,所以1L里只好直接禁止运行该DLL。 第二个方法早就试过了,在OD都无法断点到加载该DLL,应该说其根本不是用LoadLibraryW和LoadLibraryA也不是用LoadLibraryExW和LoadLibraryExA加載該DLL的。其的加載方式不詳。  並且導致這個無響應問題的原因是因為瑞星殺毒v16,我剛又裝了一遍瑞星殺毒v16後發現又出現MIDI無響應的問題了需等待18秒。而卸載瑞星殺毒後只用4秒。
作者: 不死鸟之翼    时间: 2013-10-7 10:55
本帖最后由 不死鸟之翼 于 2013-10-7 11:06 编辑
流川枫 发表于 2013-10-7 04:48
第一个方法没用无论如何都会加载系统的,所以1L里只好直接禁止运行该DLL。 第二个方法早就试过了,在OD都 ...

其实我们忽略了一个问题,DirectX其实是以COM组件的形式提供的,dmusic的加载肯定不在程序内,HOOK这里显然没用{:2_263:}OD抓不到也正常
所以禁止相关组件的初始化理论上可以达到防止卡死的目的
如果你有Dx9的SDK的话可以试试挂接一下CoCreateInstance和/或与之相关的API判断第一个参数CLSID是不是CLSID_DirectMusic***(具体是哪个我不敢肯定),如果是的话禁止初始化应该就没问题了
我这里只有系统引导后第一次启动游戏会卡,所以其实也没什么影响。
PS:唉我第一天来6R就这么作死233
作者: 流川枫    时间: 2013-10-8 08:36
不死鸟之翼 发表于 2013-10-7 10:55
其实我们忽略了一个问题,DirectX其实是以COM组件的形式提供的,dmusic的加载肯定不在程序内,HOOK这里显 ...

還有一招不需要補丁就可以實現,就是弄一個低級帳戶只禁止該帳戶運行那個DLL,然後RMVX的EXE創建快捷方式以那個帳戶運行該EXE,這樣就不會影響其他的使用DX播放MIDI的程序了
作者: 不死鸟之翼    时间: 2013-10-10 23:49
流川枫 发表于 2013-10-8 08:36
還有一招不需要補丁就可以實現,就是弄一個低級帳戶只禁止該帳戶運行那個DLL,然後RMVX的EXE創建快捷方式 ...

Windows 7的凭据管理器似乎可以保存账户的密码信息作为登录凭据,不过我没用过……我觉得最干净彻底的办法就是Hack一下自带的RGSS Player,以此为基础做出的游戏就都不会加载MIDI




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1