![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
передача параметров из сишной 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. Иначе указатель на указатель получился, а в прототипе просто указатель.