Имя пользователя:
Пароль:
 

Название темы: Pascal exe и С++ dll
Показать сообщение отдельно

редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


Server
Курите документацию. Как вы выделяете память не влияет на то, какой *_cast применять. Это зависит сугубо от типов, которые подвергаются преобразованию. Для преобразования void* в int* достаточно static_cast. dynamic_cast нужен при преобразованиях от указателя на предок класса к указателю на наследника.

Цитата:
Экстрадиция Pascal из объявления функции - как мертвому припарки. Изменить exe код не представляется возможным. Там нет stdcall.
Слишком кратко, а поэтому непонятно.

Почему нельзя менять exe? Оптимально изменить именно его, чтобы использовалась конвенция stdcall, потому что про неё все (delphi и VC) всё прекрасно знают, так как она используется при вызове winapi. Это де-факто стандарт. Те, кто не используют эту конвенцию для вызова "инородных" функций - сами себе злобные буратины.

Я немножко погуглил и выяснил, что дельфи по умолчанию использует register конвенцию. То есть распихивает первые 3 параметры в регистры (eax, ecx, edx), остальные параметры кладутся на стек согласно паскалевской конвенции. Насколько мне известно VS ничего подобного не знает.

Поэтому, если exe менять нельзя для использования более адекватной конвенции, следует написать заглушку, которая будет принимать параметры согласно дельфёвым соглашениям (register), а вызывать функцию согласно согласно соглашениям, которые понимает VS (__cdecl, __stdcall, __pascal, или __fastcall). Если есть желание вставить такую заглушку непосредственно в dll, то придётся писать её на ассемблере.

Я, чтобы не мучиться, создал бы dll-заглушку на дельфи. В которой была бы одна функция PlugExec, которая принимает параметры в дельфёвой конвенции register, а вызывает сишный плагин уже с помощью stdcall. Соответственно в сишном плагине заменил бы соглашение для функции PlugExec с PASCAL на __stdcall.

upd
Повторюсь, резюмируя всё выше сказанное.

Либо используйте в exe и dll одно соглашение о вызовах, которое понимае и VS и delphi. К ним относятся: pascal/__pascal, cdecl/__cdecl, stdcall/__stdcall. Перед слышем дано название соглашеия в дельфе, после - в VS.

Либо (если exe менять нельзя) пишите заглушку, которая будет принимать парметры в дельфёвом соглашении register, а выдавать их в соглашении, понятном VS (сейчас у вас, судя по коду, сишная функция использует паскалевское соглашение).

Подробнее про различные соглашения о вызовах можно почитать в интернете. Погуглив на тему "delphi calling conventions".

-------
http://ivank.ru


Отправлено: 00:54, 06-09-2006 | #4

Название темы: Pascal exe и С++ dll