我正在将DirectX 6.1库的windows32钩子写入DirectX 9.0c;想法是通过调用Direct 9.0c替换所有对DX 6.1 3D设备的调用并注入一些自定义代码,所以我修补的旧游戏(99年)将能够使用着色器,后期效果等。
旧的DX 6.1 3D设备是通过创建DDraw模块创建的。然后游戏枚举设备上限。在我的模块中,整个DDraw模块被滑动并初始化3D视图。所以我有问题,因为我不能给它所需的游戏Ddraw4设备上限,因为我根本没有DDraw设备!
所以我的问题是如何在不初始化DDraw4设备的情况下获取DDraw4设备上限。也许它足以创建固定列表并将其提供给游戏,但我不知道该列表应该是什么(我给了我认为它应该是什么,并且退出游戏 - 记录器显示它刚刚在设备上限之后选中)
答案 0 :(得分:3)
我从未尝试过这个,但您可以尝试以下方法。假设您没有6.1 SDK,您可以自己创建DDCAPS结构(DirectDraw一个)(它基本上只是DWORD),然后使用DX9获取功能(D3DCAPS9){{3功能。接下来,从获取的大写字母中获取所需的值(使用DX9),并在DDCAPS结构中设置DirectDraw的等效值。然后,您可以将此填充的大写字母结构提供给游戏。一些警告 - 正如你所提到的,你不知道具体需要什么,所以它有点受欢迎(除非你有源代码)。此外,帽结构值(DX9和DDraw之间)可能没有1:1映射。最后 - 这与没有6.1 SDK相关 - 如果您不知道标志值,则根据获取的上限设置值时,可能会错误地设置标志。正如我所提到的,这可能有点过时(或需要很多侦探工作),但我认为这可能是你可以尝试的。
答案 1 :(得分:0)
解决方案有点粗糙,但最重要的是 - 工作正常。
我编写了一个初始化DDraw 6.1的小型自包含实用程序,而不是获取设备上限,然后将它们转储到磁盘上的文件中(设备上限为Plain Old C格式结构,因此保存它非常简单)并退出。然后我可以从磁盘读取设备上限文件,并在应用程序询问我时将其返回。