Возврат строки из DLL - страница 3

 

lusp

Интересно мнение разработчиков по этому поводу


к разработчика пока рано


я думаю Вам надо искать косяк у себя


//---- СОВЕТНИК
#import "ExpertSample.dll"
string SQLGETstring ( string );
 
void init()
{
 
}
 
void start()
  {
 
   int j,i;
   string  s1 = "12345678900123456789012345";  //
   string sss = "12345678900123456789012345";  //
   s1 = SQLGETstring( sss );
 
   Print ( " s1="+s1+" sss="+sss );
 
}
 
//----
// C++
 
//+------------------------------------------------------------------+
//|                                              Sample DLL for MQL4 |
//|                 Copyright © 2004-2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
//----
#define MT4_EXPFUNC __declspec(dllexport)
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#pragma pack(push,1)
struct RateInfo
  {
   unsigned int      ctm;
   double            open;
   double            low;
   double            high;
   double            close;
   double            vol;
  };
#pragma pack(pop)
 
 
//----
struct MqlStr
  {
   int               len;
   char             *string;
  };
 
 
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
  {
   switch(ul_reason_for_call)
     {
      case DLL_PROCESS_ATTACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
         break;
     }
   return(TRUE);
  }
 
 
 
 MT4_EXPFUNC char* __stdcall SQLGETstring(char *spar)
  {
     
    spar[0]='1'; 
        strcpy(         spar, "ПРОВЕРКА");
        return( spar );
  }



повесил на десяток пар все великолепно работает



2008.05.23 18:34:37 YZ_SAMPLESTR GBPJPY,H1: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:36 YZ_SAMPLESTR EURJPY,M5: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:29 YZ_SAMPLESTR EURJPY,M5: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:29 YZ_SAMPLESTR GBPJPY,H1: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:29 YZ_SAMPLESTR USDJPY,H1: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:28 YZ_SAMPLESTR GBPJPY,H1: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:28 YZ_SAMPLESTR EURJPY,M5: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:21 YZ_SAMPLESTR GBPJPY,H1: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:17 YZ_SAMPLESTR USDCHF,H1: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:16 YZ_SAMPLESTR USDCHF,H1: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:15 YZ_SAMPLESTR GBPJPY,H1: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:14 YZ_SAMPLESTR USDCHF,H1: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:14 YZ_SAMPLESTR GBPJPY,H1: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:13 YZ_SAMPLESTR EURJPY,M5: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:12 YZ_SAMPLESTR EURJPY,M5: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:12 YZ_SAMPLESTR GBPJPY,H1: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:11 YZ_SAMPLESTR EURUSD,H4: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:11 YZ_SAMPLESTR EURUSD,H4: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:10 YZ_SAMPLESTR EURJPY,M5: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:10 YZ_SAMPLESTR EURJPY,M5: s1=ПРОВЕРКА sss=ПРОВЕРКА
2008.05.23 18:34:10 YZ_SAMPLESTR EURJPY,M5: s1=ПРОВЕРКА sss=ПРОВЕРКА



---

 
YuraZ:

//---- СОВЕТНИК
#import "ExpertSample.dll"
string SQLGETstring ( string );
 
void init()
{
 
}
 
void start()
  {
 
   int j,i;
   string  s1 = "12345678900123456789012345";  //
   string sss = "12345678900123456789012345";  //
   s1 = SQLGETstring( sss );
 
   Print ( " s1="+s1+" sss="+sss );
 
}
 

При такой частоте обращений (1 тик - один вызов) к DLL мусор появлятся у меня 1-5 раз в сутки

Я специально на каждом тике делал цикл (30-100) вызовов, чтобы появление мусора проявлялось чаще

Например, чтобы он пявлялся хотя-бы раз в минуту мне приходилось делать 50 вызовов на каждом тике с паузой между вызовами 100 мсек на 8 парах

И еще надо, чтобы на каждом вызове передаваемая в DLL строка меняла свое содержимое.

void start()
  {

   int j,i;
   for (int k=0; k <50; k++) {
      string  s1 = "1234567890012345678901234567";  //
      string sss = "12345678900123456789012345";  //
      sss = StringConcatenate(sss, DoubleToStr(k,0));
  
      s1 = SQLGETstring( sss );

      if (s1 != sss) Print ( " s1="+s1+" sss="+sss );

      Sllep(100)
   }
}

Если вот так попробовать будет что нибудь печатать? Это при условии что функция в DLL просто вернет переданный ей параметр. А то я в СИ ни бум бум :(

 
lusp:
YuraZ:

//---- СОВЕТНИК
#import "ExpertSample.dll"
string SQLGETstring ( string );
 
void init()
{
 
}
 
void start()
  {
 
   int j,i;
   string  s1 = "12345678900123456789012345";  //
   string sss = "12345678900123456789012345";  //
   s1 = SQLGETstring( sss );
 
   Print ( " s1="+s1+" sss="+sss );
 
}
 

При такой частоте обращений (1 тик - один вызов) к DLL мусор появлятся у меня 1-5 раз в сутки

Я специально на каждом тике делал цикл (30-100) вызовов, чтобы появление мусора проявлялось чаще

Например, чтобы он пявлялся хотя-бы раз в минуту мне приходилось делать 50 вызовов на каждом тике с паузой между вызовами 100 мсек на 8 парах

И еще надо, чтобы на каждом вызове передаваемая в DLL строка меняла свое содержимое.

void start()
  {

   int j,i;
   for (int k=0; k <50; k++) {
      string  s1 = "1234567890012345678901234567";  //
      string sss = "12345678900123456789012345";  //
      sss = StringConcatenate(sss, DoubleToStr(k,0));
  
      s1 = SQLGETstring( sss );

      if (s1 != sss) Print ( " s1="+s1+" sss="+sss );

      Sllep(100)
   }
}

если честно мне просто лень переписывать DLL исходник которой я выложил тут для примера


Вы можете взяться за проверку моего примера ? если есть под рукой VC+ 6.0 или 7 - 8

внутри DLL преобразуйте что бы строка к примеру формировалась ну скажет локальное время машины т е она будет меняться

или передавать из эксперта меняющееся значение и на его основании менять возвращаемую строку

но я почему то думаю работать будет железно

---

я не проверял конечно на сутки... можно в цикле помучать эту фитчу

 
lusp:

void start()
  {

   int j,i;
   for (int k=0; k <50; k++) {
      string  s1 = "1234567890012345678901234567";  //
      string sss = "12345678900123456789012345";  //
      // sss = StringConcatenate(sss, DoubleToStr(k,0));
  
      s1 = SQLGETstring( sss );

   //   if (s1 != sss) 
   Print ( " s1="+s1+" sss="+sss );

     //  Sllep(100)
   }
}

Если вот так попробовать будет что нибудь печатать?

нормально... код вот так сделал!





#import "ExpertSample.dll"
string SQLGETstring ( string );
 
/*
void start()
  {
 
   int j,i;
 
for (int k=0; k <50; k++) {
 
   string  s1 = "12345678900123456789012345";  //
   string sss = "12345678900123456789012345";  //
   s1 = SQLGETstring( sss );
 
   Print ( " s1="+s1+" sss="+sss );
}
 
*/
void start()
{  
 
   int j,i;
   for (int k=0; k <50; k++) 
   {
      string  s1 = "1234567890012345678901234567";  //
      string sss = "12345678900123456789012345";  //
       sss = StringConcatenate(sss, DoubleToStr(k,0));
  
      s1 = SQLGETstring( sss );
 
      if (s1 != sss) 
           Print ( " s1="+s1+" sss="+sss );
 
//       Sllep(100)
   }
}



и так пашет

2008.05.23 19:26:12 YZ_SAMPLESTR USDJPY,H1: s1=ПРОВЕРКА sss=1234567890012345678901234533
2008.05.23 19:26:12 YZ_SAMPLESTR USDJPY,H1: s1=ПРОВЕРКА sss=1234567890012345678901234532
2008.05.23 19:26:12 YZ_SAMPLESTR USDJPY,H1: s1=ПРОВЕРКА sss=1234567890012345678901234531
2008.05.23 19:26:12 YZ_SAMPLESTR USDJPY,H1: s1=ПРОВЕРКА sss=1234567890012345678901234530
2008.05.23 19:26:12 YZ_SAMPLESTR USDJPY,H1: s1=ПРОВЕРКА sss=1234567890012345678901234529
2008.05.23 19:26:12 YZ_SAMPLESTR USDJPY,H1: s1=ПРОВЕРКА sss=1234567890012345678901234528
2008.05.23 19:26:12 YZ_SAMPLESTR USDJPY,H1: s1=ПРОВЕРКА sss=1234567890012345678901234527
2008.05.23 19:26:12 YZ_SAMPLESTR USDJPY,H1: s1=ПРОВЕРКА sss=1234567890012345678901234526
2008.05.23 19:26:12 YZ_SAMPLESTR USDJPY,H1: s1=ПРОВЕРКА sss=1234567890012345678901234525


---

 
YuraZ:
lusp:

void start()
  {

   int j,i;
   for (int k=0; k <50; k++) {
      string  s1 = "1234567890012345678901234567";  //
      string sss = "12345678900123456789012345";  //
      // sss = StringConcatenate(sss, DoubleToStr(k,0));
  
      s1 = SQLGETstring( sss );

   //   if (s1 != sss) 
   Print ( " s1="+s1+" sss="+sss );

     //  Sllep(100)
   }
}

Если вот так попробовать будет что нибудь печатать?

нормально... код вот так сделал!

А че нормально. Появися мусорок или нет?

Вы можете взяться за проверку моего примера ? если есть под рукой VC+ 6.0 или 7 - 8

К сожалению, я в СИ что корова в апельсинах. И под рукой его тоже нету

 
lusp:

А че нормально. Появися мусорок или нет?

---

нормально это : нету мусорка

 

К сожалению, я в СИ что корова в апельсинах. И под рукой его тоже нету

могу DLL кинуть прогоните у себя...

зачастую ... от среды обитания "питомцев" - программ, много зависит

 
YuraZ:

К сожалению, я в СИ что корова в апельсинах. И под рукой его тоже нету

могу DLL кинуть прогоните у себя...

зачастую ... от среды обитания "питомцев" - программ, много зависит

ОК, давайте. Адрес в профиле

 
lusp:
зачастую ... от среды обитания "питомцев" - программ, много зависит

ОК, давайте. Адрес в профиле

не т адреса ловите тут

Файлы:
 
YuraZ:
lusp:
зачастую ... от среды обитания "питомцев" - программ, много зависит

ОК, давайте. Адрес в профиле

не т адреса ловите тут

Действительно пашет !

А что такое в вашей функции

spar[0]='1';


для чего это надо ?

Причина обращения: