![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дельфийский интерфейс для Сишных прог [D7, WinXP]
andreil © (2008-06-09 00:11:00)Значит так. Пишу ДЛЛку на Дельфи, в которой присутствуют интерфейсы.
Эта библиотека юзается сторонними программами с участием интерфейсов.
Есть часть исходников этой же ДЛЛки на С++. Вот куски, касающиеся интерфейсов:
class CSteamInterface006 : public CSteamInterface005
{
public:
CSteamInterface006();
~CSteamInterface006();
virtual int FindServersNumServers(unsigned int arg1);
virtual int FindServersIterateServer(int arg1, int arg2, char *szServerAddress, unsigned int uServerAddressChars);
virtual int FindServersGetErrorString();
};
unsigned int _f
{
static CSteamInterface006 SteamInterface006;
return (unsigned int)&SteamInterface006;
}
Вопрос - как это переделать на Дельфи? Просто я в интерфейсах - нуб, а тут еще вопрос - получится ли солвместить Си с Дельфи?
andreil (2008-06-09 17:24:00) [21]
> Сишная библиотека делается COM-сервером, в котором реализован
> интерфейс. Программа на дельфе - клиент
Я вообщето пишу Дельфийскую библиотеку для Сишной проги, а не наоборот ;)
Я просто говорои, что есть часть исходников этой библиотеки на Си
andreil (2008-06-09 17:21:00) [22]Я вообщето не сочиняю клиента Стима, а делаю обертку к эмулятору, что требуют несколько проектов. Протсо без этого надо изучать кучу форматов файлов, а так - все нихтяк :)
И все-бы хорошо, но игры, в которых этот эмуль рабоает, взаимодействуют только через эти интерфейсы. Если бы были просто вызовы, я бы сюда не обращался, тк заголовки всех 156функций уже переведены :)
Но эти интерфейсы.... :( Никак не могу заставить работать и все тут :(
DrPass (2008-06-09 15:16:00) [23]Я ж так понимаю, у него хостовая часть приложения уже "дана свыше" и на Ц++ (собственно, и догадаться несложно, о каком приложении идет речь -Steam). А он, читая прилагаемые к ней Цплюсплюсные хедеры, пытается сочинить клиента на Delphi.
Dimka Maslov (2008-06-09 13:38:00) [24]Есть такая штука, называется COM
Сишная библиотека делается COM-сервером, в котором реализован интерфейс. Программа на дельфе - клиент, обращающийся к серверу и получающий указатель на интерфейс. И всё. Не надо использовать никаких кривых абстрактных классов и прочей мути. Если нет желания прописывать длл в реестр, то можно обойтись и без этого. Тогда сервер должен экспортировать одну нестандартную функцию создания объекта.
jack128_ (2008-06-09 13:16:00) [25]
> На самом деле (сужу по старым версиям, новых версий не знаю)
> в языке С++ нет интерфейсов.
естественно нет. они не нужны так как
> бинарная структура интерфейсов и дельфийских и сишных классов
А вот в дельфи интерфейсы нуны, так как классы не поддерживают множественное наследование..
palva (2008-06-09 11:58:00) [26]На самом деле (сужу по старым версиям, новых версий не знаю) в языке С++ нет интерфейсов. Слово interface является синонимом слова class, а интерфейсом называется класс, который не содержит полей, а только виртуальные абстрактные методы. Чтобы класс вел себя как интерфейс требуется писать дополнительный код.
jack128_ (2008-06-09 11:25:00) [27]
> > public CSteamInterface005
>
>
> описание в студию
>
Зуб даю, что примерно так начинается:
class CSteamInterface005 : public CSteamInterface004:-))
> Что-то я не увидел тут никаких интерфейсов.
насколько я понимаю бинарная структура интерфейсов и дельфийских и сишных классов - совпадает. главное чтоб первые три элемента VMT базового предка классов имели ссылки на AddRef/Release/QueryInterface
Игорь Шевченко (2008-06-09 11:10:00) [28]
> public CSteamInterface005
описание в студию
Loginov Dmitry (2008-06-09 10:47:00) [29]> но мне на инглиш форуме сказали, что там именно интерфейс
> и в этом коде:
> unsigned int _f
> {
> static CSteamInterface006 SteamInterface006;
> return (unsigned int)&SteamInterface006;
> }
> идет передача Сишной программе интерфейса.
Тут передается просто ссылка на созданный (причем static) объект. Причем здесь интерфейсы?
Переписать - не проблема (наверно:). Один в один переписывай весь код на дельфи.
В ЕХЕ тебе нужно создать аналогичный класс, только абстрактный. Например:
TSteamInterface006 = class(TSteamInterface005)
public
function FindServersNumServers(arg1: Cardinal): Integer; virtual; stdcall; abstract;
function FindServersIterateServer(arg1, arg2: Integer; szServerAddress: PChar; uServerAddressChars: Integer): Integer; virtual; stdcall; abstract;
function FindServersGetErrorString(): Integer; virtual; stdcall; abstract;
end;
Далее объявляешь переменную
var
ASteamInterface: TSteamInterface006;
Получаешь ссылку на объект:
Cardinal(ASteamInterface) := _f();
И работаешь с объектом через абстрактные методы. В рельности же будут вызваны функции из DLL.
Не уверен на 100%, что удасться совместить код С++ и Дельфи, однако предполагаю, что получится. Виртуальные и абстрактные методы во всех языках, поддерживающих интерфейсы, реализованы одинаково (таблица виртуальных методов имеет везде одинаковое смещение и т.д.) (это имхо, т.к. все - по памяти).
Однако я не понял, нужно ли тебе совмещать С++ и Дельфи, или же просто переписать все на Дельфи?
andreil (2008-06-09 10:10:00) [30]Я в Си нуб, о чем и сказал, но мне на инглиш форуме сказали, что там именно интерфейс и в этом коде:
unsigned int _f
{
static CSteamInterface006 SteamInterface006;
return (unsigned int)&SteamInterface006;
}
идет передача Сишной программе интерфейса.
Если делать в Дельфи CSteamInterface006 классом, то нифига не работает, поскольку компилер показывает, что процедуры этого класса не собраны в ДДЛку. + если все-таки оставить его, то при вызове этого интерфейса вылазит ошибка чтения памяти :( в том районе, где ничего нету
Если же сделать именно интерфейс, то ошибка памяти есть, но в районе, где находится неизвестный код (судя по всему - основной программы)
DrPass (2008-06-09 01:22:00) [31]Что-то я не увидел тут никаких интерфейсов. Обычный сишный класс, разве что слово Interface в названии присутствует