用C语言编写DirectX程序?

9

过去我用C++编程语言创建了DirectX应用程序,但是我想知道是否可以使用C编程语言来完成。

谢谢。


1
C语言限制有什么原因吗? - user180326
5个回答

13

Open Watcom C/C++编译器附带有DirectX示例应用程序,包括C ++和C。两者都可用,并分别在OW 1.9的WATCOM\samples\directx\cppWATCOM\samples\directx\c目录下。

以下是C++代码示例:

hr = d3d->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dcaps9);
hr = d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
hr = d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, game_window, D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &d3dpp, &d3d_dev);

而在C语言中:

hr = IDirect3D9_GetDeviceCaps(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dcaps9);
hr = IDirect3D9_GetAdapterDisplayMode(d3d, D3DADAPTER_DEFAULT, &d3ddm);
hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, game_window, D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &d3dpp, &d3d_dev);

在C语言中,您不需要对COM做任何特殊处理,因为已经定义了足够的宏,您只需使用即可。


1
人们应该被激励以这种方式回答问题,从“是否可能…”到“这就是如何做…”。非常感谢您提供的信息,我是一名初学者,正考虑为C ++方法创建C包装器。谢谢。 - user2188550
@Ivanzinho 这可能不是普遍适用或首选。 - Alexey Frunze
为什么不可取呢?我正在学习C语言,我认为最好的学习方法是实际使用它。(顺便说一下,我已经使用C#编程12年了,我知道什么是面向对象编程) - user2188550

12

是的,这是可能的。DirectX公开了一个COM接口,C语言可以使用它们。不过,这可能并不是一件非常有趣的事情!


1
我已经尝试过了。你会习惯的,但这仍然不是令人愉快或容易的事。 - dreamlax
这种方法也是可行的,但正如David所提到的,这将一点都不好玩。如果你尝试采用这种方式,祝你好运。 - Jesus Ramos

2

你可以在C语言中使用DirectX。它有特定的宏来简化COM接口的使用。不过,使用C++会更加容易。


0

我认为DirectX库有一些仅限于C++的组件(我已经有一段时间没有使用它了,从我上次记得它包含类)。最好还是用C++来简化你的生活。


只是因为你可以做到,并不意味着你有时候应该这样做。虽然如果他想的话,他可以一直往前走嘿嘿。 - Jesus Ramos
@Jesus 哈哈,确实如此。最近我不得不用 C 实现一个 COM 接口。这真的让我头疼。 - David Heffernan
我也做过类似的事情,不过在.NET和C#中使用COM组件比C更让人头疼。当然,如果能够通过COM高效地运行一些DirectX内容,那就太酷了。 - Jesus Ramos
@Jesus 啊,我记起了一些 C++ 的片段。那也许只是将错误代码转换为错误消息的例行程序吗? - David Heffernan
@David:我也这么认为。虽然我还不确定为什么有人想要在C语言中尝试这个,除非他们某种程度上是受虐狂(如果有人要尝试这个,请不要介意,我只是觉得这比必要的困难)。 - Jesus Ramos
使用C语言的原因:1 更少的隐式代码。 2 更强的保证。 3 更成熟的工具。 4 更好的代码分析。 5 更好的互操作性。我相信还有更多的原因,但如果你关心在阅读一行代码时能够发现错误,那么你不可能希望使用C ++。 - IInspectable

0

这是可能的,但因为你缺乏C++提供的高级函数,所以你让自己更难了。


1
@Geoffrey,实际上是这样的。Windows的许多API都使用从类构建的C++。要使用它,您需要在C中访问类,这是可能的吗?当然可以。但是实用吗?根本不是,使用C++更容易,因为您已经使用了类,所以可以直接使用API,而无需使用变通方法。 - Xantium
1
@Geoffrey,从你的评论中可以看出,你在说我认为C比C++难(我不知道你是在什么情况下这样说的)。相对于C++,C的学习曲线要小得多(库更小,语法总体上也更小)。然而,在*这种情况下,当你试图使用为C++实现的API时,如果你想在C中使用它们,那么你的生活将会变得非常非常困难。 - Xantium
1
这是我目前正在处理的C语言示例:https://github.com/gnif/LookingGlass/blob/master/c-host/windows/capture/dxgi.c。我真的不认为这有多难,只是有点不同而已。 - Geoffrey
1
非常好,我会感兴趣地查看的,谢谢。@Geoffrey - Xantium
1
我的经验是,C语言之所以看起来更难,是因为它没有RAII(因此没有com_ptr)。除此之外,没有太大的区别。 - Julian Kirsch
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接