wine 东方弹幕游戏的配置程序为什么启动不出来?求高手指点

Wine、Cedega、CrossOver 等配置
头像
langyxxl
帖子: 443
注册时间: 2012-01-17 22:17

wine 东方弹幕游戏的配置程序为什么启动不出来?求高手指点

#1

帖子 langyxxl » 2013-06-05 21:56

不管是哪个东方弹幕游戏的custom.exe,wine都没法运行出来,这个应该是wine的bug,在windows下是可以运行的


我运行WINEDEBUG=+relay wine custom.exe
在结果中我发现程序调用
0024:Call user32.DialogBoxParamA(00400000,00000067,00000000,00401058,00000000) ret=004018ed

但是显示不出这个对话框,最后返回时的情况是
0024:Ret user32.DialogBoxParamA() retval=00000000 ret=004018ed

我上网查了下这个函数返回0代表调用该函数的hWndParent参数是无效的,可是一般写windows程序时父窗口设置为0x00000000不就可以了?wine不应该连这么简单的调用都有问题。

所以不是很了解wine,求wine大神帮忙分析一下。或者应该怎么继续分析下去,求指点

custom.exe的下载地址:
http://pan.baidu.com/share/link?shareid ... 2618734262
头像
nyfair
帖子: 1067
注册时间: 2007-12-07 12:49
系统: winnux10
来自: Tree New Bee

Re: wine 东方弹幕游戏的配置程序为什么启动不出来?求高手指点

#2

帖子 nyfair » 2013-06-06 23:59

有魔改补丁,但winehq不认,所以没啥好问的
本人在此论坛仅负责吐槽,问题急需解决请支付宝转账5毛至{我的id@qq.com},将会竭诚为您服务

linux常见多媒体问题处理指南

1. 视频播放有问题->卸载gstreamer
2. 音频播放有问题->卸载pulseaudio
3. 远程播放有问题->卸载avahi
4. 系统全都有问题->卸载systemd,远离Lennart这傻逼让你从此轻松自在

⇩自由网络⇩
https://github.com/nyfair/freeweb
头像
langyxxl
帖子: 443
注册时间: 2012-01-17 22:17

Re: wine 东方弹幕游戏的配置程序为什么启动不出来?求高手指点

#3

帖子 langyxxl » 2013-06-08 8:16

魔改补丁是什么?
头像
nyfair
帖子: 1067
注册时间: 2007-12-07 12:49
系统: winnux10
来自: Tree New Bee

Re: wine 东方弹幕游戏的配置程序为什么启动不出来?求高手指点

#4

帖子 nyfair » 2013-06-08 20:50

langyxxl 写了:魔改补丁是什么?
ugly hardcode patch
本人在此论坛仅负责吐槽,问题急需解决请支付宝转账5毛至{我的id@qq.com},将会竭诚为您服务

linux常见多媒体问题处理指南

1. 视频播放有问题->卸载gstreamer
2. 音频播放有问题->卸载pulseaudio
3. 远程播放有问题->卸载avahi
4. 系统全都有问题->卸载systemd,远离Lennart这傻逼让你从此轻松自在

⇩自由网络⇩
https://github.com/nyfair/freeweb
cliches
帖子: 5
注册时间: 2013-09-19 12:59
系统: gentoo

Re: wine 东方弹幕游戏的配置程序为什么启动不出来?求高手指点

#5

帖子 cliches » 2013-09-19 13:08

原因是ZUN的程序很山寨
custom.exe的输入表中未包含comctl32.dll
因此DIALOG_CreateControls32无法创建msctls_trackbar32这个control
只要用LordPE之类的PE编辑软件增加一个输入表项,比如comctl32.dll的InitCommonControls,就可以了
头像
langyxxl
帖子: 443
注册时间: 2012-01-17 22:17

Re: wine 东方弹幕游戏的配置程序为什么启动不出来?求高手指点

#6

帖子 langyxxl » 2013-09-27 23:20

这个应该是wine的bug不是ZUN的程序山寨....

windows能运行,wine不能运行,就是wine做的不到位的地方

假如缺少dll的话,程序启动时会报少dll的错误的.....
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: wine 东方弹幕游戏的配置程序为什么启动不出来?求高手指点

#7

帖子 eexpress » 2013-09-27 23:24

Call user32.DialogBoxParamA
这种提示,通常是需要自己指定dll。和系统带的不兼容。
● 鸣学
头像
langyxxl
帖子: 443
注册时间: 2012-01-17 22:17

Re: wine 东方弹幕游戏的配置程序为什么启动不出来?求高手指点

#8

帖子 langyxxl » 2013-09-28 18:06

cliches 写了:原因是ZUN的程序很山寨
custom.exe的输入表中未包含comctl32.dll
因此DIALOG_CreateControls32无法创建msctls_trackbar32这个control
只要用LordPE之类的PE编辑软件增加一个输入表项,比如comctl32.dll的InitCommonControls,就可以了

msdn上是这么说错误的
If the function fails because the hWndParent parameter is invalid, the return value is zero. The function returns zero in this case for compatibility with previous versions of Windows.

和dll的缺失没有关系啊,而且你看下面,能够调用到需要的函数,我调试的是TH14的custom
并且在winedebug下他,custom程序有下面这两行的调用
000d:Call comctl32.InitCommonControlsEx(00000000) ret=7fe15bbd873d
000d:Ret comctl32.InitCommonControlsEx() retval=00000000 ret=7fe15bbd873d

而且你说的InitCommonControls函数这个,msdn中说只能在windows95这类机器上使用

你确定用lordpe修改输入表,可以成功?
cliches
帖子: 5
注册时间: 2013-09-19 12:59
系统: gentoo

Re: wine 东方弹幕游戏的配置程序为什么启动不出来?求高手指点

#9

帖子 cliches » 2013-10-17 18:30

langyxxl 写了:
cliches 写了:原因是ZUN的程序很山寨
custom.exe的输入表中未包含comctl32.dll
因此DIALOG_CreateControls32无法创建msctls_trackbar32这个control
只要用LordPE之类的PE编辑软件增加一个输入表项,比如comctl32.dll的InitCommonControls,就可以了

msdn上是这么说错误的
If the function fails because the hWndParent parameter is invalid, the return value is zero. The function returns zero in this case for compatibility with previous versions of Windows.

和dll的缺失没有关系啊,而且你看下面,能够调用到需要的函数,我调试的是TH14的custom
并且在winedebug下他,custom程序有下面这两行的调用
000d:Call comctl32.InitCommonControlsEx(00000000) ret=7fe15bbd873d
000d:Ret comctl32.InitCommonControlsEx() retval=00000000 ret=7fe15bbd873d

而且你说的InitCommonControls函数这个,msdn中说只能在windows95这类机器上使用

你确定用lordpe修改输入表,可以成功?

首先,我在虚拟机里的windows xp里也无法运行原始的custom.exe。修改输入表后wine和xp下都可运行。
其次,缺少的是对msctls_trackbar32这个控件的初始化,所以只要在custom.exe的输入表里加上comctl32.dll的任何一个API都可以,不是非要InitCommonControls不可的。
最后,通过设置WINEDEBUG得到的trace未必与运行的程序本身有关,可能是其他程序的输出。因为wine一运行,至少会启动services.exe、explorer.exe、winedevice.exe、plugplay.exe。而custom.exe的输入表不包含comctl32.dll,基本可以确定就是这种情况。
头像
langyxxl
帖子: 443
注册时间: 2012-01-17 22:17

Re: wine 东方弹幕游戏的配置程序为什么启动不出来?求高手指点

#10

帖子 langyxxl » 2013-10-18 20:34

我的xp虚拟机是可以运行custom.exe的。。。。。 :em20

虚拟机还有不一样的。。。。

那msdn上解释DialogBoxParamA错了?
onlylove
论坛版主
帖子: 5231
注册时间: 2007-01-14 16:23

Re: wine 东方弹幕游戏的配置程序为什么启动不出来?求高手指点

#11

帖子 onlylove » 2013-10-18 20:53

哦,虚拟机和虚拟机不太一样的,有人偷懒用的精简版的Ghostxp,有人用的普通版的,然后问题就出来了
#include <stdio.h>
void main()
{
double world;
unsigned letter;
short stay;
long memories;
printf("I miss you.\n");
}
头像
langyxxl
帖子: 443
注册时间: 2012-01-17 22:17

Re: wine 东方弹幕游戏的配置程序为什么启动不出来?求高手指点

#12

帖子 langyxxl » 2013-10-19 8:45

我用的是ghost。。。。。。
lordpe我使用的时候,没发现有增加输入表项的功能,有其他工具吗?
cliches
帖子: 5
注册时间: 2013-09-19 12:59
系统: gentoo

Re: wine 东方弹幕游戏的配置程序为什么启动不出来?求高手指点

#13

帖子 cliches » 2013-10-20 11:45

我用的是qemu-kvm,使用msdn的xp sp3光盘安装。

你引用的MSDN上解释DialogBoxParam那段话只是说了这个API失败的一种可能性而已,又不是说这个API失败的原因只有这一种。就custom.exe而言,失败的原因是对话框里用到了msctls_trackbar32,而msctls_trackbar32只在comctl32.dll初始化时后才能用。

用LordPE添加输入表流程如下:点右上的PE Editor按钮->选择custom.exe打开->点右边的Directories按钮->点Import table那行的...按钮->在写着dll名称的上半部分点右键->填写dll名称与API名称->点加号按钮->点OK按钮
头像
langyxxl
帖子: 443
注册时间: 2012-01-17 22:17

Re: wine 东方弹幕游戏的配置程序为什么启动不出来?求高手指点

#14

帖子 langyxxl » 2013-10-20 17:14

大神啊!!!按照你说的操作,我真的能启动出来了

我把所有的custom.exe都看了一遍,原生的都没有带着comctl32.dll这个dll
但是th06到th10都是能通过wine直接启动custom.exe的,从th11开始就没办法启动出来了

并且我总觉得ghost的windows应该和正版差不多吧,要是正版的不能使用custom.exe,大家不都郁闷死了

大神,能和我做好朋友吗 :em04

我在用WINEDEBUG=+relay调试的时候,没发现他调用msctls_trackbar32函数,难道+relay不能把所有函数都输出出来吗
windows之所以能启动出来,是因为程序调用msctls_trackbar32的时候windows自动加载comctl32这个dll吗,那wine能不能也改成这样
cliches
帖子: 5
注册时间: 2013-09-19 12:59
系统: gentoo

Re: wine 东方弹幕游戏的配置程序为什么启动不出来?求高手指点

#15

帖子 cliches » 2013-10-20 21:12

也许windows在处理这事情时有什么隐藏机制吧,肯定是公开文档上没写的。而且有的windows能运行有的不能这点也让人不知道到底正常的情况是哪种。

WINEDEBUG=+relay是要闹哪样?要看对话框相关的调试信息当然应该WINEDEBUG=+dialog了啊。

msctls_trackbar32不是一个API函数,而是一个control,其实就是滚动条。程序调用DialogBoxParam这个API是要创建一个对话框的,这个对话框用到了滚动条这个东西。只有在comctl32.dll初始化后程序才知道msctls_trackbar32是什么。
回复