Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
Spirit111   (2006-08-28 02:26) [0]

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

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

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;

Или не так?


 
Ketmar ©   (2006-08-28 04:04) [1]

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


 
evvcom ©   (2006-08-28 09:32) [2]

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


 
MBo ©   (2006-08-28 09:50) [3]

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


 
Ketmar ©   (2006-08-28 10:22) [4]

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


 
jack128 ©   (2006-08-28 11:29) [5]

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]
вроде и в структ такое есть.  Но сейчас проверить не на чем.


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

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

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


 
Ketmar ©   (2006-08-28 11:49) [7]

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


 
jack128 ©   (2006-08-28 12:03) [8]

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

а зря.


 
han_malign ©   (2006-08-28 12:04) [9]


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

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


 
Ketmar ©   (2006-08-28 12:12) [10]

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


 
Dimka Maslov ©   (2006-08-28 14:01) [11]

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


 
guav ©   (2006-08-28 14:06) [12]

> -- C++

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


 
Ketmar ©   (2006-08-28 14:32) [13]

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


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

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


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


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


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


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

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

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.036 c
8-1143237291
Тфьу
2006-03-25 00:54
2006.10.22
Как скопировать треугольную область?


2-1159766533
inew
2006-10-02 09:22
2006.10.22
Перенос JPEG или BMP в MS Word


9-1137780186
Cerberus
2006-01-20 21:03
2006.10.22
Ссылочка была.


15-1159389262
ArtemESC
2006-09-28 00:34
2006.10.22
wmv2avi


3-1156145027
Mishenka
2006-08-21 11:23
2006.10.22
Как запросу динамически добавить вычисляемое поле?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский