2014-01-18 1 views
0

Я хочу проигрывать файлы .XM или .MOD в Delphi без использования DLL. Я искал здесь и подобные сайты. Наконец, я нашел хорошую библиотеку (BeRoXM.pas) для этого, и она может делать именно то, что я хочу делать. (Вы можете скачать его here)Воспроизведение аудиофайлов .XM .MOD в Delphi без DLL

Но поскольку я использую Delphi XE5, я не могу скомпилировать устройство. Код слишком старый.

Так как я могу воспроизвести эти файлы?

спасибо.

ответ

0

без использования библиотеки DLL

без использования или без развертывания? Вы можете иметь DLL внутри приложения, распаковать его во временную папку и загрузить с нее.

И отладчик говорит:

отладчик работает только тогда, когда программа уже запущена. Поскольку вы не могли компилировать, это компилятор.

Типы фактических и формальных параметров вар должны быть идентичны

Так могли бы вы сказать мне, как я могу исправить эту ошибку?

  1. Вы должны понимать, когда функция используется. Может быть несколько функций с именем «BeginThread». Вам нужно прибить тот, который компилятор действительно хочет использовать. Обычно Ctrl + Click достаточно, чтобы найти его, хотя иногда IDE сходит с ума.

  2. Вы должны скопировать декларацию этой функции здесь для нас.

  3. Вы должны найти и скопировать объявления всех параметров, которые вы пытаетесь передать в функцию. Здесь они BeRoXMThreadProc, self, ThreadID.

  4. Вам придется сравнивать типы данных, которые были объявлены для параметров внутри декларации BeginThread (которые называются формальными) и используются в том месте, где вы пытаетесь вызвать функцию (они называются фактическими). И заставить их соответствовать друг другу.

Это может быть декларация функции, которую вы пытаетесь вызвать

Но, возможно, это не так - как было сказано выше, Там может быть несколько функции с именем «BeginThread».

PS: хотя я поставил эти ссылки выше, вам лучше скопировать в свой вопрос фактические объявления функций и типов из ваших источников. StackOverflow пытается стать самостоятельным сайтом, где все необходимые данные уже присутствуют без внешних ссылок, которые могут быть отключены в автономном режиме или 404 в будущем.

+0

Зачем нужна вся сложность? Это действительно не так сложно. –

+0

@ DavidHeffernan это не сложно, когда вы знаете, что такое ошибка и как ее исправить. Но когда вы этого не сделаете, вам нужно пошаговое руководство. Или что-то отлаживающее вашу программу для вас. Не связанная записка, можете ли вы отправить почту в документацию @ EMBT? они забыли декларацию Delphi по адресу http://docwiki.embarcadero.com/Libraries/XE5/en/System.TThreadFunc У меня нет моей почты здесь, можете ли вы опустить их записку –

+0

Мы действительно знаем, что такое ошибка, и это тот, который всегда тривиально, чтобы понять –

2

Типы фактических и формальных параметров вар должны быть идентичны

Это E2033 ошибка, described by the documentation следующим образом:

Для переменного параметра, фактический аргумент должен быть точным тип формального параметра.

Таким образом, ошибка связана с параметром var, а BeginThread имеет только один: конечный параметр. Код библиотеки проходит ThreadID для этого параметра var и ThreadID который объявлен как:

ThreadID: THandle; 

Но функция BeginThread ожидает TThreadID (который является псевдонимом для LongWord) для этого параметра. Код библиотеки полностью фиктивный. Идентификатор потока категорически не является THandle.

В старых версиях Delphi THandle был указан неверно LongWord. К счастью, последние версии Delphi исправить эту пародию, объявив ее NativeUInt, хотя я лично предпочел бы, чтобы она была объявлена ​​как нетипизированный указатель, как в заголовочных файлах Windows.

Исправить код библиотеки BeRoXM, изменив тип ThreadID на TThreadID. Ожидайте, что возникнет больше проблем при переносе этого кода на XE5.

+0

1) поскольку эта библиотека была скомпилирована один раз, я ожидаю, что она была в Delphi RTL, чтобы запутать типы THandle и TThreadID (хотя я не понимаю, почему они должны быть разделены больше, чем все другие типы дескрипторов Windows, которые сводятся в DWORD в Win32, а последний последний раз был затронут в 2009 году до win64 Delphi) 2), так как разработка завершилась в 2009 году, я могу только задаться вопросом, является ли это Unicode-aware. Если нет, и если объект topicstart остановлен этим - как вы сказали - простой ошибкой, я буду аффри, чтобы представить себе путешествие, чтобы поймать все ошибки, связанные с указателями, в многопоточном приложении ... –

+0

@ Arioch HANDLE никогда не был DWORD. Первый - указатель, последний - 32-битный uint. –

+0

Действительно ли это было для программы, вызывающей границу DLL? Может быть, я должен заглянуть в ухо Win16, dunno –

2

Я автор BeRoXM. BeRoXM с нескольких месяцев совместим с новыми версиями Delphi и FPC.

Но могу ли я просто спросить, почему вы не связались со мной напрямую по электронной почте? Мой адрес электронной почты можно найти в начале файла BeRoXM.pas в комментарии к коду.

+0

+1 для обновления вашей библиотеки. Кажется, он работает в более новых версиях Delphi. Cheers! – Sky

+0

Beacause, связавшись с вами по электронной почте, не дает SO rep points! :) – Zac