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

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

Как написать Dll на Delphi 7 что-бы её можно было использовать .. [D7, WinXP]


Hottabxp ©   (2010-07-12 19:06:00) 

Написал DLL. Она експортирует несколько функций. Когда вызываю функции на masm32 без параметров - все прекрасно работает, но когда у функции есть параметры, программа завершается и вылазит окошко отправки ошибки в MS.
Код:
procedure Msg(mess:string); stdcall;
...
procedure Msg(mess: string);
begin
 ShowMessage(mess);
end;
...
exports
 Msg;
end.


Deltas   (2010-07-15 13:49:00) [1]

Грубо, конечно


Anatoly Podgoretsky   (2010-07-15 13:19:00) [2]


> Deltas ©   (15.07.10 12:39) [6]

А это не слишком нагло с твоей стороны?


Deltas   (2010-07-15 12:39:00) [3]


> Если вы её используете в приложении  на дельфях, то зачем
> StdCall писать? Это же сишное соглашение о вызове и строка
> там - это PChar. Варианта два:
> 1) Убрать StdCall
> 2) Передавать строку именно как PChar.
> И вообще, разобраться зачем нужны соглашения о вызове, чем
> они отличаются и для чего используются.

Вот ты бы сел, да разобрался.


Anatoly Podgoretsky   (2010-07-15 09:57:00) [4]

Hottabxp ©   (12.07.10 19:06)  
Ты можешь вызывать этот код из MASM, но только ты должен делать это правильно, для этого нужно знание устройства длинных строк Дельфи. А может ты вообще с параметрами работаешь неверно. Пока ты не освоишь работы с ДЛЛ на ВЫ следует вообще избегать использование ДЛЛ и также поскольку это передача в другой/из другого языка, то надо использовать только простые типы, иначе всегда найдется Джо, который не в курсе об строках Дельфи, об массивах Дельфи и прочем. Ты посмотри на WinAPI а ведь ими пользуются не только из Дельфи или из MASM и все работает.


Anatoly Podgoretsky   (2010-07-15 09:53:00) [5]

> TStas  (14.07.2010 23:55:03)  [3]

StdCall это не сишное, а стандартное соглашения и оно прекрасно работает в
Дельфи.

И чем же на этапе компиляции известно, что этот код не рабочий?


TStas   (2010-07-14 23:55:00) [6]

Если вы её используете в приложении  на дельфях, то зачем StdCall писать? Это же сишное соглашение о вызове и строка там - это PChar. Варианта два:
1) Убрать StdCall
2) Передавать строку именно как PChar.
И вообще, разобраться зачем нужны соглашения о вызове, чем они отличаются и для чего используются.

А у меня самого вопрос: почему Дельфи вообще схавала этот код? Может, это просто недосмотр разработчиков Дельфей? Ведь уже на этапе компиляции известно, что код неработоспособен?

PS Ошибки в dll, если сами dll так уж критично нужны, очень гадкие, ведь это сторониий для приложения код.


DVM   (2010-07-13 00:21:00) [7]


> Hottabxp ©   (12.07.10 19:06) 

Посмотри как в винапи передаются строки.


Deltas   (2010-07-12 19:11:00) [8]

File -> New -> DLL. Самое главное - комментарий.

{ Important note about DLL memory management: ShareMem must be the
 first unit in your library's USES clause AND your project's (select
 Project-View Source) USES clause if your DLL exports any procedures or
 functions that pass strings as parameters or function results. This
 applies to all strings passed to and from your DLL--even those that
 are nested in records and classes. ShareMem is the interface unit to
 the BORLNDMM.DLL shared memory manager, which must be deployed along
 with your DLL. To avoid using BORLNDMM.DLL, pass string information
 using PChar or ShortString parameters.
}


Наверх

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