Код для даблов работает потому, что типы совпадают. В С (не С++) есть стандартный способ передачи адресов с непонятными типами - приведение к бестиповому указателю (void*), затем расшифровка (когда Вы обращаетесь к элементу массива обычно уже известно, что это за тип переменной).
В МКЛ не думаю, что так получится. Как вариант: передайте через файл - в длл просто запишите и верните код ошибки - по результату, если все ок - читаем.
Удачи.
В МКЛ не думаю, что так получится. Как вариант: передайте через файл - в длл просто запишите и верните код ошибки - по результату, если все ок - читаем.
Удачи.
Спасибо, Владислав.
не хочется через файл всё таки...вся длл задумана что б уйти от этого..буду думать как обмануть..
Но ответ ,я так понял,всё таки в несоответствии типов,правильно? Т.е грешить на мой COM не стоит..?
не хочется через файл всё таки...вся длл задумана что б уйти от этого..буду думать как обмануть..
Но ответ ,я так понял,всё таки в несоответствии типов,правильно? Т.е грешить на мой COM не стоит..?
Спасибо, Владислав.
не хочется через файл всё таки...вся длл задумана что б уйти от этого..буду думать как обмануть..
Но ответ ,я так понял,всё таки в несоответствии типов,правильно? Т.е грешить на мой COM не стоит..?
не хочется через файл всё таки...вся длл задумана что б уйти от этого..буду думать как обмануть..
Но ответ ,я так понял,всё таки в несоответствии типов,правильно? Т.е грешить на мой COM не стоит..?
Совершенно верно - типы.
Кстати, в примере описан тип MqlStr.
//---- struct MqlStr { int len; char *string; };
лучше переписать так :
//---- typedef struct { int len; char *string; } MqlStr; //----
Можно попробовать как string[] вернуть его.
То есть в мкл описание
int GetStr(string& a[]);
а в С++
int GetStr(MqlStr* а);
Есть шанс получить нужный элемент массива. Значение len в данном случае - количество символов в строке.
Успехов.
Спасибо большое Владислав,я как раз разглядывал эту структуру.Буду искать.
void __stdcall OrderSet(String Simbol,MqlStr array[])
{
CoInitializeEx(NULL, COINIT_MULTITHREADED);
Interfase1=CoMyServer::Create();
SAFEARRAY* sarray=SafeArrayCreateVector(VT_BSTR,0,12);
Interfase1.get_ORDERS(WideString((Simbol).c_str()).c_bstr(),&sarray);
BSTR HUGEP* farray;
SafeArrayAccessData(sarray,(void HUGEP**)&farray);
MqlStr newMqlStr;
newMqlStr.len=20;
for(long i=0;i<12;i++,farray++)
{
newMqlStr.string=ConvertBSTRToString(*farray);
array[i]=newMqlStr;
}
SafeArrayUnaccessData(sarray);
SafeArrayDestroy(sarray);
}
Вот так получается....передаёт чётко весь массив стрингов ,как и было задумано...
Владислав,отдельное спасибо Вам...
{
CoInitializeEx(NULL, COINIT_MULTITHREADED);
Interfase1=CoMyServer::Create();
SAFEARRAY* sarray=SafeArrayCreateVector(VT_BSTR,0,12);
Interfase1.get_ORDERS(WideString((Simbol).c_str()).c_bstr(),&sarray);
BSTR HUGEP* farray;
SafeArrayAccessData(sarray,(void HUGEP**)&farray);
MqlStr newMqlStr;
newMqlStr.len=20;
for(long i=0;i<12;i++,farray++)
{
newMqlStr.string=ConvertBSTRToString(*farray);
array[i]=newMqlStr;
}
SafeArrayUnaccessData(sarray);
SafeArrayDestroy(sarray);
}
Вот так получается....передаёт чётко весь массив стрингов ,как и было задумано...
Владислав,отдельное спасибо Вам...
Вот так получается....передаёт чётко весь массив стрингов ,как и было задумано...
Вот и замечательно.
Владислав,отдельное спасибо Вам...
Та нема за що..... В смысле не за что.
Усехов.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
void __stdcall OrderSet(String Simbol,AnsiString array[])
{
CoInitializeEx(NULL, COINIT_MULTITHREADED);
Interfase1=CoMyServer::Create();
SAFEARRAY* sarray=SafeArrayCreateVector(VT_BSTR,0,12);
Interfase1.get_ORDERS(WideString((Simbol).c_str()).c_bstr(),&sarray);//вызов массива из COM -exe
BSTR HUGEP* farray;
SafeArrayAccessData(sarray,(void HUGEP**)&farray);
for(long i=0;i<12;i++,farray++)
{
BSTR temp=*farray ; //заполнение...
array[i]=AnsiString(temp).c_str();
}
SafeArrayUnaccessData(sarray);
SafeArrayDestroy(sarray);
}
//-----------------------------------------------
Дело в том ,что строки передаются в советник..но странным образом..
в массиве,например string array[] в советник данные приходят так .
array[0] данные из массив[1]
array[1] данные из массив[3]
array[2] данные из массив[5]
array[3] данные из массив[7]
и так далее до array[5]
массив размерностью 12.... в общем происходит смещение при заполнении массива..
я так думаю здесь несоответствие типов string из MQL и С++
прошу сказать куда посмотреть или помочь с преобразованием типов..
.......И ещё ..такой же код для double array[]; работает безупречно...