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

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

передача параметров из сишной dll [D6]


Игорь_З ©   (2010-01-12 13:30:00) 

Здраствуйте.
Скажите как подсоединить некую функцию в dll (c).
Постоянно выдается ошибка, хотя, подключая ее на с - работает без проблем.

#include
#include

#if BUILDING_DLL
# define LIB_API __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define LIB_API __declspec (dllimport)
#endif /* Not BUILDING_DLL */

x - входной массив
n - число чисел в массиве
Out - результат

Данная функция произвольная, начинка ее может быть любой.
LIB_API void Mean(double* x, unsigned long n, double* Out)
{
double temp;
if (x == NULL)
{
 Out = NULL;
 return;
}
   if( n


KSergey   (2010-01-14 09:37:00) [1]

> Dimka Maslov ©   (13.01.10 14:18) [14]
> Ну хорошо, если мне дадут библиотеку с cdecloм, это можно  пережить.

Еще раз. Речь здесь не про вас.


Anatoly Podgoretsky   (2010-01-13 16:43:00) [2]

> Ega23  (13.01.2010 11:36:11)  [11]

Библиотеку положено давать с описанием, иначе рулетка.


Dimka Maslov   (2010-01-13 14:18:00) [3]


> KSergey ©   (13.01.10 13:36) [13]


Ну хорошо, если мне дадут библиотеку с cdecloм, это можно пережить. А используя встроенный ассемблер можно пережить любой тип вызова функций. Лишь бы реализовано было правильно.


KSergey   (2010-01-13 13:36:00) [4]

> Dimka Maslov ©   (13.01.10 12:39) [12]

Так речь-то не про ваши проекты и не про ваши нужды.

Интересно, автор хоть прочитает?


Dimka Maslov   (2010-01-13 12:39:00) [5]


> Но дадут тебе библиотеку, где как cdecl объявлено - и усё


Поскольку я пишу исключительно для нужд внутреннего потребления, то единственное лицо, которое может дать мне библиотеку - это я сам.


Ega23   (2010-01-13 11:36:00) [6]


> Не знаю что там у него (не читал), но все интерфейсные функции
> всегда объявляю через stdcall и не разу проблем при передаче
> параметров не было...


Это, конечно, похвально. Но дадут тебе библиотеку, где как cdecl объявлено - и усё.


Dimka Maslov   (2010-01-13 11:20:00) [7]


> Это у Архангельского он есть одинаковый и явный.


Не знаю что там у него (не читал), но все интерфейсные функции всегда объявляю через stdcall и не разу проблем при передаче параметров не было...


Игорь Шевченко   (2010-01-13 01:21:00) [8]


> В любом случае лучше явно указывать модификатор вызова и
> обязательно использовать одинаковый, который есть stdcall


Это безусловно, явно всегда лучше указывать, особенно при вызове из приложений на других языках.


Ega23   (2010-01-13 01:21:00) [9]


> который есть stdcall.


Это у Архангельского он естьодинаковый и явный.
Жизнь гораздо многоцветнее...  :)


Dimka Maslov   (2010-01-12 23:34:00) [10]


> Игорь Шевченко ©   (12.01.10 19:16) [6]


В любом случае лучше явно указывать модификатор вызова и обязательно использовать одинаковый, который есть stdcall.


Игорь Шевченко   (2010-01-12 19:16:00) [11]


> по умолчанию объявляется функция с модификатором вызова
> cdecl, а в Delphi - некое подобие fastcall.
> {


если не указано __declspec (dllexport)


Dimka Maslov   (2010-01-12 18:56:00) [12]

#include
#include

#if BUILDING_DLL
# define LIB_API __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define LIB_API __declspec (dllimport)
#endif /* Not BUILDING_DLL */

x - входной массив
n - число чисел в массиве
Out - результат

Данная функция произвольная, начинка ее может быть любой.
LIB_API void Mean(double* x, unsigned long n, double* Out) по умолчанию объявляется функция с модификатором вызова cdecl, а в Delphi - некое подобие fastcall.
{
double temp;
if (x == NULL)
{
Out = NULL; // что и чему мы здесь присваиваем? поскольку Out - адрес переменной, которая выделена в Delphi-программе, то ничего и ничему мы здесь не присваиваем
return;
}
  if( n


Игорь Шевченко   (2010-01-12 18:11:00) [13]


> type
>  TFunc = procedure (FArray:array of double; size:longint;
>  var y:pdouble);


type
 PDouble = ^Double;
 TFunc = procedure (FArray: PDouble; Size: LongInt; Y: PDouble); stdcall;


Ega23   (2010-01-12 18:00:00) [14]

возможно ещё с соглашением о вызовах поиграться надо. типа


type
 TFunc = procedure (FArray:array of double; size:longint; var y:pdouble); cdecl;


KSergey   (2010-01-12 13:49:00) [15]

и еще я бы не рисковал со всякими FArray:array of double
Ну т.е. можно, конечно, изучить матчасть, грамотные люди здесь есть, поправят.
Но чтобы точно работало (и без вывертов) - я бы лучше формальнее сделал, т.е. вот так:

type
TFunc = procedure (FArray:array of double; size:longint; var y:pdouble);

==>

type
TFunc = procedure (FArray:pdouble; size:longint; y:pdouble);

и вызов исправить

HelloWorld ( Addr(v[0]),6,g)

Я не говорю, что это гарантированно лучше, но во всяком случае фотмально правильно, а там уже когда срастется - можно и экспериментировать


KSergey   (2010-01-12 13:45:00) [16]

Явная ошибка вот здесь:

type
TFunc = procedure (FArray:array of double; size:longint; var y: p double);

Надо оставить либо var (тогда просто double), либо pdouble без var. Иначе указатель на указатель получился, а в прототипе просто указатель.


Наверх

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