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

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

Сишный класс в качестве параметра функции


Spirit111 ©   (2006-08-28 02:26:00) 

Вопросик таков:

у меня есть серверный АПИ на си, суть которого в том, что есть сишный класс:

struct CServer
 {
  virtual int         __stdcall Version(void);
 }

(Там есть и другие методы, но для простоты будем считать, что метод только один)

Далее я должен написать dll, в которой в одной из экспортируемых функций я должен принять этот сишный класс в качестве параметра:

int __declspec(dllexport) __stdcall Startup(CServer *server)

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

Вопрос: можно создать dll на дельфи, которая будет принимать такой сишный класс в качестве параметра и нормально с ним потом работать (вызывать его методы)? Если можно, то помогите перевести описание класса на Дельфи.

Так будет правильно?

type
 TCServer = class
    function Version: integer; stdcall; virtual;
 end;

Или не так?


Spirit111   (2006-09-10 00:29:00) [1]

Большое спасибо всем ответившим. Буду копать дальше.

P.S. Сорри за поздний ответ - был в отпуске :)


Сергей М.   (2006-08-28 14:38:00) [2]


> Spirit111   (28.08.06 02:26)
>
> Вопросик таков:


Вердикт: СОМ/OLE


Ketmar   (2006-08-28 14:32:00) [3]

> [12] guav ©   (28.08.06 14:06)
неа. --C++ -- это просто C. %-)


Ketmar   (2006-08-28 14:32:00) [4]

> [13] Ketmar ©   (28.08.06 14:32)
ой. натупил, извиняюсь. %-)


guav   (2006-08-28 14:06:00) [5]

> -- C++

А не лучше ли С - 1?


Dimka Maslov   (2006-08-28 14:01:00) [6]

Когда я объединял код, написанный на Сях, с кодом в Delphi, то сделал библиотеку с сишным кодом COM-сервером. Таким способом удалось воспользоваться классами.


Ketmar   (2006-08-28 12:12:00) [7]

> [8] jack128 ©   (28.08.06 12:03)
так давно это было -- C++.


han_malign   (2006-08-28 12:04:00) [8]


> ну и не уверен я, что struct наследовать можно.

- можно, одно но - стоит, скажем, в MSVC в строке компилятора добавить /TC (Compile as C Code) - и методы/деклараторы видимости в struct компилироваться не будут, как впрочем и любые другие классы... :))


jack128   (2006-08-28 12:03:00) [9]

Ketmar ©   (28.08.06 11:49) [7]
ну и не уверен я

а зря.


Ketmar   (2006-08-28 11:49:00) [10]

> [6] jack128 ©   (28.08.06 11:40)
ну и не уверен я, что struct наследовать можно. %-)


jack128   (2006-08-28 11:40:00) [11]

jack128 ©   (28.08.06 11:29) [5]
Но сейчас проверить не на чем.

нашел на чем проверить - я прав :-)


jack128   (2006-08-28 11:29:00) [12]

evvcom ©   (28.08.06 9:32) [2]
Насколько я помню, в Си классы описываются не с помощью struct, а с помощью class. struct - это структура или в терминах Object Pascal - запись


AFAIR - struct от class отличается только тем, что в class поля и методы по умолчанию private, а в struct - public
Ketmar ©   (28.08.06 10:22) [4]
вроде и в структ такое есть.  Но сейчас проверить не на чем.


Ketmar   (2006-08-28 10:22:00) [13]

> [2] evvcom ©   (28.08.06 09:32)
афаир, class -- это struct с областями видимости. %-)


MBo   (2006-08-28 09:50:00) [14]

http://rvelthuis.de/articles/articles-cppobjs.html


evvcom   (2006-08-28 09:32:00) [15]

Насколько я помню, в Си классы описываются не с помощью struct, а с помощью class. struct - это структура или в терминах Object Pascal - запись. Если в твоем АПИ только структуры, то вполне можешь обойтись и Дельфями, если же все-таки есть классы, то тогда или обертка на Си, как предлагал Ketmar, или извращаться на ассемблере, поскольку в MSVC объектные методы вызываются иначе, чем в дельфях. Во всяком случае, я ковырял как-то MFC. Ссылка на объект передается в ecx, остальное, по-моему, в eax, edx, дальше через стек. Никакие директивы типа stdcall, cdecl, safecall не помогут.


Ketmar   (2006-08-28 04:04:00) [16]

зависит от компилятора. надёжней всего сделать на сях "обёртку", которая превратит "классовость" в нормальную "процедурность", и работать уже с ней.


Наверх

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