string из DLL вопрос по функциям.

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

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[]; работает безупречно...
 
Код для даблов работает потому, что типы совпадают. В С (не С++) есть стандартный способ передачи адресов с непонятными типами - приведение к бестиповому указателю (void*), затем расшифровка (когда Вы обращаетесь к элементу массива обычно уже известно, что это за тип переменной).
В МКЛ не думаю, что так получится. Как вариант: передайте через файл - в длл просто запишите и верните код ошибки - по результату, если все ок - читаем.

Удачи.
 
Спасибо, Владислав.
не хочется через файл всё таки...вся длл задумана что б уйти от этого..буду думать как обмануть..
Но ответ ,я так понял,всё таки в несоответствии типов,правильно? Т.е грешить на мой 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);

}

Вот так получается....передаёт чётко весь массив стрингов ,как и было задумано...

Владислав,отдельное спасибо Вам...
 

Вот так получается....передаёт чётко весь массив стрингов ,как и было задумано...

Вот и замечательно.


Владислав,отдельное спасибо Вам...


Та нема за що..... В смысле не за что.

Усехов.
Причина обращения: