Я полагаю, что вам нужен только модуль Delphi в Delphi-версии проекта.
В версии C ++ builder вы просто компилируете и связываете foolib.c, как если бы это был файл C (это так!). В Delphi-версии программы вы создаете .obj с bcc32, используете ctrl и т. Д., Как описано.
Почему вы хотите обернуть это библиотеку C в оболочку Delphi для использования в C ++?
РЕДАКТИРОВАТЬ 1
Вы добавили пояснения в комментарии.
Другой вариант, который следует рассмотреть, - это избежать crtl и реализовать недостающие функции в FooWrapper. Я делаю это таким образом, а не использую crtl, потому что это дает мне больше контроля, и я понимаю, что называется. Например, я не хочу, чтобы какие-либо вызовы printf()
просачивались в мое приложение с графическим интерфейсом или в мою DLL.
Это может быть привлекательным вариантом, если вам не хватает только нескольких функций. Часто самый лучший способ получить их - связать их с msvcrt.dll, который в наши дни является стандартным компонентом системы. Конечно, кажется, что ссылка на msvcrt.dll немного тяжеловата, чтобы получить memset()
, memcpy()
и т. Д.
Сколько недостающих функций при компиляции модуля Delphi без crtl?
РЕДАКТИРОВАТЬ 2
Я добавляю это к ответу, чтобы показать код. Из своей базы кода я предлагаю это:
const
__turboFloat: Longint=0;
(* We don't actually know the type but it is 4 bytes long and initialised to zero. This can be determined
using tdump initcvt.obj. It doesn't actually matter how we define this since it is ultimately not
referred to and is stripped from the executable by the linker. *)
Для ftol
я ссылаюсь на ftol.obj, который, как я полагаю, я извлек из одного из файлов lib в компиляторе BCC55, который я использую.
Я думаю, strncmp
должно быть довольно обычным для реализации на простом Паскале.
sprintf
сложнее в полной общности, но вы можете обнаружить, что он используется только для чего-то тривиального, такого как целое число в строку. В этом случае вы могли бы выдумать код C, чтобы вызвать подпрограмму, выделенную для этого, и реализовать ее тривиально.
Если честно, я думаю, что msvcrt.dll выглядит довольно привлекательно!
РЕДАКТИРОВАТЬ 3
Я говорил с скоро? Вы можете извлечь совершенно исправный sprintf
из user32.dll, который в любом случае загружен почти всеми процессами. Убедитесь, что вы выбрали wsprintfA
, если вам нужна версия ANSI.
РЕДАКТИРОВАТЬ 4
Я замечаю _beginthreadex
. Вы говорите, что это определено в другом модуле Delphi. Чтобы компилятор увидел его, вам нужно переопределить его в AbCtrl.pas и оттуда вызвать реальную версию в AbLzma.pas.
Когда вы включаете .obj в файл .pas Delphi, компилятор должен иметь возможность разрешать все ссылки в файле .obj внутри модуля Delphi, который ссылается на .obj. Вся эта игра рассматривается компилятором, а не компоновщиком.
Иногда вы запутываетесь в узлах с порядком, в котором вы включаете файлы .obj, и решение состоит в том, чтобы использовать предварительные объявления, но это другая история.