Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
я вроде писал что-то вроде в h-файле
потом в cpp просто
...
а со строками вообще предпочитал не связываться... на кой они вообще в длл нужны-то??? для красоты что-ли?
к тому же сам борланд рекомендует в случае необходимости использовать char* ну или char[] по-метатрейдеровски
по моему корректно объявлять в билдере как-то так (не помню точно)
extern "C" __declspec(dllexport) int __stdcall GetIntValue();
по моему корректно объявлять в билдере как-то так (не помню точно)
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 *.
Если я понял правильно, то 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
Полностью с Вами согласен. Именно как 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, как начинаются ошибки...
Благодарю, что уделяете мне время.