我想在不使用DLL的情况下在Delphi中播放.XM或.MOD文件。我搜索了这里和类似的网站。最后,我找到了一个很好的库(BeRoXM.pas
)来做这件事,它可以做我想做的事情。 (您可以下载here)
但是当我使用Delphi XE5时,我无法编译该单元。代码太旧了。
那我该如何播放这些文件?
谢谢。
答案 0 :(得分:2)
实际和正式var参数的类型必须相同
这是错误E2033,described by the documentation如下:
对于变量参数,实际参数必须是形式参数的确切类型。
所以错误是var
参数,BeginThread
只有一个:最后一个参数。库代码正在传递ThreadID
var
参数和ThreadID
,其声明为:
ThreadID: THandle;
但是BeginThread
函数需要TThreadID
(这是LongWord
的别名)。图书馆代码完全是虚假的。线程ID绝对不是THandle
。
旧版本的Delphi THandle
被错误地声明为LongWord
。值得庆幸的是,最新版本的Delphi通过将其声明为NativeUInt
来修复这种讽刺,尽管我个人更喜欢将其声明为无类型指针,因为它在Windows头文件中。
通过将BeRoXM
的类型更改为ThreadID
来修复TThreadID
库代码。将此代码移植到XE5时,预计会出现更多问题。
答案 1 :(得分:2)
我是BeRoXM的作者。 BeRoXM几个月后就与更新的Delphi和FPC版本兼容。
但我可以问一下,你为什么不直接通过电子邮件与我联系?我的电子邮件地址可以在代码注释中的BeRoXM.pas文件的开头找到。
答案 2 :(得分:1)
uFMOD使您可以轻松地在应用程序中播放.xm配乐[chiptunes]。通过指定参数,您可以从磁盘,内存或资源中播放.xm文件。
答案 3 :(得分:0)
不使用DLL
不使用或不部署?您可以在应用程序中包含DLL,将其解压缩到临时文件夹并从中加载。
调试器说:
调试器仅在程序运行时才有效。既然你无法编译,那就是编译器说的。
实际和正式var参数的类型必须相同
那么请你告诉我如何解决这个错误?
您应该了解何时使用该功能。可能有几个名为“BeginThread”的函数。你必须指出编译器真正想要使用的那个。通常,Ctrl + Click足以找到它,但有时IDE会疯狂。
您应该为我们复制该功能的声明。
您应该找到并复制您尝试输入函数的所有参数的声明。这里是BeRoXMThreadProc, self, ThreadID
。
您必须比较为“BeginThread”声明中的参数声明的数据类型(称为正式声明)并在您尝试调用该函数的位置使用(这些称为实际的)。并使它们相互匹配。
这可能是您尝试调用的函数的声明
但也许不是 - 如上所述,可能有几个名为“BeginThread”的函数。
PS:虽然我把这些链接放在上面,但您最好将来自您的来源的实际功能和类型声明复制到您的问题中。 StackOverflow尝试成为一个自我依赖的站点,其中所有必需的数据已经存在问题,没有外部链接,可能会脱机或404将来。