我不确定该怎么称呼这个问题,先提前道歉。
你看,我正在尝试使用Delphi(我的首选语言)学习Win32 / DirectX编程,使用这个网站-http://rastertek.com/tutindex.html
当然,这个网站全都是C++写的,所以我必须将其移植到Delphi。起初似乎很简单。我正在进行第二个DirectX 11教程-设置框架并使初始窗口显示出来。
现在是我真正的问题。我一直遇到访问冲突错误。因此,我找到并开始使用MadExcept来查找问题所在。它告诉我错误的行数,但我不知道如何解决这些问题。
我已经设置好了所有东西,以尽量模仿原始源代码。唯一的区别是,在变量(例如m_input、m_grahics和system)的类指针的情况下,我为这些变量制作了一个类型。所以我有TSystemClass、TInputClass、TGraphicsClass,然后我有PSystemClass等等,它们等于^TSystemClass等等。我认为这样做会使事情更简单、更整洁。另外,我假设应该说一下,但是为了构造复制构造函数,我让最初的类从TPersistent继承,这样我就可以使用它的Assign过程。
所以,回到访问冲突错误。首先,在主程序中,system是PSystemClass类型的问题。对我来说原因不明,当我尝试使用system.create时,就在那一瞬间创建了访问冲突。然后我意识到,我没有将system分配给system.create。所以我尝试了这个,它说,我想这是正确的,在编译时会出现一个错误,因为两者不兼容,因为system.create是TSystemClass类型,而system是PSystemClass类型。所以我尝试进行类型转换,那行得通。但是再次遇到可怕的访问冲突。
于是我有一个奇怪的想法,也许我应该直接从TSystemClass本身调用常规构造函数。我尝试了一下,需要再次进行类型转换。所以我做到了。它起作用了!那里不再有访问冲突错误!现在…新问题!或者在这种情况下是“问题”。在MadExcept的调用堆栈中现在列出了3件事。第一个:
m_hinstance := GetModuleHandle(nil);
它说这导致了访问冲突错误。但是为什么会这样呢?据我所知,如果GetModuleHandle设置为null/nil,则应该检索调用它的文件的句柄,对吗?从文档中可以看出,那应该是可执行文件。
但要注意:我不确定是否因为我将主程序、系统类别、输入类别和图形类别放在不同的程序/单元文件中以模拟原始源代码的性质。那么这可能是导致问题的原因吗?如果是,我该如何解决?将所有代码从单元文件中放���主程序文件中?但在我个人看来,那会非常凌乱和不直观。
接下来的问题更让我困惑。
InitializeWindows(ScreenWidth, ScreenHeight);
我这里只涉及到注册窗口类和为窗口做准备的函数,所以我不太确定问题出在哪里,因为它只涉及到两个已经定义好的参数,而且在调用之前它们已经被定义好了。所以我不太确定问题出在哪里,也不确定到底是什么原因导致了访问冲突。
最后一个问题是在主程序中:
return := system.initialize;
在原始源代码中,我在所有result变量的实例中使用了Return,因为result当然是所有函数的内置变量。
我想,如果系统无法正确执行其预定功能,则应该发生某些事情。同样,因为我之前使用TSystemClass.Create(强制转换为PSystemClass)创建了系统,那么这里会发生什么?它可能与其他两个问题有关,因为它们无法正常执行自己的操作吗?
最后要注意的是,在MadExcept的调用堆栈中还有一件事。
模块部分显示Kernel32.dll,但除了主线程外,没有列出任何其他信息。(如果需要此信息,我很乐意提供)。
感谢您阅读到这里,并希望能够在解决此问题上得到帮助,以便我可以进一步学习。
m_hinstance := GetModuleHandle(nil);
。AV并非由GetModuleHandle调用引起,而是将GetModuleHandle的结果赋值给m_hinstance引起的。 - The_Fox