Помогите разобраться в проблеме импорта функции из dll - страница 2

 

я вроде писал что-то вроде в h-файле


extern __declspec(dllexport) int __stdcall GetIntValue(int);

потом в cpp просто


int __stdcall GetIntValue(int)
 
Возможно, поможет ключевое слово extern.
 
alsu >>:

...


а со строками вообще предпочитал не связываться... на кой они вообще в длл нужны-то??? для красоты что-ли? 

к тому же сам борланд рекомендует в случае необходимости использовать char* ну или char[] по-метатрейдеровски

 

по моему корректно объявлять в билдере как-то так (не помню точно)

extern "C" __declspec(dllexport) int __stdcall GetIntValue();

 
GarF1eld >>:

по моему корректно объявлять в билдере как-то так (не помню точно)

extern "C" __declspec(dllexport) int __stdcall GetIntValue();

во! точно!

 

Большое спасибо за подсказки! С этим примером получилось после объявления extern "C" int __declspec(dllexport) __stdcall GetIntValue().

Попробовал с функциями double и string, тоже получилось. Решил применить полученные от Вас знания уже для практической задачи. Но увы... не получилось, к сожалению.

Если можно, помогите, пожалуйста ещё разок.

Есть такие файлы в проекте Билдера для создания DLL: UHsvd.h, Usvd.cpp и другие.

В файле UHsvd.h есть функция, которая должна потом экспортироваться:

bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneeded,
int additionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt);

В файле Usvd.cpp та же функция, которая должна потом экспортироваться:

bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneeded,
int additionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt)

{

........

}

Начинаю строить в Билдере DLL в таком варианте, то всё "строится", всё получается, ошибок нет.

Если начинаю делать изменения в UHsvd.h, Usvd.cpp типа

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a,

.....), то появляются ошибки от 2 до 19 при различных вариантах, т.е. это объявление я делал то в заголовочном файле, то в cpp... хотя как я понимаю это должно быть в заголовочном файле (тогда всего 2 ошибки):

[BCC32 Error] Usvd.cpp(128): E2356 Type mismatch in redeclaration of '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap::real_2d_array &)'
[BCC32 Error] UHsvd.h(111): E2344 Earlier declaration of '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap::real_2d_array &)'

Как я понимаю, какое то несоответствие... Но до конца чего то не врублюсь... :-(

Очень надеюсь на Вашу помощь и поддержку...

 

boysn писал(а) >> {...}

Если можно, помогите, пожалуйста ещё разок.

Есть такие файлы в проекте Билдера для создания DLL: UHsvd.h, Usvd.cpp и другие.

В файле UHsvd.h есть функция, которая должна потом экспортироваться:

bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneeded,
int additionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt); {...}

Если я понял правильно, то ap::real_1d_array- это класс. А ap::real_1d_array & это reference на объект класса.

Но уважаемый, в качестве параметров в Dll можно передавать только double myData[],

что в функциях будет выглядеть как double *.

 
jartmailru писал(а) >>

Если я понял правильно, то ap::real_1d_array- это класс. А ap::real_1d_array & это reference на объект класса.

Но уважаемый, в качестве параметров в Dll можно передавать только double myData[],

что в функциях будет выглядеть как double *.

Полностью с Вами согласен. Именно как double я и буду объявлять его в MQL при импорте. Но на данный момент у меня не получается создать саму DLL в С++ Builder 2009. При построении выдаются ошибки. Если я не использую объявление

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ....), то компиляция библиотеки в Билдере проходит успешно, без проблем. Вот теперь не знаю, как правильно сделать объявление на экспорт функции в самом проекте Билдера :-(, чтобы получилась

рабочая DLL с возможностью экспорта функции rmatrixsvd

 
boysn >>:

Полностью с Вами согласен. Именно как double я и буду объявлять его в MQL при импорте. Но на данный момент у меня не получается создать саму DLL в С++ Builder 2009. При построении выдаются ошибки. Если я не использую объявление

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ....), то компиляция библиотеки в Билдере проходит успешно, без проблем. Вот теперь не знаю, как правильно сделать объявление на экспорт функции в самом проекте Билдера :-(, чтобы получилась

рабочая DLL с возможностью экспорта функции rmatrixsvd

Бр-р-р. Как-то Вы со мной странно согласны.

.

Вообще-то речь идет о том, чтобы написать "adapter" или "bridge".

"Adapter" с той точки зрения, что параметры экспортируемой функции

должны быть приведены в соотвествие с теми параметрами, которые может передать метатрейдер,

т.е. нужна дополнительная функция, которая передаст вызов куда нужно.

А "Bridge" - с той точки зрения, что необязательно, чтобы функция,

которую Вы объявляете, делала работу сама.

И наоборот - необязательно, что вызывать нужно ту функцию, которая делает работу.

.

Т.е. нужно разделить интерфейс и имплементацию, т.е. имплементация может строится на классах

и функциях, о которых которые снаружи Dll никто никогда не узнает.

.

Но давайте на примере.

.

Объявить Вы должны примерно такую функцию:

extern "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(double * in1, double * in2, double * out)

// разумеется, сюда вы еще передадите кол-во строк и столбцов

{

// перевести входные параметры в ap::real_2d_array

ap::real_2d_array a1 = convertPDoubleToReal2DArray(in1);

ap::real_2d_array a2 = ...;

.

// посчитать

ap::real_2d_array a3;

rmatrixsvd(a1, a2, a3);

.

// перевести результат a3 в out

convertReal2DArrayToPDouble(a3, out);

.

return;
}

.

При этом - конечно же - функция rmatrixsvd

не объявляется ни extern "C", ни __stdcall, ни __declspec и проч.

Потому что она входит во внутреннюю, скрытую реализацию.

 

Извиняюсь, не совсем понял, к сожалению...

С сайта http://alglib.sources.ru/ я скачал нужную мне реализацию (код) на С++. Если Вас не затруднит, посмотрите, пожалуйста прикрепленный архив 100 Кб. Этот алгоритм имеет множество вспомогательных функций, общее количество строк кода что то порядка 3000 строк... по-моему так

на сайте написано, т.е. очень много и переводить его на MQL достаточно сложно... При этом нужно попутно разобраться в самом алгоритме, чтобы корректно сделать перенос. Для меня это сложновато на данный момент. Поэтому мне бы хотелось на С++ Builder 2009 при помощи этого готового кода сделать dll и обращаться к нужной мне функции rmatrixsvd(...), вызывая ее из dll. Вот во всём этом у меня и получился ступор... где и как правильно объявлять... С помощью этого кода, не меняя там ни строчки, строится DLL, без ошибок. Но стоит мне внести туда extern "C" bool __declspec(dllexport) __stdcall, как начинаются ошибки...

Благодарю, что уделяете мне время.

Файлы:
svdy1e.cpp.zip  94 kb
Причина обращения: