Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дельфийский интерфейс для Сишных прог [D7, WinXP]


Страницы:   1 2

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 в названии присутствует


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо