Кодировка И Кракозябры

 

Товарищи помогите/подскажите. Как решить проблему с кодировкой, функция возвращает вот такие кракозябры

2024.08.27 17:08:24.455 test EURUSD,H1: њN …Ђ)

sвЙЧ+Gдќ)Dіф
Зh§џіљJР"x|ZѕХ7µ.рЊ€_NVm:ЏGЧOЁ?Ь– вњ12ШЙ^…! н*ГЪJМ83ћА. ‰jаRє2ўЯфvVЦ„€J‹ќ59к‹C6fnмS%&О¦‰4„ЛЯ9/ћ]?74PђъЫ@PuШUЈeТoФЫ“ч]ҐTF†x©=р0ОЕfЫАtнУМ
ьZJ|TЏЬД®Л"hYч]5Сm¦›хБjoЄsЮИ КвDЃЂЃМwЛнЪ
O—Fк•
Ѓы`ЈIсBr2ЦЩЭТ ТЁЩ„FлжB:Уф[к>ч%аІр8ЖђЩ‚ЙРџј

 
Desapp Pr:

Товарищи помогите/подскажите. Как решить проблему с кодировкой, функция возвращает вот такие кракозябры

Какая функция?

 
дай угадаю, ты тот самый покупатель который постоянно делает возвраты?
 
Alexander Sevastyanov #:

Какая функция?

Из dll-ки GetLastError()


Mickey Moose #:
дай угадаю, ты тот самый покупатель который постоянно делает возвраты?

Вы о чем/ком ? Какие еще возвраты ? Чего ? )) Плохая гадалка

 
Desapp Pr #:

Из dll-ки GetLastError()



пропахали память и читаете не оттуда..повезло что вообще процесс не прибился

 
Desapp Pr:

Товарищи помогите/подскажите. Как решить проблему с кодировкой, функция возвращает вот такие кракозябры

2024.08.27 17:08:24.455 test EURUSD,H1: њN …Ђ)

sвЙЧ+Gдќ)Dіф
Зh§џіљJР"x|ZѕХ7µ.рЊ€_NVm:ЏGЧOЁ?Ь– вњ12ШЙ^…! н*ГЪJМ83ћА. ‰jаRє2ўЯфvVЦ„€J‹ќ59к‹C6fnмS%&О¦‰4„ЛЯ9/ћ]?74PђъЫ@PuШUЈeТoФЫ“ч]ҐTF†x©=р0ОЕfЫАtнУМ
ьZJ|TЏЬД®Л"hYч]5Сm¦›хБjoЄsЮИ КвDЃЂЃМwЛнЪ
O—Fк•
Ѓы`ЈIсBr2ЦЩЭТ ТЁЩ„FлжB:Уф[к>ч%аІр8ЖђЩ‚ЙРџј

мт4 или мт5

 
Vitaly Muzichenko #:

мт4 или мт5

мт4 И мт5

 

в MT (что 5 что 4), GetLastError() вообще возвращает целое число. То есть даже и не строку которую можно в лоб напечатать

откуда и как взята строка ?

 

Вот внутренный код самой функции GetLastError() 

--------------------------- main.cpp ---------------------------
----------------------------------------------------------------
void WSGetLastError(char *data) {
 if(last_error.length() > 0) {
  strcpy(data, last_error.c_str().c_str());
  strcat(data, "\0");
 }
}
        
MT_EXPFUNC void __stdcall WSGetLastError(const int id, char *data) {
 if (wsProcessor.find(id) == wsProcessor.end()) {
  return;
 }
 wsProcessor[id]->WSGetLastError(data);
}
        
        
------------------------ lib_include.mqh -----------------------
----------------------------------------------------------------
#import "libliblib.dll"
  int WSGetLastError(int id, uchar &data[]);   
#import

static string WS_GetLastError(int _id) {
 uchar _error[8048];
 WSGetLastError( _id, _error );

 return CharArrayToString( _error );
}
        
string GetLastError() {
 return WS_GetLastError(_id);
}


---------------------- test.mq4 OR test.mq5 --------------------
----------------------------------------------------------------
#property strict
#include <lib_include.mqh>

void OnTick() {
  Print(GetLastError());
}

В итоге функция Print(GetLastError()) возвращает вот такие кракозябры:

2024.08.27 17:08:24.455 test EURUSD,H1: њN …Ђ)sвЙЧ+Gдќ)DіфЗh§џіљJР"x|ZѕХ7µ.рЊ€_NVm:ЏGЧOЁ?Ь– вњ12ШЙ^…! н*ГЪJМ83ћА. ‰jаRє2ўЯфvVЦ„€J‹ќ59к‹C6fnмS%&О¦‰4„ЛЯ9/ћ]?74PђъЫ@PuШUЈeТoФЫ“ч]ҐTF†x©=р0ОЕfЫАtнУМьZJ|TЏЬД®Л"hYч]5Сm¦›хБjoЄsЮИ КвDЃЂЃМwЛнЪO—Fк•Ѓы`ЈIсBr2ЦЩЭТ ТЁЩ„FлжB:Уф[к>ч%аІр8ЖђЩ‚ЙРџј

 
Desapp Pr #:

Вот внутренный код самой функции GetLastError() 

В итоге  функция возвращает вот такие кракозябры:

2024.08.27 17:08:24.455 test EURUSD,H1: њN …Ђ)sвЙЧ+Gдќ)DіфЗh§џіљJР"x|ZѕХ7µ.рЊ€_NVm:ЏGЧOЁ?Ь– вњ12ШЙ^…! н*ГЪJМ83ћА. ‰jаRє2ўЯфvVЦ„€J‹ќ59к‹C6fnмS%&О¦‰4„ЛЯ9/ћ]?74PђъЫ@PuШUЈeТoФЫ“ч]ҐTF†x©=р0ОЕfЫАtнУМьZJ|TЏЬД®Л"hYч]5Сm¦›хБjoЄsЮИ КвDЃЂЃМwЛнЪO—Fк•Ѓы`ЈIсBr2ЦЩЭТ ТЁЩ„FлжB:Уф[к>ч%аІр8ЖђЩ‚ЙРџј

бегло глянул:

1. в методе WGetLastError(char *data) добавьте ветку 

void WSGetLastError(char *data) {
  if (last_error.length() > 0) {
    strcpy(data, last_error.c_str().c_str());
    strcat(data, "\0");
  } else {
    data[0]='\0';
  }
}

 и такое-же в экспортируемую функцию

скорее всего вы просто мусор распечатали. То есть то что валялось в массиве. Ошибки нет, а мусор есть

2. (просто рекомендация) при передаче массивов в DLL, сообщайте так-же их размер.

3. по возможности не используйте void. Лучше вернуть признак успех/неуспех или код результата/ошибки 

 
Maxim Kuznetsov #:

бегло глянул:

1. в методе WGetLastError(char *data) добавьте ветку 

 и такое-же в экспортируемую функцию

скорее всего вы просто мусор распечатали. То есть то что валялось в массиве. Ошибки нет, а мусор есть

2. (просто рекомендация) при передаче массивов в DLL, сообщайте так-же их размер.

3. по возможности не используйте void. Лучше вернуть признак успех/неуспех или код результата/ошибки 

Спасибо большое!

1. Да Вы правы, кракозябры появляются только когда нет ошибки.

2. Так и делаю.

3. С чем связано нежелательность использование void ?

В итоге должно быть так, верно ?

--------------------------- main.cpp ---------------------------
----------------------------------------------------------------
void WSGetLastError(char *data) {
 if(last_error.length() > 0) {
  strcpy(data, last_error.c_str().c_str());
  strcat(data, "\0");
 } else { 
  data[0]='\0'; 
 }
}
        
MT_EXPFUNC void __stdcall WSGetLastError(const int id, char *data) {
 if (wsProcessor.find(id) == wsProcessor.end()) {
  return;
 } else { 
  data[0]='\0'; 
 }
 wsProcessor[id]->WSGetLastError(data);
}